www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 TCNT1H Problem


Autor: Eric Barmeyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin relativ neu in der Welt der AVR und versuche momentan mittels 
Assembler Timer1 meines ATmega16 beizubringen im Sekundentakt einen 
Overflow zu generieren. In C hat das ganze bereits wunderbar geklappt, 
allerdings klappt folgender ASM-Code nicht so, wie ich es mir erhofft 
habe:
.INCLUDE <m16def.inc>

reset:
RJMP main

.org OVF1addr
RJMP timer1_overflow


.DEF tmp = r22

main:
LDI tmp,high(RAMEND)
OUT SPH,tmp
LDI tmp,low(RAMEND)
OUT SPL,tmp

LDI tmp, (1<<CS10) | (1<<CS12) // Timer1 Prescaler 1024
OUT TCCR1A, tmp

LDI tmp, (1<<TOIE1) // Timer1 Overflow Handler aktivieren
OUT TIMSK, tmp

LDI tmp, 0xE3
OUT TCNT1H,tmp  // Bis hier klappt alles wunderbar, TCNTH1 ist 0xE3...
LDI tmp, 0xE0   // ...aber ab hier ist TCNT1H laut Simulation wieder 0x00
OUT TCNT1L,tmp

SEI


timer1_overflow:
// hier versuch ich das selbe Spiel wie oben, ebenfalls erfolglos
RETI

TCNT1H lässt sich einfach nicht ändern. Ich hab auch die Routinen aus 
dem Manual versucht, jedoch blieb auch dies erfolglos.

Ich hoffe jemand weiß Rat :)

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehr bekannter Anfängerfehler, schau mal ins Datenblatt, wie 
16bit-Register zu schreiben/lesen sind :-)

Autor: Eric Barmeyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort, auch wenn mich das nicht sofort weiter 
bringt, muss ich wohl weiter das Manual wälzen ;(

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
crazy horse wrote:
> sehr bekannter Anfängerfehler, schau mal ins Datenblatt, wie
> 16bit-Register zu schreiben/lesen sind :-)
Nö. Das ist schon OK so (vielleicht auch zufällig...?). Beim Schreiben 
erst das High-Byte, beim Lesen erst das Low-Byte. Das Low-Byte triggert 
den jeweiligen Vorgang.

Das Problem in diesem Fall ist vermutlich eher der Simulator und nicht 
das Programm. Der AVRStudio-Simulator ist an der Stelle ein wenig buggy.

Zitat AVRStudio-Hilfe:
"Some simulator modules do not properly simulate the register buffering 
and write order requirement of register pairs such as TCNT1H/TCNT1L. The 
value of the high byte register is immediately set when written to.

Some register bits that should be cleared by setting them (writing 1) 
will be cleared if they are written to 0."

Einen Workaround bietet die Hilfe in diesem Fall nicht (ich hab 
zumindest jetzt keinen gefunden).

Die Frage ist allerdings, ob es tatsächlich erforderlich ist, das TCNT1 
zu schreiben. Das ist nämlich in den seltensten Fällen wirklich nötig. 
Wenn es ein Timer-Nachladen geht, um nach einer bestimmten Zeit einen 
Overflow zu erhalten, ist es bei den AVRs eigentlich üblich, das mit 
einer Compare-Einheit zu machen (z.B. im CTC-Modus) und dann den 
Compare-Interrupt auszuwerten. Schau Dir im Datenblatt und/oder im 
AVR-Tutorial vielleicht mal die Abschnitte zu den Compare-Einheiten 
an.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW: Welche AVRStudio-Version hast Du? ich meine mich erinnern zu 
können, dass das Problem in älteren Versionen (ich selber habe 4.13 und 
daraus ist auch obiges Zitat) noch größer war.

Autor: Eric Barmeyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe. Dachte schon ich hätte was im Manual überlesen bzw. 
falsch gemacht.

@AVR-Version:
AVR Studio    4.13.528  
GUI Version    4, 13, 0, 528
AVR Simulator    1, 0, 2, 0


Das mit den Compare-Einheiten hatte ich auch bereits gelesen, danke für 
den Tipp.

Autor: Eric Barmeyer (zaron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, mittlerweile hab ich das Ganze zum laufen gekriegt. Es war unter 
anderem falsch, im Register TCCR1A das erste und dritte Bit zu setzen 
(CS10 u. CS12), da diese nämlich in TCCR1B gesetzt werden müssen. 
Zusätzlich läuft's jetzt im CTC-Modus, wie's mir empfohlen wurde. Vielen 
Dank nochmals :)

Hier der Code:
.INCLUDE <m16def.inc>

reset:
RJMP main           ; Reset Handler

.org OVF1addr
RJMP timer1_overflow

.def tmp = r22
.def leds = r23


main:
LDI tmp,high(RAMEND)
OUT SPH,tmp
LDI tmp,low(RAMEND)
OUT SPL,tmp

SER leds

SER tmp
OUT DDRB, tmp

LDI tmp, (1<<CS10) | (1<<CS12) | (1<<WGM12) // Timer1 Prescaler 1024 und CTC-Mode
OUT TCCR1B, tmp

LDI tmp, (1<<FOC1A) // Force Output Compare
OUT TCCR1A, tmp

LDI tmp, (1<<OCIE1A) 
OUT TIMSK, tmp

LDI tmp, 0x1C
OUT OCR1AH,tmp
LDI tmp, 0x20
OUT OCR1AL,tmp

SEI

loop:
RJMP loop

timer1_overflow:
  OUT PORTB, leds
  COM leds
RETI
Mein Testboard hat nen 7,3728MHz Quarz und der AVR erzeugt mit diesem 
Code jede Sekunde einen Overflow. Vielleicht hilft es jemandem weiter :)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eric Barmeyer wrote:
> So, mittlerweile hab ich das Ganze zum laufen gekriegt. Es war unter
> anderem falsch, im Register TCCR1A das erste und dritte Bit zu setzen
> (CS10 u. CS12), da diese nämlich in TCCR1B gesetzt werden müssen.
Aha, da hab ich z.B. gar nicht drauf geachtet. Schön, dass es läuft...

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.