mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interruptproblem mit PIC


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... timebase heißt natürlich xy!

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: oksana (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke oksana,

das wars - jetzt geht's. :-)
Problem war TMR2IF = 0 in der if-Schleife.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, das gehört nicht in den If-Zweig. Allerdings toggelt dann dein
Pin alle 64ms 11mal kurz hintereinander.

Steffen

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso toggelt er?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist schon richtig. Ich meinte dein erstes Posting. So wie die ISR
jetzt ist ist das OK.

Steffen

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann hab ich das auch richtig verstanden. Vielen Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.