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
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.