Forum: Mikrocontroller und Digitale Elektronik Timer bei Atmega 2560


von Domi S. (sandi)


Lesenswert?

Liebe Fachleute...,

wir(2 Lehrlinge und ein Ausbildner) versuchen hier seit ca 1ner Woche 
einen Timer bei unserem Atmega 2560 zu programmieren, wir haben einige 
Beispiele im Internet gefunden, jedoch funktioniert keines im 
simulator...

das aufwärts zählen des timer/counter1 funktioniert einwandfrei jedoch 
beim overflow springt er nicht in den angegebenen loop

unser haupt Problem ist, dass keiner wirklich versteht was wir da 
programmieren und wieso es nicht so funktioniert wie es sollte(wir sind 
alle noch totale Anfänger).

Wir hoffen jemand von Euch erklärt uns das ein bisschen (das Tutorial zu 
diesem Thema haben wir bereits mehrere male gelesen)

Programmiert wird im AVR Studio 4
verwendeter Debugger: AVR Simulator
Verwendeter yC : ATmega 2560 8AU

hier noch der quellcode den wir verwenden:

.include "m2560def.inc"

.def temp = r16
.def leds = r17

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler

main:
        ; Stackpointer initialisieren
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
        ldi     temp, LOW(RAMEND)
        out     SPL, temp

        ldi     temp, 0xFF            ; Port B auf Ausgang
        out     DDRB, temp

        ldi     leds, 0xFF

        ldi     temp, (1<<CS00)       ; CS00 setzen: Teiler 1
        out     TCCR0, temp

        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer 
Overflow
        out     TOIE0, temp

        sei

loop:   rjmp    loop

timer0_overflow:                      ; Timer 0 Overflow Handler
        out     PORTB, leds
        com     leds
        reti


Danke für Eure schnelle Hilfe schon mal im voraus

Mfg Domi

von Helfer (Gast)


Lesenswert?

>         out     TOIE0, temp

Prüfe den Registernamen. Das muss was mit TIMSK sein, kein Bitname.

von Domi S. (sandi)


Lesenswert?

wenn ich TIMSK da rein schreibe bringt er mir eine fehlermeldung beim 
übersetzten
"C:\Dokumente und Einstellungen\Local 
User\Desktop\Test25\Test25.asm(30): error: Undefined symbol: TIMSK"

und nen 2ten fehler habe ich auch noch drauf ...

bei

out     TCCR0, temp

bringt er mir:

"C:\Dokumente und Einstellungen\Local 
User\Desktop\Test25\Test25.asm(27): error: Undefined symbol: TCCR0"

von Domi S. (sandi)


Lesenswert?

sorry mir ist da ein kleiner fehler unterlaufen
anstatt TIMSK muss TIMSK0 stehen dann bringt er die fehlermeldung:

C:\Dokumente und Einstellungen\Local User\Desktop\Test25\Test25.asm(30): 
error: Operand 1 out of range: 0x6e

der rest is gleich geblieben

mfg

von Helfer (Gast)


Lesenswert?

> wenn ich TIMSK da rein schreibe bringt er mir eine fehlermeldung

Dann schau im Datenblatt nach in welches Register das Bit TOIE0 gehört. 
Es heisst ähnlich wie TIMSK.

> out     TCCR0, temp
> bringt er mir:
> "C:\Dokumente und Einstellungen\Local
> User\Desktop\Test25\Test25.asm(27): error: Undefined symbol: TCCR0"

Dann schau im Datenblatt nach in welches Register das Bit CS00 gehört.

von spess53 (Gast)


Lesenswert?

Hi

>wenn ich TIMSK da rein schreibe bringt er mir eine fehlermeldung beim
>übersetzten
>"C:\Dokumente und Einstellungen\Local
>User\Desktop\Test25\Test25.asm(30): error: Undefined symbol: TIMSK"

Weil es kein TIMSK gibt, sondern TIMSK0, TIMSK1....

>bei
>out     TCCR0, temp
>bringt er mir:
>"C:\Dokumente und Einstellungen\Local
>User\Desktop\Test25\Test25.asm(27): error: Undefined symbol: TCCR0"

Gibt es auch nicht: TCCR0A und TCCR0B.

MfG Spess

von Domi S. (sandi)


Lesenswert?

@spess auf die idee mit dem TCCR0A und TCCR0B bin ich ebenfalls gekommen 
aber es funktioniert trozdem nicht ...
ich wünschte es würde funktionieren

mfg

von Helfer (Gast)


Lesenswert?

> C:\Dokumente und Einstellungen\Local User\Desktop\Test25\Test25.asm(30):
> error: Operand 1 out of range: 0x6e

Schau dir den Assemblerbefehl STS an.

von Rasenlatscher (Gast)


Lesenswert?

Domi S. schrieb:
> C:\Dokumente und Einstellungen\Local User\Desktop\Test25\Test25.asm(30):
> error: Operand 1 out of range: 0x6e

sts statt out

von Domi S. (sandi)


Lesenswert?

geile idee er konnte es übersetzten aber jetzt zählt da überhaupt nichts 
mehr
neuer Quellcode:

.include "m2560def.inc"

.def temp = r16
.def leds = r17

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler

main:
        ; Stackpointer initialisieren
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
        ldi     temp, LOW(RAMEND)
        out     SPL, temp

        ldi     temp, 0xFF            ; Port B auf Ausgang
        out     DDRB, temp

        ldi     leds, 0xFF

        ldi     temp, (1<<CS00)       ; CS00 setzen: Teiler 1
        out     TCCR0A, temp

        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer 
Overflow
        sts     TIMSK0, temp

        sei

loop:   rjmp    loop

timer0_overflow:                      ; Timer 0 Overflow Handler
        out     PORTB, leds
        com     leds
        reti

mfg

von spess53 (Gast)


Lesenswert?

Hi

>        ldi     temp, (1<<CS00)       ; CS00 setzen: Teiler 1
>        out     TCCR0A, temp

CS00 liegt in TCCR0B

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Domi S. schrieb:

>         ldi     temp, (1<<CS00)       ; CS00 setzen: Teiler 1
>         out     TCCR0A, temp

Die CSxx Bits sind beim Mega2560 im Register TCCR0B.

Du musst alles und jedes mit dem Datenblatt kontrollieren!
Einzig das Datenblatt ist die einzige Autorität wenn es um einen 
speziellen Prozessor geht. Also lade dir das Teil von Atmel und benutze 
es!

von Domi S. (sandi)


Lesenswert?

gut jetzt schaltet er port b aber zählen tut er nicht ... (leider)

und in meinem datenblatt findet der nix von cs00 (is des orginal 
datenblatt von atmel)

via suchenfunktion bringt der mir sonst was aber nicht das was ich suche

mfg

von Karl H. (kbuchegg)


Lesenswert?

Wo siehst du nach?

Datenblatt#
Kapitel über den Timer 0
Dort den Abschnitt "Register Description"
und da dann wiederrum TCCR0B

von spess53 (Gast)


Lesenswert?

Hi

>(is des orginal datenblatt von atmel)

Wohl die Kurzform?

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Domi S. schrieb:
> gut jetzt schaltet er port b aber zählen tut er nicht ... (leider)

Wenn er (der Simulator) den B-Port schaltet, dann zählt er auch.
Der Simulator hat eine 'Optimierung' drinnen, so dass er auch mal 
Anweisungeen still und heimlich durchführt, bis sich was tut. Da deine 
Hauptschleife leer ist, wird er die wohl still ausführen, bis der 
nächste Interrupt auftritt.

von Domi S. (sandi)


Lesenswert?

gut das hab ich gefunden nur du müsstest uns jetzt gerade mal sehen da 
stehen 2 bis 3 leute um nen bildschirm rum und versuchen zu 
entschlüsseln was atmel mit diesen informationen sagen will

wie gesagt wir sind totale noobs in diesem thema
und irgend wie glaube ich langsam ne s7-300 programmieren is deutlich 
einfacher als nen myC

Trozdem danke wir werden mal weiter entschlüsseln

mfg

von Karl H. (kbuchegg)


Lesenswert?

Domi S. schrieb:
> gut das hab ich gefunden nur du müsstest uns jetzt gerade mal sehen da
> stehen 2 bis 3 leute um nen bildschirm rum und versuchen zu
> entschlüsseln was atmel mit diesen informationen sagen will

Ich denke ihr habt das Tutorial durch?

Sobald ein Timer einen Vorteiler zugewiesen hat, zählt er auch.
Welche Vorteiler es gibt, findet sich im Datenblatt.
Dort gibt es auch eine Tabelle, welche Bits gesetzt werden müssen, damit 
welcher Vorteiler zum Zug kommt. Und diese Bits suchst du dir dann in 
den Registern (in jedem Abschnitt "Register Description" sind immer nur 
die für dieses "Gerät" relevanten Register zusammengefasst) und setzt 
sie. So einfach ist das.

Der Rest des Kapitelas beschreibt immer welche Möglichkeiten es gibt und 
was da alles passiert. Im Abschnitt "Register Description" ist dann die 
Zusammenfassung, wie man diese Dinge erreichen kann.

Und: Lesen nimmt euch keiner ab.

von Domi S. (sandi)


Lesenswert?

danke schön und logo das uns lesen keine abnimmt aber ja wir werden es 
weiter versuchen wenn wir mal wieder gar nicht weiter kommen melden wir 
uns wieder

mfg

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.