Forum: Mikrocontroller und Digitale Elektronik pollin rfid rennt ständig in main()


von Michael R. (michi42)


Lesenswert?

Hi Gemeinde,

ich habe mit dem Board immer wieder Probleme.
Ich habe sowohl mit der Original-Firmware als auch mit
http://www.mikrocontroller.net/wikifiles/9/9e/Em4100_rfid.zip
sporadisch das Problem, das der Tiny im main() landet.

Das äußert sich in wirren Zeichen auf dem Display und tritt gehäuft auf, 
wenn keine Karte auf der Spule liegt, oder diese bewegt wird.
Ist der Schwingkreis ohne Tag, kommen an Decoder-Chip wirre 
Flankenwechsel an. Liegt eine Karte drauf, gibt es brauchbare Datenbits, 
aber teilweise mit erheblichem Jitter.


Den Display-ansteuercode hab ich schon gem. Datenblatt erneuert, dadurch 
passt jetzt auch der gesammte Code ins Flash, aber auch wenn ich den 
komplett aus der polling-Loop in main rausnehme (Die ja eigentlich nie 
verlassen werden kann) lande ich sporadisch im Main.

Versorungsspannung und Reset sind sauber. Der Chip macht auch nicht 
wirklich einen echten Reset, da der Portzustand im DDRB danach noch 
richtig ist. (Wäre bei einem echten Reset alles input)

Wie kann ich rausbekommen, warum das Ding den Reset-Vektor anspringt?

Irgendwas übergelaufen?
Irgend ein exit in der libc?
Interrupt-nesting?
Wo kann ich einen Break einbauen um die statische initialisierung der 
globalen Variablen zu sehen? (pre-Main())

WD & Brownout sind übrigens aus.

von Michael R. (michi42)


Lesenswert?

hm, ich hab noch eine ISR für bad-interrupt-vector spendiert. das war's 
auch nicht.
Vom Verhalten sieht es so aus, als ob der chip ohne karte praktisch nur 
noch die isr bedient, und für die main-loop parktisch kaum noch was 
überbleibt.

von holger (Gast)


Lesenswert?

>Wie kann ich rausbekommen, warum das Ding den Reset-Vektor anspringt?

Datenblatt lesen und Code ausmisten.

von Michael R. (michi42)


Lesenswert?

Der Code ist nun ausgemistet, die isr ist leer.
1
ISR (INT1_vect)
2
{}
3
4
5
ISR(BADISR_vect)
6
{
7
  // blink forever
8
  cli();
9
  uint8_t j=0;
10
  DDRB = 0xff;
11
  do{
12
    PORTB |= (1<<PB7); 
13
    _delay_ms(100);
14
    PORTB &= ~(1<<PB7);
15
    _delay_ms(100);
16
  }while(1);
17
}
Erlaube ich interrupts, stürzt der controller ab und kommt irgendwann 
scheinbar überall vorbei auch beim reset-vektor und scheint völlig 
willkürlich irgendwas auszuführen. (SP kaputt?)

Lasse ich das sei() vor der main loop weg, läuft die main-loop 
stundenlang richtig. Von daher halte ich ein elektrisches Problem für 
eher unwahrscheinlich.

Gibt es ein Limit bezüglich der Anzahl Interrupts pro Sekunde?
Lt. gcc Tutorials sind die interrupts nicht nesting, und einfacher kann 
man die isr wohl nicht mehr machen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.