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
> out TOIE0, temp
Prüfe den Registernamen. Das muss was mit TIMSK sein, kein Bitname.
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"
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
> 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.
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
@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
> C:\Dokumente und Einstellungen\Local User\Desktop\Test25\Test25.asm(30): > error: Operand 1 out of range: 0x6e Schau dir den Assemblerbefehl STS an.
Domi S. schrieb: > C:\Dokumente und Einstellungen\Local User\Desktop\Test25\Test25.asm(30): > error: Operand 1 out of range: 0x6e sts statt out
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
Hi > ldi temp, (1<<CS00) ; CS00 setzen: Teiler 1 > out TCCR0A, temp CS00 liegt in TCCR0B MfG Spess
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!
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
Wo siehst du nach? Datenblatt# Kapitel über den Timer 0 Dort den Abschnitt "Register Description" und da dann wiederrum TCCR0B
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.