mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16-Bit Timer beim Atmega32


Autor: blamann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin scheinbar zu blöd das Datenblatt zu lesen.
Ich möchte gerne den Timer1 des Atmega32 verwenden.

Ich möchte einfach gerne ständig den TIMER1 Overflow Interrrupt
ausgelöst haben, der dann LEDs blinken lassen soll.

Mein Problem: Der Timer läuft, springt beim erreichen des Counter-Werts
0xFFFF auch nach 0x0000 zurück. Aber irgendwie scheint der Interrupt
nicht ausgelöst zu werden.
TOV1 im TIFR-Register wird auch nicht gesetzt.

Ich glaube den Timer so eingestellt zu haben:
- clksource: clkIO (no prescaling) (hab auch schon clkIO/64 etc.
probiert)
- Timer Mode of Operation: Normal

Scheinbar habe ich den Timer-Kram völlig missverstanden oder bin
einfach nur blind ;D

Hier der ASM-Quellcode:
http://rafb.net/paste/results/6vAWuO43.html

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Über dieses Problem bin ich auch schon gestolpert, die
Interrupt-Vektoren müssen/sollten so definiert werden


.org 0          ;Startadresse=0
rjmp RESET     ; Reset Handler
.org $002 reti;rjmp EXT_INT0   ; IRQ0 Handler
.org $004 reti;rjmp EXT_INT1   ; IRQ1 Handler
.org $006 reti;rjmp EXT_INT2   ; IRQ2 Handler
.org $008 reti;rjmp TIM2_COMP ; Timer2 Compare Handler
.org $00A reti;rjmp TIM2_OVF   ; Timer2 Overflow Handler
.org $00C reti;rjmp TIM1_CAPT ; Timer1 Capture Handler
.org $00E reti;rjmp TIM1_COMPA; Timer1 CompareA Handler
.org $010 reti;rjmp TIM1_COMPB; Timer1 CompareB Handler
.org $012 rjmp TIM1_OVF   ; Timer1 Overflow Handler
.org $014 reti;rjmp TIM0_COMP ; Timer0 Compare Handler
.org $016 reti;rjmp TIM0_OVF   ; Timer0 Overflow Handler
.org $018 reti;rjmp SPI_STC   ; SPI Transfer Complete Handler
.org $01A reti;rjmp USART_RXC ; USART RX Complete Handler
.org $01C reti;rjmp USART_UDRE; UDR Empty Handler
.org $01E reti;rjmp USART_TXC ; USART TX Complete Handler
.org $020 reti;rjmp ADC     ; ADC Conversion Complete Handler
.org $022 reti;rjmp EE_RDY   ; EEPROM Ready Handler
.org $024 reti;rjmp ANA_COMP   ; Analog Comparator Handler
.org $026 reti;rjmp TWI     ; Two-wire Serial Interface Handler
.org $028 reti;rjmp SPM_RDY   ; Store Program Memory Ready Handler

;--------------------------------------------------------------
RESET:

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolltest Du den STACK-Pointer wirklich so setzen?

Ich hätt ihn an die oberste Stelle gesetzt durch:

 ldi temp,high(RAMEND)   ;Stackpointer initialisieren
 out SPH,temp
 ldi temp,low(RAMEND)
 out SPL,temp

Autor: blamann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!!!!!
Es lag tatsächlich an den Interrupt-Vektoren. Funzt jetzt einwandfrei
:D
Und ich suche mir nen Elch bei den Timer-Registern ab ;D

Den Stack-Pointer hab ich einfach mal irgendwohin gesetzt, damit ich
zumindest einen hab ;D
Werd ich direkt mal so anpassen ;D

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich hab mir den Code mal angeschaut, bin aber nicht speziell mit
Assembler vertraut, also falls ich was dummens sag Entschuligung.

1
________________
in zeile
16 rjmp    TIMER2_OVF
aber es gibt keine Marke dei so heißt ?

es gibt nur
zeile
74  TIMER1_OVF:

und
81  TIMER0_OVF:
_________________

2
_______________________
TOV1 im TIFR-Register wird auch nicht gesetzt.

musst du das nicht per hand machen ?

vielleicht etwa so
ldi TIFR,0b00000100
bevor du sei machst ?
___________________________________

und 3
dein Programm schaltet die LED's ein bei Reset, nach der ersten Timer
Ovweflow aus.
Danach werden sie aber nie wieder angeschaltet ?
__________________________________________

hoffe geholfen zuhaben
  Chris

Autor: blamann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Marke existiert schon - Hab das ganze etwas vorm posten etwas
editiert und da hat sich nen Fehler eingeschlichen ;D

TOV1 in TIFR müsste eigentlich vom avr gesetzt werden ("TOV1 is set
when the timer overflows." und "tov1 is automatically cleared when
the overflow interrupt vector is executed")
Prinzipiell ist mir TOV1 eh egal - Ich werde das Flag eh nicht abfragen
;D

Das Blinken kommt im nächsten Schritt ;D
Der Code ist quasi nur zum testen gewesen ob der Overflow-Interrupt
überhaupt ausgelöst wurde ;D

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon wieder einer, der unübersichtliche Bitkolonnen statt Namen
verwendet.
Also die Initialisierung des Timer1 scheint OK zu sein. Blinken wird da
allerdings nichts, da bei jedem Interrupt der Ausgang auf den gleichen
Wert gesetzt wird, und der erste Timer-Überlauf wird relativ schnell
passieren (nach 256 Taktzyklen).

@Bernhard:
Die Initialisierung des Stackpointers sollte zwar so wie du es
schriebst durchgeführt werden, aber das dürfte in diesem Fall nicht das
Problem sein.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, zu spät.

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>der unübersichtliche Bitkolonnen statt Namen

Stimmt, ist übersichtlicher und besser nachvollziehbar
zB. so:

 ldi temp,(1<<toie1)
 out timsk,temp

Autor: blamann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht tatsächlich übersichtlicher und irgendwie nach C aus ;D

Das Ergebnis von
ldi temp,(1<<TOIE1)
wäre dann quasi beim atmega32 0b00000100 ?

Wie kombiniere ich denn mehrere Flags ? Wenn ich z.B. TOIE1 und TOIE2
setzen wollte ?

Ein blutiger Anfänger dankt nochmal allen die geantwortet haben ;D

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kombiniere ich denn mehrere Flags ? Wenn ich z.B. TOIE1 und
> TOIE2 setzen wollte ?

Das ginge mit:

    ldi temp, (1 << TOE1) | (1 << TOIE2)



PS: Du plenkst.

Autor: blamann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, das ist ja mal praktisch.

(Ich befürchte das Plenken kann ich mir nicht mehr abgewöhnen...)

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.