Hallo Leute,
ich versuche an meinem PICLF1509 die Zeit eines Flankenwechsels zu
messen. Ich nutze den RA2 Pin als externen interrupt und lege dort ein
Signal mit 2 Hz an. Um das Signal zu messen nutze ich die TMR0 ISR. Der
TMR0 interrupt wird jede ms ausgelöst und zählt einen counter hoch.
Bekomme ich einen Flanken wechsel wird der counter ausgelesen. Eine LED
soll nur eingeschaltet werden, wenn eine bestimmtes Zeitintervall
eingehalten wird. Hier mal ein Code auschnitt
1 | void interrupt INTERRUPT_InterruptManager (void)
|
2 | {
|
3 | // interrupt handler
|
4 |
|
5 | // external interrupt enabled // external interrupt Flag
|
6 | if(INTCONbits.INTE == 1 && INTCONbits.INTF == 1)
|
7 | {
|
8 | INT_ISR();
|
9 | }
|
10 | else if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
|
11 | {
|
12 | TMR0_ISR();
|
13 | }
|
14 | }
|
1 | void TMR0_ISR(void)
|
2 | {
|
3 |
|
4 | // Clear the TMR0 interrupt flag
|
5 | INTCONbits.TMR0IF = 0;
|
6 |
|
7 | TMR0 = timer0ReloadVal;
|
8 |
|
9 | TMR0_Overflow++;
|
10 | }
|
1 | void INT_ISR(void)
|
2 | {
|
3 | EXT_INT_InterruptFlagClear();
|
4 |
|
5 | if(!TMR0_Init) {
|
6 | // start counting from 0
|
7 | TMR0_Reload();
|
8 | // reset TMR0
|
9 | TMR0_Overflow=0; // counts up every ms
|
10 | // Change edge trigger
|
11 | INT_Trigger();
|
12 | // Initialisation complete
|
13 | TMR0_Init = 1;
|
14 | }
|
15 | else {
|
16 | // Change edge trigger
|
17 | INT_Trigger();
|
18 | // Callback function gets called everytime this ISR executes
|
19 | INT_CallBack();
|
20 |
|
21 | }
|
22 |
|
23 | }
|
1 | void INT_CallBack(void)
|
2 | {
|
3 | if(TMR0_Overflow>230) {
|
4 | LATC^=1; // Turns LED on/off
|
5 | }
|
6 | // reset TMR0
|
7 | TMR0_Overflow=0;
|
8 | // start counting from 0
|
9 | TMR0_Reload();
|
10 | }
|
Das komische ist, dass wenn ich bei der if Abfrage in der INT_CallBack
Funktion Werte abfrage, die kleiner als 229 sind, die LED mit einer
Frequenz von 2 Hz und darüber mit einer Frequenz von 1 Hz blinkt. Das
ergibt aber irgendwie keinen Sinn, weil danach ja der TMR0 resetted wird
und von vorne Zählt. Es müsste doch so sein, dass die LED entweder mit 2
Hz blinkt oder sie die ganze Zeit aus wäre. Kann sich jemand erklären
warum das so ist?!
Grüße
Seto