Forum: Mikrocontroller und Digitale Elektronik Interrupt-PIC12F1822


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Scotty (Gast)


Lesenswert?

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.

von Stefan P. (poge-st)


Lesenswert?

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
Noch kein Account? Hier anmelden.