Interruptproblem mit PIC

Gast #90308
Hallo,

ich habe den Timer2 beim PIC16F873 eingeschaltet und mit Vor-/und
Nachteiler jeweils 1:16 versehen. Bei einem Takt von 4MHz müßte also
alle 64ms (PR2=250) die Interruptroutine durchlaufen werden. Dies habe
ich kontrolliert, indem ich in der Interruptroutine jeweils einen Port
umschalte und dies mit dem Oszit nachmesse. Hier komme ich auf 64ms.

Nun möchte ich aber nicht alles 64ms sondern alle 640ms einen Interrupt
haben. Deshalb habe ich eine globale Variable xy definiert und in der
Interruptroutine zähle ich diese hoch und wenn diese 10 ist, wird die
eigentliche Aktion ausgeführt. Leider funktioniert dies nicht so ganz.
Im Debugmodus von MPLAP / ICD2 mit CC5X passt es einwandfrei aber im
Realtime-Modus messe ich am Pin alle 64ms ein umschalten - unabhängig
von meiner if-Abfrage.

Was könnte das sein? Wer kann mir helfen?



===Codeausschnitt:===

char xy;

#pragma origin 4
interrupt InterruptRoutine(void)
{
  int_save_registers

  if (TMR2IF)
  {
   xy++;
    if(xy >= 10)
   {
    PORTA.0 ^= 0x01;
    TMR2IF = 0;
          aktion=1;
    timebase=0;
   }
  }

  int_restore_registers
}
Gast
Dein Programmcode ist eigentlich in Ordnung. Könnte es evtl. sein, dass
während des Interupts die Bank-Select Bits nicht richtig gesetzt sind?

Ich kenne den CC5X nicht aber der setzt die Bits doch nicht automatisch
zurück oder wird das durch int_save_registers mit erledigt?

Wenn das Ganze mit dem ICD2 im Debugmodus richtig läuft, dann sollte es
eigentlich auch Real-Time funktionieren.

Steffen
Gast
Hallo Stafan, versuch mal so

char xy;

#pragma origin 4
interrupt InterruptRoutine(void)
{
  int_save_registers

  if (TMR2IE && TMR2IF)
  {
   xy++;
    if(xy >= 10)
   {
    PORTA.0 ^= 0x01;
    aktion=1;
    xy=0;
   }
   TMR2IF = 0;
  }

  int_restore_registers
}
Gast
Beim Rücksprung aus der ISR werden die Interupts wieder freigegeben. Da
ja das Interuptflag nur zurückgesetzt wird, wenn xy=10 springt er
sofort wieder die ISR an. Das Ganze dann 10 mal.

Steffen
Gast
Da ich jetzt doch das Interruptflag immer zurücksetze und nicht nur wenn
xy=10 dürfte ich doch dieses Problem nicht haben, oder verstehe ich da
was falsch?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.