Interruptproblem mit PIC

Gast #90308
Lesenswert?

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 #90310
Lesenswert?

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 #90311
Lesenswert?

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 #90315
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren