PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timerproblem TIFR



Lektor
22.04.2005, 22:17
brauche mal wieder eure Hilfe. Nachdem ich es nun geschafft habe eine LED zum leuchten zu bringen, habe ich mich nun daran versucht mit dem Timer zu arbeiten.
Will nun das 0Bit von TIFR abfragen, damit ich den Überschlag zählen kann. Allerdings kommt AVR Studio immer mit der Fehlermeldung Invalid Register, wenn ich SBRS, CPSE, MOV. Egal was, immer die gleiche Fehlermeldung. Irgentwie muß ich doch dieses eine Bit abfragen können, kopieren können, oder sonstwas.

start:
ldi mp,0x00; Aufwärtszähler auf 0 setzen TCNT0
out tcnt0,mp;
ldi mp,0x05; 00000101 in TCCR0 (prescaler 1024)
out tccr0,mp
uebertrag:
SBRS TIFR,0 ;Skip if Bit in Register is Set
rjmp uebertrag
....
rjmp start
Würde den Code dann so weiterschreiben, dass ich die 1 aus TOV0 in ein anderes Register kopieren und jede weitere 1 hinzuaddieren, bis ich einen bestimmten Übertragswert erreicht habe (ZEIT).
Gibt es Tips? Was mache ich verkehrt?

Lektor
23.04.2005, 08:21
so, habe kleine Änderungen vorgenommen. Vielleicht kann mir einer sagen, warum der sch*** Timer nicht anfängt zu zählen. TCNT0 bleibt ständig unverändert und ich habe glaube ich alle notwendigen Bits gesetzt. So langsam macht mich das richtig wütend. Naja zumindest habe ich es geschafft mit dem IN Befehl TIFR in ein anderes Register zu kopieren, so das ich es abfragen kann.



.NOLIST
.INCLUDE "m8def.inc"
.LIST
rjmp main
reti ; IRQ0
reti ; IRQ1
reti ; Timer1 Capture
reti ; Timer1 Compare
reti ; Timer1 Overflow
;rjmp TIM0_OVF ; Timer0 Overflow
reti ; SPI Complete
reti ; UART Rx
reti ; UART Data empty
reti ; UART Tx
reti ; ADC Conversion Complete
reti ; EEPROM ready
reti ; Analog Comparator
main:
ldi R16,LOW(RAMEND) ;Initiallisiert Stackpointer
out SPL,R16
ldi R16,HIGH(RAMEND)
out SPH,R16
sei ;Global Interrupt Enable

;TIM0_OVF:
timer:
ldi R16,0x00; Aufwärtszähler auf 0 setzen TCNT0
out TCNT0,R16; Timer/Counter Register
ldi R16,0x01 ;Timer/Counter0 Overflow Interrupt Enable
out TIMSK,R16 ;Timer/Counter Interrupt MaskRegister
ldi R16,0x05; 00000101 in TCCR0 (prescaler 1024)
out TCCR0,R16 ;Timer/Counter Control Register
;(FUCKING TIMER GESTARTET ODER NICHT?)

uebertrag: ;Übertragsabfrage
in R16, TIFR ;Timer/Counter0 Overflow Flag
sbrs R16,0 ;Skip if Bit in Register is Set
rjmp uebertrag
;reti ;Interrupt Return


; in R16, TIFR ;Timer/Counter0 Overflow Flag
; sbrs R16,0 ;Skip if Bit in Register is Set
;rjmp uebertrag
; cbr R16,0 ;Timer/Counter Interrupt Flag Register

;Skip if Bit in Register is Set
; rjmp uebertrag
;weiter:

;rjmp weiter ....
rjmp main


NACHTRAG:
habe herausgefunden, dass wenn ich TCCR0 auf 001 (no prescaling) setze, er zählt. Sobald jedoch ein prescaling drin ist, macht er es nicht mehr.