Hallo Leute, da ich mich hinsichtlich Mikrocontroller in der Einarbeitungsphase befinde, beschäftge ich mich auch mit den Interrupts. Ich programmiere mit C und benutze den PIC12F1822. Ich möchte den Timer2 zählen lassen und wenn dieser den Wert vom PR2-Register erreicht, soll der Timer2-Flag auf 1 gesetzt werden und somit ein Interrupt auslösen und in dieser soll eine Variable inkrementiert werden. Ich habe die erforderlichen Registerbits gesetzt (GIE, TMR2IE und PEIE). Das Problem ist nicht das Flag, dieses wird gesetzt, sondern eher, dass die Interrupt-Funktion nicht aufgerufen wird. Könnte mir jemand da behilflich sein? Mein Code lautet so: unsinged char counter = 0; void main(void) { PR2 = 150; // Referenzwert INTCONbits.GIE = 1; // Global Interrupt Enable bit INTCONbits.PEIE = 1; // Peripheral Interrupt Enable bit (wegen Timer2) PIE1bits.TMR2IE = 1; // TMR2 to PR2 match Interrupt Enable bit T2CON = 0b00000001; // Bit 7 ist nicht implementiert // Bit 6-3 Postscaler (1:1) // Bit 2 Timer2On Bit (Off) // Bit 1-0 Prescaler (4) T2CONbits.TMR2ON = 1; // Timer2 On } void interrupt isr(void) { counter++; // inkrementieren PIR1bits.TMR2IF = 0; // Flag auf null setzen } Gruß Thomas P.S.: Es ist egal, ob die Aufgabe Sinn macht, Ziel ist es nur, dass ich die Interrupt-Funktion erfolgreich programmiere.
Die notwendigen Bits sind richtig gesetzt. Vermutlich steht die ISR (interrutp service routine) nicht an der richtigen Adresse. Ich verwende für die kleinen PICs den CC5E Compiler. Da muß folgendes vor die ISR:
1 | #pragma origin 0x0004
|
Hier würde das Assemblerlisting weiterhelfen. Weiters sollte in die ISR noch das Pollen auf die Interruptquelle rein. Wichtig bei mehreren Quellen, daß man nur das Flag des Auslösers rücksetzt.
Welchen C Compiler Verwendest du ? Verschiedene IDEs verlangen unterschiedliche Funktionsnamen der ISR. Dies ist wichtig, da der Compiler wissen muss/sollte dass es sich um die ISR hält und nicht um eine Funktion die für den Compiler selbst ähnlich klingt. Falls du den MikroC Compiler verwendest dann musst du deine ISR wie folgt schreiben:
1 | void interrupt(void) |
2 | {
|
3 | counter++; |
4 | PIR1bits.TMR2IF = 0; |
5 | }
|
Achte mal genauer auf den namen der Funktion, was dein Compiler genau erwartet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.