quote:
Je hoofdprogramma steekt toch niets uit zolang er geen puls is geweest??
Je hoofdprogramma laat je constant scannen op een vlagje. Dat vlagje is in het begin laag. Je stelt je registers in dat er een interrupt moet plaatsvinden bij een PORTB change event. De eerste keer dat de interrupt plaatsvindt activeer je timer0 of timer1 (afhankelijk van de nauwkeurigheid die je wil bereiken). Dit activeren komt neer op de timer resetten, hij blijft constant lopen. Bij de volgende interrupt lees je de timer uit én zet je je vlagje op hoog. (Vergeet niet op het einde van je interruptroutine een bitje te resetten in je INTCON reg, anders gaat hij niet meer interrupten). Vervolgens ziet je hoofdprogramma dat het vlagje hoog staat, deze voert dan een deel uit een if routine uit en gaat de lengte van de uitgangspuls berekenen. Vervolgens wordt de uitgang hoog gemaakt, je stelt een delay in van de berekende tijd en daarna maak je je uitgang weer laag. Ten slotte zet je je vlagje trug op laag en tada het systeem is weer "geladen" voor de volgende puls.
Concrete registers:
OPTION --> Timer0 source + prescaler instellen
INTCON --> Global, peripheral en PortB interrupts inschakelen
Edit:
Kies je prescaler van Timer0 zodanig dat hij niet overloopt, want als hij overloopt ga je natuurlijk verkeerde waardes interpreteren. Dan lees je bv 32 uit, terwijl het eigenlijk 287 had moeten zijn.
Je zou eventueel ook een interrupt op Timer0 kunnen zetten en dan softwarematig een postscaler programmeren, want een tijd van 1 sec is best lang!!
Edit2:
Een andere manier om de tijd te meten is een blokgolf insturen met een periode van 100µs, op de Timer1 counter ingang. Zo kan je tot 6.5 seconden meten.
[Bericht gewijzigd door High-Voltage op 19 augustus 2008 16:47:16]