Forum: Mikrocontroller und Digitale Elektronik WinAVR und Interruptvektoren


von Ulrich (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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

von Stefan W. (wswbln)


Lesenswert?

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 ;-)

von Karl heinz B. (kbucheg)


Lesenswert?

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

von Ulrich P. (uprinz)


Lesenswert?

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
Noch kein Account? Hier anmelden.