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.
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.
>Wie kann ich rausbekommen, warum das Ding den Reset-Vektor anspringt?
Datenblatt lesen und Code ausmisten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.