PIC Interrupt blockieren Hauptprogramm

Gast #2291904
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
#2292011
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.
#2292048
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.
Angehängte Dateien:
Gast #2292146
> 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.
#2292189
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.
#2292344
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?
Gast #2292413
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.