Hallo! Ich wollte einen timer einsettzen, und musste dazu muss ich den register TCCR0 auf 0b001 setzen, damit der Prescaler(teiler) aus ist. das habe wollte ich so machen: ldi r16, 0b001 in TCCR0, r16 dann hat er aber gemerckert, das TCCR0 unbekannt sei!?! obwohl der ja sogar in der m8def.inc aufgeführt ist. und einzelene bits zu setzen ging auch nciht: sbi TCCR0, 0 cbi TCCR0, 1 cbi TCCR0, 2 Warum geht das nicht? SDanke für die Hilfe!!!
Schau doch noch mal im Datenblatt nach,wie die Register zur Timer-Kontrolle wirklich heissen.Insgesamt gibt es 3 Stück (A,B und C) pro Timer und dann noch 2 weitere um die dazugehörigen Interrupts zu aktivieren/pollen. Im übrigen wird der IN-Befehl zum lesen von Ports verwendet.Um etwas auszugeben lautet der richtige Befehl OUT.
Oha,ich seh grad ich hab das 8-Bit-Timer überlesen.Das mit den 3 Kontrollregistern gilt für die "grossen" 16-Bit Timer.Für den 8-Bit-Timer ist TCCR0 natürlich korrekt. Ersetz einfach das IN durch ein OUT....
danke jetzt übernimmt er den wert, aber das interrupt wird trotzdem nciht ausgelöst!?! hier mein quellcode: .include: "m8def.inc" .org 0x000 rjmp init ;Reset Handler reti ;IRQ0 Handler reti ;IRQ1 Handler reti ;Timer 2 Compare Handler reti ;Timer 2 Overflow Handler reti ;Timer 1 Capture Handler reti ;Timer 1 Compare A Handler reti ;Timer 1 Compare B Handler rjmp richtungA ;Timer 1 Overflow Handler rjmp richtungB ;Timer 0 Overflow Handler reti ;SPI Transfer Complete Handler reti ;USART, RX Complete Handler reti ;USART, UDR Empty Handler reti ;USART, TX Complete Handler reti ;ADC Conversion Complete Handler reti ;EEPROM Ready Handler reti ;Analog Comparator Handler reti ;2-wire Serial Interface Handler reti ;Store Program Memory Ready Handler ldi temp, Low(RAMEND) out SPL, temp ldi temp, high(RAMEND) out SPH, temp ;Stack Pointer Intialisieren ldi r16, 0xFF out DDRB, r16 ; PortB ist ausgang .def temp = r16 .def VQSspeed = r17 .def VQSrichtung = r18 init: ldi temp, 0b001 out tccr0, temp ldi temp, 0b1 out timsk, temp richtungA: cbi PortB, 1 sbi PortB, 0 rjmp richtunga richtungB: Cbi PortB, 0 sbi PortB, 1 rjmp richtungb
Klar, du hast ja auch das globale Interrupt Enable Flag nicht mittels sei eingeschaltet. Im übrigen ist dein Code ziemlicher Quak. Tu dir selbst einen Gefallen und schau mal ins Tutorial: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
der code ist ja auch noch lange nicht vertig, es ging nun ersteinmal darum, das das interrupt fnktioniert! aber danke!
Nicht fertig! Da sind schon jede Menge Fehler drinnen. Von wegen nicht fertig. Deine Initialisierung wird nie ausgeführt. Dein Stackpointer zeigt ins Nirwana, der Port B ist überhaupt nicht initialisiert. Eine Interrupt Routine wird mit einem reti abgeschlossen und nicht mit einem Sprung zum Anfang der Routine. Nicht fertig. psscht.
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.