Forum: Mikrocontroller und Digitale Elektronik 8bit Timer TCCR0


von Lukas -. (lukas)


Lesenswert?

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!!!

von David (Gast)


Lesenswert?

Hi

Probiers mal mit:

out tccr0, r16

Gruß Davis

von Ronny (Gast)


Lesenswert?

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.

von Ronny (Gast)


Lesenswert?

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....

von Lukas -. (lukas)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Lukas -. (lukas)


Lesenswert?

der code ist ja auch noch lange nicht vertig, es ging nun ersteinmal 
darum, das das interrupt fnktioniert! aber danke!

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.