Gast
#53160
Hallo ich habe folgendes programm für einen ATmega8 geschrieben.
es soll pulsweiten mit einer pulslänge von 0,5ms messen
die genauigkeit ist allerdings alles andere als akzeptabel
ist an meinem programm irgendwas falsch?
vielen Dank Lutz
code:
include "m8def.inc" ;Definitionsdatei einbinden
.def save_sreg = r21
.def temp = r18
.equ CLOCK = 4000000
.equ BAUD = 19200
.equ UBRRVAL = CLOCK/(BAUD*8)-1
.equ Treset=0
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
ldi temp,0b10100110
out UCSRC,temp
ldi temp,0b00100010
out UCSRA, temp
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0b11111110 ;0xFF ins Arbeitsregister r16 laden
out DDRB, temp ;Inhalt von r16 ins IO-Register DDRB
ausgeben
ldi temp, 0b11111100 ;0b11111100 in r16 laden
out PORTB, temp ;r16 ins IO-Register PORTB ausgeben
;ldi temp, 0b00000000 ;Port D als Input definiert
;out DDRD, temp
ldi temp, 0b01000001
out TCCR1B, temp ;Timer/Counter1 an und input capture bei
rising
edge
loop: in temp,TIFR ;Test ob Input capture event
sbrs temp,5
rjmp loop ;endlosschleife
ldi temp,HIGH(Treset) ;Counter zurücksetzen
out TCNT1H,temp ;(Achtung Highbyte und Lowbytereihenfolge
beachten)
ldi temp,LOW(Treset)
out TCNT1L,temp
ldi temp, 0b00000001 ;Capture auf falling edge
out TCCR1B, temp
ldi temp, 0b00100000 ;outp(1<<ICF1, TIFR);
sts $58,temp
step2: in temp,TIFR ;Test ob Input capture event
sbrs temp,5
rjmp step2
in r16,ICR1L ;Timerwert T1 speichern
in r17,ICR1H
ldi temp, 0b01000001 ;Capture auf rising edge
out TCCR1B, temp
ldi temp, 0b00100000 ;outp(1<<ICF1, TIFR);
sts $58,temp
step3: in temp,TIFR ;Test ob Input capture event
sbrs temp,5
rjmp step3
in r19,ICR1L ;Timerwert T2 speichern
in r20,ICR1H
;Ausgabe Pulsdauer y1(r16:r17) und y2(r19:r20)
ausgabe: rcall receive_loop ;Schleife zum Sendestart
mov temp,r16
rcall serout
mov temp,r17
rcall serout
mov temp,r19
rcall serout
mov temp,r20
rcall serout
ldi temp, 0b00100000 ;outp(1<<ICF1, TIFR);
sts $58,temp
rjmp loop
serout:
sbi UCSRB,TXEN ;TX aktivieren
sbis UCSRA,UDRE ;Warten bis UDR für das nächste
;Byte bereit ist
rjmp serout
out UDR, temp ;Übertragung temp
cbi UCSRB,TXEN ;TX deaktivieren
ret
receive_loop:
sbi UCSRB,RXEN
sbis UCSRA, RXC ;warten bis ein Byte angekommen ist
rjmp receive_loop
in temp, UDR
test: sbic UCSRA, RXC
rjmp test
cbi UCSRB,RXEN
ret