homedom
08.06.2007, 11:19
Hi,
Ich hab irgendwie n Problem mit dem CTC Counter. Ich hab n magnetfeldsensor um ne drehzahl zu messen. Nun will ich, dass jede Sekunde die drehzahl aus m register abgefragt und zur geschwindigkeit hochgerechnet wird (geht um mein RC Car) und vorerst testweiße an UART gesendet wird. Problem dabei is, dass ich am Com-port nich jede Sekunde, sondern dauern, fortlaufen was bekomme.. dann natürlich 0, weil der sensor nich so schnell is.. Von der Logik her müsste es aber eigentlich funktionieren.. Ich habs mit 2 verschiedenen Atmega8 probiert,l bei beiden das selbe. Mein Code:
.include "m8def.inc"
.def temp = r16
.def counts = r17
.def kmh = r18
.def time1 = r21
.def time2 = r22
.equ CLOCK = 16000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1#
.org 0x000
rjmp main
.org INT0addr
rjmp int0_handler
.org OC1Aaddr
rjmp timer1_compare
main:
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH (UBRRVAL)
out UBRRH, temp
ldi temp, high(40000-1)
out OCR1AH, temp
ldi temp, low(40000-1)
out OCR1AL, temp
ldi temp, ( 1 << WGM12 ) | ( 1 << CS00 )
out TCCR1B, temp
ldi temp, 1 << OCIE1A ; OCIE1A: Interrupt bei Timer Compare
out TIMSK, temp
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
ldi temp, 0x00
out DDRD, temp
;ldi temp, 0xFF
;out PORTD, temp
ldi temp, 0b00001010 ; INT0 und INT1 konfigurieren
out MCUCR, temp
ldi temp, 0b11000000 ; INT0 und INT1 aktivieren
out GICR, temp
sbi UCSRB,TXEN
sei
loop: rjmp loop
int0_handler:
ldi temp, 1
add counts, temp
reti
timer1_compare:
cpi time1, 100
breq time2u
brne time1w
time2u:
cpi time2, 4
breq rechnekmh
brne time2w
time1w:
inc time1
reti
time2w:
inc time2
reti
rechnekmh:
clr kmh
mov kmh, counts
lsl kmh
clr counts
rjmp uartu
uartu:
sbis UCSRA, UDRE
rjmp uartu
out UDR, kmh
reti
Ich hoffe ihr könnt mir helfen und findet den fehler
Edit: der Zähler zählt bis 40000, dann wird in nem register auf 100, in nem weiteren dann auf 4 gezählt. Somit sind das 16000000 Zählschritte, die auch dem 16MHZ Takt entsprechen, also 1 Sekunde
gruß homedom
Ich hab irgendwie n Problem mit dem CTC Counter. Ich hab n magnetfeldsensor um ne drehzahl zu messen. Nun will ich, dass jede Sekunde die drehzahl aus m register abgefragt und zur geschwindigkeit hochgerechnet wird (geht um mein RC Car) und vorerst testweiße an UART gesendet wird. Problem dabei is, dass ich am Com-port nich jede Sekunde, sondern dauern, fortlaufen was bekomme.. dann natürlich 0, weil der sensor nich so schnell is.. Von der Logik her müsste es aber eigentlich funktionieren.. Ich habs mit 2 verschiedenen Atmega8 probiert,l bei beiden das selbe. Mein Code:
.include "m8def.inc"
.def temp = r16
.def counts = r17
.def kmh = r18
.def time1 = r21
.def time2 = r22
.equ CLOCK = 16000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1#
.org 0x000
rjmp main
.org INT0addr
rjmp int0_handler
.org OC1Aaddr
rjmp timer1_compare
main:
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH (UBRRVAL)
out UBRRH, temp
ldi temp, high(40000-1)
out OCR1AH, temp
ldi temp, low(40000-1)
out OCR1AL, temp
ldi temp, ( 1 << WGM12 ) | ( 1 << CS00 )
out TCCR1B, temp
ldi temp, 1 << OCIE1A ; OCIE1A: Interrupt bei Timer Compare
out TIMSK, temp
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
ldi temp, 0x00
out DDRD, temp
;ldi temp, 0xFF
;out PORTD, temp
ldi temp, 0b00001010 ; INT0 und INT1 konfigurieren
out MCUCR, temp
ldi temp, 0b11000000 ; INT0 und INT1 aktivieren
out GICR, temp
sbi UCSRB,TXEN
sei
loop: rjmp loop
int0_handler:
ldi temp, 1
add counts, temp
reti
timer1_compare:
cpi time1, 100
breq time2u
brne time1w
time2u:
cpi time2, 4
breq rechnekmh
brne time2w
time1w:
inc time1
reti
time2w:
inc time2
reti
rechnekmh:
clr kmh
mov kmh, counts
lsl kmh
clr counts
rjmp uartu
uartu:
sbis UCSRA, UDRE
rjmp uartu
out UDR, kmh
reti
Ich hoffe ihr könnt mir helfen und findet den fehler
Edit: der Zähler zählt bis 40000, dann wird in nem register auf 100, in nem weiteren dann auf 4 gezählt. Somit sind das 16000000 Zählschritte, die auch dem 16MHZ Takt entsprechen, also 1 Sekunde
gruß homedom