Hi!
Ich habe ein problem mit AVRStudio-WinAVR.
Ich möchte einen Timer2-Overflow Interrupt haben um eine
Interruptroutine Zyklisch zu starten.
Ich habe definiert:
ISR(TIMER2_COMP_vect)
{
Timer++; /* Performance counter for this module */
disk_timerproc(); /* Drive timer procedure of low level disk I/O
module */
}
Wenn ich mir nun das Listfile ansehe:
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 d2 01 jmp 0x3a4 <__init>
4: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
8: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
c: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
10: 0c 94 dd 13 jmp 0x27ba <__vector_4>
14: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
18: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
1c: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
20: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
24: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
28: 0c 94 0a 14 jmp 0x2814 <__vector_10>
2c: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
30: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
34: 0c 94 72 22 jmp 0x44e4 <__vector_13>
38: 0c 94 99 22 jmp 0x4532 <__vector_14>
3c: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
40: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
44: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
48: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
4c: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
50: 0c 94 ed 01 jmp 0x3da <__bad_interrupt>
Dann steht der passende Vector_4 an Adresse 0x10.
Schaue ich jetzt ins Datenblatt dann steht da an Vector-Adresse
0x10: TIM1_COMPB ; Timer1 CompareB Handler
Den erwünschten TIM2_OVF ; Timer2 Overflow Handler
findet man an Position 0x0A
Den richtigen Prozessor habe ich jedenfalls im Projekt eingetragen
(ATmega32) und im Makefile wird dieser auch gesetzt.
Was mache ich falsch?
Danke für jede Hilfe
Ulrich
1.: Wenn Du einen Handler für den Timer 2 Compare-Interrupt schreibst,
wird auch der Compare-Vektor (Adresse 0x08) und nicht der
Overflow-Interrupt (Adresse 0x0A) initialisiert.
2.: Die Zählung in dem Listing oben ist in Bytes, die eigentliche
Adresse ist aber eine Wort-Adresse. Das was oben steht muss man noch
durch 2 dividieren, um die "echte" Adresse im (wortorganisierten)
Speicher zu bekommen. und 0x10 / 2 = 0x08. Und genau das ist die Adresse
des von Dir verwendeten Timer2 Compare-Vektors.
Sorry, war ein Verschreiber!
Natürlich will ich einen TIM2_COMP haben, also einen compare match
Interrupt.
Jep, und das Fazit ist, dass ich wohl zu dusselig bin den Timer korrekt
zu starten, denn im Simulator funktioniert es, im Chip nicht.
ASSR = 0b00000000; // Timer0: 1Hz async operation (OC0)
OCR0 = 255-1;
TCCR0 = (1<<WGM01)|(1<<CS02)|(1<<CS00);
OCR2 = 71-1; // Timer2: 100Hz interval (OC2)
TCCR2 = (1<<COM20)|(1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20); //
Normal mode, TOP=OCR2 and prescaler to 1024
TIMSK = (1<<OCIE2)|(1<<OCIE0); // Enable TC2.oc, TC0.oc interrupt
sei();
Ist da noch was falsch oder ist der Chip einfach nur hinne?
Gruß, Ulrich
> ASSR = 0b00000000; // Timer0: 1Hz async operation (OC0)
Was ist das? Timer 0 kann nicht asynchron betrieben werden und hat mit
dem ASSR nix zu tun.
> Normal mode, TOP=OCR2 and prescaler to 1024
Auch das ist nicht richtig! Das ist nicht "normal mode" sondern CTC!
Wenn die Kommentare und der Code schon nicht zusammenpassen, dann wirds
es ziemlich unübersichtlich.
Was sagt den der Ausgangspin OC2 dazu? Der müsste doch bei den
Einstellungen bei jedem Compare toggeln...
BTW: Eine Sache, die hier im Forum immer wieder auftritt und sich
anscheinend immer noch nicht rumgesprochen hat: Mit irgendwelchen
zusammenhanglosen Codeschnipseln kann man keine vernünftige Fehlersuche
betreiben. In den meisten Fällen liegt der eigentliche Fehler nämlich in
den Codeabschnitten, die nicht gepostet wurden. Deshalb gehört zu so
einer Frage immer der komplette Code (als Attachment!), damit man auch
mal was nachvollziehen kann.
Der Code ist der vom FatFs, aber angepasst von einem mega64 auf einen
mega32.
Daher sind die Kommentare etwas gemischt. ASSR ist auf 0 weil ich kein
32kHz Quarz drann habe und daher keinen async kann, egal ob Timer0 das
in meinem Fall kann oder nicht.
OC2 toggelt nicht, daher liegt der Fehler schon in der Initialisierung
oder im Chip. Den ganzen Code posten, halte ich in diesem Fall für zu
viel, da der OC2 ja schon nicht otggelt. Abgesehen davon funktioniert
der Code im Simulator.
Aso, ja ich prüfe OC2 nicht mit einer LED, sondern mit einem Scope und
einem 10k Pullup am Pin.
Eine weitere Sache ist aber, dass ich einen Pin an einem Schalter eines
MMC-Slots habe. Dieser kommt aber, obwohl der Chip mit 3.3V betrieben
wird über den internen Pullup nur auf nicht ganz 2V. Daher vermute ich
nun doch eher einen Defekt des mega32. Werde morgen einen neuen bekommen
und dann weiter testen.
Ich habe hier eine andere Entwicklung liegen und auf der funktio nierte
die Timer einstellung einwandfrei, ich hab es also schon mehrfach hin
bekommen.
Danke für Deine Tips!
Wenn Dir / Euch noch was einfällt immer posten. Ich lese am WE mit, kann
aber nicht an die Schaltung.
Gruß,Ulrich
Ulrich wrote:
> Der Code ist der vom FatFs, aber angepasst von einem mega64 auf einen> mega32.> Daher sind die Kommentare etwas gemischt.
...mal was grundsätzliches:
Wenn man an einem bestehenden Sourcecode was verändert, passt man
natürlich auch GLEICHZEITIG die Kommentare an - nicht? Andernfalls hat
man die hier erlebten Probleme, dass zuerst ein dritter
Verständnisprobleme hat und nach 2 Wochen spätestens auch man selber.
Zur Sache kann ich nur soviel (beruhigendes) beitragen:
Interrupts funktionieren mit WinAVR ganz prima. Du müsstest also
eigentlich nicht die Arbeit des Compilers überprüfen, sondern mehr so
die Source-Seite ;-)
> Den ganzen Code posten, halte ich in diesem Fall für zu> viel, da der OC2 ja schon nicht otggelt.
Dann schmeiss aus dem Code alles raus, was nicht zum OCR2
gehört, stell sicher dass du immer noch das gleiche Problem
hast und poste den abgespeckten Code.
Danke an alle Poster!
Ich entschuldige mich noch mal für den unvollständig kommentierten Code.
Kann es selber nicht leiden, wenn Code schlecht dokumentiert ist, aber
dieser Code ist für einen mega64 geschrieben, wird momentan auf einem
mega32 getestet und soll letztendlich auf einem mega128 laufen. Daher
ist es etwas chaotisch.
Bislang hatte ich auf den diversen ATs keine Probleme die Timer und
alles andere ans Laufen zu bringen, aber hier bin ich verzweifelt.
Aufgrund der geschilderten und einiger anderer Merekwürdigkeiten gehe
ich abere davon aus, das der mega32 das Zeitliche gesegnet hat, er ist
definitiv defekt.
Also danke an alle, das Beispiel funktioniert im Simulator und ich denke
auch in einem neuen mega32.
Gruß, Ulrich