Leuk dat iemand de moeite heeft genomen om de code eens door te lopen
K ben trouwens begonnen in c (icm de hitech picc compiler).
De pwm routine was toen interrupt driven (dmv een timer), en de serieele ontvangst ook. Met die c code was 6 bits pwm @ 75 Hz het max haalbare iirc.
Daarna de pwm routine omgeschreven naar asm zonder gebruik te maken van interrupts (combo van asm en c dus), maar dat haalde niet zoveel uit als ik verwacht had.
Toen ben ik maar from scratch begonnen in asm. Scheelde wel iets, maar nog niet optimaal (k wilde perse 8 bits pwm krijgen

).
Maar op een gegeven moment viel met het volgende te binnen:
movf count, W
addwf led, W
rlf PORTA, F
Die routine zorgde er iig voor dat het afhandelen van de pwm snel genoeg ging om 8 bits pwm te krijgen (niet helemaal waar trouwens, als led 0xff is, wordt de carry flag niet geset... de intensiteit 0xff wordt dus niet vertaald naar 100% van de tijd vol aan). Als iemand hier een oplossing voor heeft die geen invloed heeft op de timing, post maar
Wat betreft de serieele routine:
Het afhandelen van de serieele routine duurt nou ~25 cycles; de pwm afhandeling neemt er 256 in beslag. Echt veel winst is hier niet te behalen dus (paar Hz meer of minder is niet echt interessant). De serieele routine om de x aantal keren laten draaien heeft dus niet echt veel invloed op de snelheid. Door de serieele routine te draaien op iedere pwm routine is het iig mogelijk om een continue datastroom @ 115200 kbps te verwerken zonder dat er een buffer overrun komt.
K ben wel van plan om dit enigzins te herschrijven, zodat er een "beter" protocol is.
Wat betreft de buffer van de leddata: er wordt idd niet gecontroleerd of er meer dan 64 bytes gestuurd worden. Het indirecte adres kan dus idd naar geheugen wijzen waar eigenlijk niet geschreven moet worden. Een check inbouwen zal ik wel doen als ik het nieuwe protocol maak (als iemand nog suggesties heeft mbt tot een efficient protocol... post hier maar ff

). In de praktijk blijkt echter dat het overschrijven geen invloed heeft op het draaien van het programma... als ik willekeurig meer dan 64 bytes data stuur naar de pic (geen 0xff), dan krijg je wel troep op je leds te zien, maar zodra je 0xff stuurt en daarna weer data, dan laat ie het weer goed zien

waarom dat is weet ik niet (k neem aan dat het indirecte adres gefoldt wordt over de memorymap), maargoed
wbt meer leds aansturen:
k denk niet dat het met de huidige hardware mogelijk is om veel meer leds aan te sturen. Overstappen op een atmel is misschien een optie, je wint dan in snelheid (10/16 mips tov 5 mips) waardoor je gewoon meer leds aan kunt sturen... ~2-3 keer zoveel leds als nu het geval is.
Qua code-efficientie houdt t denk ik hier wel op, je zal dus echt naar iets anders moeten overstappen. Een fpga of een spld met sram zou een optie kunnen zijn, heb je relatief hoge snelheden ( >100 mHz). Maar dat is minder toegankelijk dan een mcu voor mensen die zelf zoiets willen nabouwen.
[
Voor 16% gewijzigd door
Lone Gunman op 09-02-2004 16:10
]
Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.