Forum: Mikrocontroller und Digitale Elektronik PIC Interrupt blockieren Hauptprogramm


von Marc R. (Gast)


Lesenswert?

Hallo zusammen!

Ich habe mich in den letzten paar Wochen das erste Mal mit einem PIC 
Mikrocontroller auseinander gesetzt. Mit Atmel uC habe ich jedoch schon 
viel Erfahrung.

Ich habe nun folgendes Problem:

Wenn ich die Interrupts eingeschaltet habe, wird das Hauptprogramm 
blockiert.
Schalte ich nur das Timer1 Interrupt aus funktioniert alles einwandfrei.
Woran kann das liegen?

Hier meine Timer1 Initialisierung:
1
  T1CKPS1 = 0;          //T1CKSPS1:0 set prescaler to 1:1      
2
  T1CKPS0 = 0;  
3
  T1OSCEN = 1;          //Enable the oscillator
4
  TMR1CS = 0;            //Work with the internal clock
5
  TMR1ON = 1;            //Timer 1 off
6
  TMR1H = 244;            //Clear TMR1 Register
7
  TMR1L = 72;  
8
  TMR1IE = 1;
9
  TMR1IF = 0;
Hier meine Interrupt Initialisierung:
1
  GIE = 1;          //enable every interrupt 
2
  INTE = 1;          //enable the INT pin interrupt
3
  INTEDG = 1;          //go to interrupt by rising edge
4
  PEIE = 1;          //enable all peripheral interrupts
Und hier noch meine Interruptroutine:
1
interrupt IR(void)            //Interruptroutine for INT input
2
{
3
  if(INTF)              //If the interrupt input is high 
4
  {
5
    RB5 ^= 1;            //Action in interrupt
6
    INTF = 0;            //Clear the interrupt flag
7
  }
8
  
9
  if(TMR1IF == 1)            //Timer1 Overflow
10
  {
11
    RB5 ^= 1;            //Action in interrupt
12
    TMR1IF = 0;            //Clear the interrupt flag
13
    TMR1H = 244;
14
    TMR1L = 72;
15
  }
16
}

Vielen Dank schon im voraus!
Marc

von bingo (Gast)


Lesenswert?

welcher PIC? Wie werden (falls bei diesem PIC notwendig) die Register 
gesichert?

Bitte GANZEN Code einschl. CONFIG posten!

von Lehrmann M. (ubimbo)


Lesenswert?

bingo schrieb:
> welcher PIC? Wie werden (falls bei diesem PIC notwendig) die Register
> gesichert?

Wir sind ja hier nicht bei Assembler. Nachdem ich keine globalen 
Variablen sehe, gehe ich davon aus, dass der Code atomar ist. Das hat ja 
auch nichts mit dem Problem zu tun.

Marc Räz schrieb:
> RB5 ^= 1;            //Action in interrupt

Was soll das denn sein?

Du solltest uns noch verraten welchen PIC du verwendest ... ansonsten 
kann ich schlecht in ein Datenblatt schauen.

von Dieter K. (dikomoe)


Angehängte Dateien:

Lesenswert?

Hallo, Marc,
ich kann zwar nur Assembler, aber meist ist die Ursache für das 
Nicht-Funktionieren eines Interrupts, dass w-Register und 
STATUS-Register während des Interrupts nicht gerettet werden. Anhängend 
eine Assembler-Sequenz, die das Problem vermeidet. Hoffentlich hilft Dir 
das weiter.

von bingo (Gast)


Lesenswert?

> ich kann zwar nur Assembler, aber meist ist die Ursache für das
> Nicht-Funktionieren eines Interrupts, dass w-Register und
> STATUS-Register während des Interrupts nicht gerettet werden

Die neueren PICs machen das automatisch.

von PIC N. (eigo) Benutzerseite


Lesenswert?

Ich würde sagen da ist einiges im Argen, mal lesen:
http://pic-projekte.de/pic_c.html#intpic

von Lehrmann M. (ubimbo)


Lesenswert?

Dieter Kohtz schrieb:
> Hallo, Marc,
> ich kann zwar nur Assembler, aber meist ist die Ursache für das
> Nicht-Funktionieren eines Interrupts, dass w-Register und
> STATUS-Register während des Interrupts nicht gerettet werden.

Das macht schon alles der Compiler bei einer Hochsprach (wie z.B. in 
diesem Fall C).

Dieter Kohtz schrieb:
> Anhängend
> eine Assembler-Sequenz, die das Problem vermeidet. Hoffentlich hilft Dir
> das weiter.

Siehe oben - das macht alles der Compiler. Ganz schnell vergessen. Und 
kein Inlineassembler!

Nicolas M. schrieb:
> Ich würde sagen da ist einiges im Argen, mal lesen:
> http://pic-projekte.de/pic_c.html#intpic

Das ist der falsche Compiler. Im Tutorial wird der C18 von Microchip 
verwendet. Das hier sieht mir allerdings eher nach dem von HiTech aus. 
Nur dort sind die Bits so direkt adressierbar. Bei C18 od. MikroC ist es 
immer nach dem Muster REGISTERbits.BIT   -   egal das tut hier nichts zu 
Sache. Man müsste einfach wissen, welcher PIC verwendet wird, dann ist 
das eine Sache von 2 Minuten im Datenblatt nachzulesen.

von Marc R. (Gast)


Lesenswert?

Ich verwende den PIC 16F877A und programmiere im MPLAB mit HiTech.
Das mit den nicht agesicherten Registern sollte meines Erachtens keinen 
Einfluss haben.

von Marc R. (Gast)


Lesenswert?

Sorry hab noch was vergessen. Die Zeile:
1
RB5 ^= 1;
 macht nichts anderes als Bit 5 von Port B invertieren.
Das funktioniert auch.

von tom (Gast)


Lesenswert?

Vielleicht ein dritter interrupt der noch aktiv ist und in der ISR nicht 
zurückgesetzt wird.
Am besten mal den gesamten Code posten.

von Marc R. (Gast)


Angehängte Dateien:

Lesenswert?

Hier meine Codes.
Ich hoffe ihr könnt mir helfen.

von Lehrmann M. (ubimbo)


Lesenswert?

Marc Räz schrieb:
> Ich verwende den PIC 16F877A und programmiere im MPLAB mit HiTech.

Okay

Marc Räz schrieb:
> Das mit den nicht agesicherten Registern sollte meines Erachtens keinen
> Einfluss haben.

Ganz richtig.

Marc Räz schrieb:
> RB5 ^= 1; macht nichts anderes als Bit 5 von Port B invertieren.
> Das funktioniert auch.

Sorry ich hab ein bisschen zu weit gedacht =)

tom schrieb:
> Vielleicht ein dritter interrupt der noch aktiv ist und in der ISR nicht
> zurückgesetzt wird.
> Am besten mal den gesamten Code posten.

Da ist was wahres dran. Also mal ganzen Code.


Ich hab jetzt beim groben durchsehen keine gravierenden Fehler entdeckt. 
Versuch mal GIE=0; sobald du in die ISR reinkommst, unabhänging von der 
Interruptquelle. Zu Ende wieder anschalten.  Könnte es an deiner 
externen Beschaltung liegen?

von Marc R. (Gast)


Lesenswert?

Vielen Dank für eure Hilfe!
Ich habe den Fehler jetzt gefunden. Ich habe tatsächlich ein drittes 
Interruptflag gehabt. Nämlich das von Timer 0.
Danke!
Marc

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.