mikrocontroller.net

Forum: Compiler & IDEs Interrupt Problem EM4095 RFID Reader


Autor: Thomas J. (thomas_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin gerade dabei einige Tests mit einem RFID-Modul durchzuführen.
Die Schaltung und der Quellcode sind ähnlich wie beim RFID Tür Modul 
(http://www.mikrocontroller.net/articles/RFID_T%C3%BCrmodul), nur 
verwende ich einen Atmega88 und mein DEMOD_OUT liegt am INT1-Pin.

Initialisieren des INT1 Interrupts
void Rfid::Init(void)
{
    #if (HWVERSION == 1)
    SHDDDR |= 1<<SHDPINX;
    #endif
    
    TCCR0B = 1<<CS01 | 1<<CS00; //Timer/Counter0 prescaler 64
    EICRA |= 1<<ISC10; //Any logical change on INT1 generates an interrupt request
    EIMSK |= 1<<INT1; //External interrupt request 1 enable (demod_out from RFID chip)
}

Interrupt INT1:
ISR(INT1_vect)
{
  static uint8_t old_cnt;
  static uint16_t sync;
  static uint8_t insync;
  static uint8_t bitcount;    
  
  if ((uint8_t)(TCNT0 - old_cnt) > MANCHESTER_MIDDLE)
  {
    old_cnt = TCNT0;
    
    sync <<= 1;
    
    bitcount++;
  
    uart.PutC(bitcount);
    
    if (bit_is_clear(PIND, PD2))
      sync |= 1;
    
    if (insync)
    {
      if ((bitcount % 8) == 0)
        rfid.InjectByte(sync);
      
      if (bitcount == 64)
      {
        insync = 0;
      }
    }
    else
      if ((sync & 0x3FF) == 0x1FF)
      {
        insync = 1;
        bitcount = 9;
        rfid.TagStart();
        rfid.InjectByte(sync);
      }
  }
}

Mein Problem ist, dass das hinaufzählen der bitcount variable nicht 
richtig funktioniert. So werden die aktuellen Werte im Terminal 
angezeigt:

001 002 003 004 005 006 192 002 003 004 005 006 007 008 009 010 011 012 
013 014 015 001 002 003 004 005 006 007 008 009 010 011 012 013 014 192 
002

Was stimmt hier mit meiner ISR nicht?

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht dein Controller vielleicht einen Reset?

Autor: Thomas J. (thomas_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Glaub ich nicht! Wenn ich zB. über einen Port ein LED einschalte, bleibt 
dieses auch eingeschaltet und am Terminal ist auch keine Verzögerung zu 
sehen oder würde man einen Reset zeitlich gar nicht merken???

Autor: Thomas J. (thomas_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, du hattes recht! Mein µC macht wirklich einen Reset! Aber wieso???

Autor: Thomas J. (thomas_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst!!! Es war im Programm eine ISR definiert, die durch einen 
falschen Handler abgefangen wurde...

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sollte öfter Lotto spielen.

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.