mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit attiny2313: Timer löst keinen Interrupt aus


Autor: Chris O. (lupin_iii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir jemand helfen und erklären, wieso ein 2313 keinen Interrupt 
auslöst wenn ich den folgenden Code ausführe? Der Tiny soll im 
sleep-Modus bleiben bis er vom Timer0 ca. alle 10ms geweckt wird, etwas 
ausgeben, einlesen, berechnen (für den nächsten Durchgang) und dann 
wieder schlafen. Im gepunkteten Teil wird an Timer- und 
Interrupt-Registern nichts geändert, nur PIN/PORT[ABD]. Ähnlichen Code 
habe ich auf einem mega8 laufen, mit dem Unterschied, dass dort Timer2 
verwendet wird.



.include "tn2313def.inc"

.cseg
.org 0x0000
  rjmp  Init

.org OC0Aaddr
  ; wecken
  rjmp  TIMER0_COMP_vect

Init:
  ldi   temp1,   low(RAMEND)  ; Set stackptr to ram end
  out   SPL,     temp1

  ldi   temp1,   (1<<OCIE0A)
  out   TIMSK,   temp1

  ldi   temp1,   (1<<WGM01) ; CTC-Mode
  out   TCCR0A,  temp1

  ldi   temp1,   (1<<CS02) | (1<<CS00) ; /1024 (CS02|CS00)
  out   TCCR0B,  temp1

  ldi   temp1,   0x4e  ; toggle alle 10ms @ 8MHz =~ 80000 / 1024 
(Prescaler)
  out   OCR0A,   temp1

  ldi   temp1,   (1<<SE) ; Sleep-Mode
  out   MCUCR,   temp1

  sei

Loop:
  sleep
  ...
  ...
  ...
  ...
  rjmp Loop



TIMER0_COMP_vect:
  reti

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran erkennt du denn, dass es nicht funktioniert?

Clock-Fuses (ab Werk 1MHz)?

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Timer kann den Controller nicht aufwecken, das geht nur per Hardware 
(INT0, INT1 etc).
Das geht nur mit einem Echtzeit-Controller, ATtiny88 und ähnlichen.

Grüße,
Peter

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Roth wrote:

> Der Timer kann den Controller nicht aufwecken

Im idle mode kann er, nur in power down oder standby nicht.
Und hier ist soweit erkennbar der idle mode aktiv.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Datenblatt:

'Only an External Reset, a Watchdog Reset, a Brown-out Reset, USI
start condition interrupt, an external level interrupt on INT0, or a pin 
change interrupt can
wake up the MCU.

MfG Spess

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
>
> Im idle mode kann er, nur in power down oder standby nicht.
> Und hier ist soweit erkennbar der idle mode aktiv.

Stimmt: der I/O - Clock bleibt im Idle-Mode aktiv.

Dann steckt der Fehler wahrscheinlich in den ausgeblendeten 
Programmteilen, denn die Initialisierung scheint zu stimmen.

Grüße,
Peter

Autor: Chris O. (lupin_iii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe. Tja, es war wohl tatsächlich der versteckte Code. 
Aber da der eigentlich ziemlich einfach war und mit dem 
Timern/Interrupts nichts zu hatte, habe ich dort nicht genau genug 
geschaut und wohl etwas übersehen. Ich habe zuerst ohne "sleep" 
weitergemacht (wonach komischerweise alles funktioniert hat). Jetzt habe 
ich es wieder eingefügt, und es funktioniert trotzdem noch.

Mein Denkfehler war, dass der erste Befehl nach dem Interrupt der Befehl 
nach sleep ist, weil von den Takten her immer genug Zeit gewesen wäre um 
dort zu landen, bevor der nächste Interrupt kommt. Deswegen waren auch 
meine Debug-Signale dort. Bringt aber natürlich alles nichts, wenn er 
irgendwo mitten im Code in einer Schleife hängen bleibt und gar nicht 
mehr zum "sleep" kommt.

Aber gut, dass auch andere was gelernt haben ;-)
"Idle mode enables the MCU to wake up from external triggered interrupts 
as well as internal ones like the Timer Overflow."

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um rauszukriegen ob ein Interrupt da war, packt man ein bischen 
Debug-Code (LED toggle oder so) in den Interrupt selber.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.