@ Arco: Ah ja het zou kunnen dat ik dat hi/low gezien heb in een 18F. Ik gebruik onderandere ook de 18F4520. Ik gooi de interupt uit om te voorkomen dat tijdens het afwerken van de interupt er nog een interupt komt. Omdat dat zooi geeft. Ik heb er inderdaad niet bij stil gestaan dat eigenlijk dus betekend dat ik potentieel interupts mis. Ik had bedacht dat het dus gewoon een kwestie is van de Interupthandler kort genoeg houden... maar dat heeft eigenlijk het zelfde effect als de interupt gewoon aan laten staan. Betekend dat dan ook dat ik de flag en preset helemaal in het begin van de interupthandler moet doen?
Haha ja met 50000 keer per seconde tikt dat aan. Ik zit op 10 keer per seconde. Dus dat valt nogal mee. Maar ik snap wat je bedoeld. Het is intussen ook uit de code
@hadv: Hm, dat is vreemd die set ik namelijk niet (ook niet elders) en de interupt komt wel gewoon... in de datasheet staat het volgende:
bit 6 PEIE: Peripheral Interrupt Enable bit
1 = Enables all active peripheral interrup
Peripheral vertaal ik grofweg naar omgeving. Ik nam aan dat dat betekende interupts van IO, of iets dergelijks, zegmaar de "externe" interupts... Wat bedoel je met een SFR? Ik begrijp uit de rest van je verhaal dat er voor (sommige) chips een appart bestand is waar dingen als GIE gedefinieerd wordt en verwezen wordt naar het eigenlijke adres?
Wat betreft autosaving en interupts kwijtraken, zie het verhaal hierboven aan arco .
@henri62: De stack die ik zelf maak valt opzich wel mee. 1, hooguit 2, niveau's 2,3 als ik de interupt mee tel. Dus dat is niet zo spannend, ik heb wel heel veel meer gedaan (denk 6,7) met daar nog een hserout in. Al denk ik wel dat dat in een 18F was. Maar als het toch een stackoverflow is reset de hele chip... dan zou ik verwachten dat alle code (dus ook de hserout met de initialisatie) opnieuw uitgevoerd wordt, niet alleen de eread.
De berekeningen heb ik uit de interupt gehaald. het enige is nu dat servo verhaal. Dat kan ik inderdaad ook met een bitje in de interupt aangeven en dan in de hoofdlus uitvoeren. Maar ALS die situatie optreed wil ik dat de stroom vrij vlot uitgeschakeld wordt. En met de serin in de hoofdlus kan dat rustig een seconde zijn voor de hoofdlus. En wat ik zei, als die code aangeroepen wordt intereseert timing me geen fluit meer. Als die accu maar los gaat.
Ik moet eerlijk zeggen dat ik de rest van je verhaal niet helemaal volg. Begrijp ik goed dat ik eigenlijk zeg "op die en die tijd was de stroom zoveel" zodat ik dus ook met de tijd kan rekenen?
De ISR (neem even aan dat dat de interupthandler is ?) doet nu eigenlijk het volgende:
Seconde teller verhogen (equivalent van bitje hoog zetten wat een functie in de hoofdlus aftrapt)
analoge signalen binnen halen
de ruwe waarde daarvan vergelijken met een getal (Dus alleen maar twee dword's met elkaar vergelijken, geen lopend gemiddelde meer, geen omrekeninen naar floats).
Preset goed zetten
flag resetten
terug naar hoofdlus
Ik zal eens gaan zoeken naar counting semaphores. Nooit van gehoord maar ik ga even googlen .
Voor iedereen die de datashit niet kon vinden, bij deze
http://ww1.microchip.com/downloads/en/devicedoc/40001574c.pdf
EDIT: Ik ben intussen nog stukje voor stukje aan het kopieren naar een project met wat eeprom lezen/schrijven. Kijken wanneer het er mee ophoudt. Ik heb de context save/restore er uit gehaald. En onderaan vervangen door een "return" maar dan voert hij de interupt maar 1 keer uit. Hij komt wel terug in de hoofdlus. Maar de interupt komt maar 1 keer. Weet je zeker dat die er niet in hoeven. Ik heb in de datasheet even gezocht en daar staat wel dat het automatisch gebeurt (saven en restoren). Moet ik soms iets anders dan return er onder zetten..?
PS: stack is 16 levels. Dus ik kom nieteens in de buurt (levels die de hserout bijv gebruikt even niet meegerekend)