->Jag skulle börja med att "nolla" hela bufferten och sätta sum = 0.
Jo, det tyckte jag med, så det gör jag.
Börjar bli fundersam på om jag använder något register ovarsamt någonstans i koden. Här är hela koden:
Kod: Markera allt
.include "m88def.inc"
; 8 MHz external chrystal
.org 0x000
rjmp Reset
.org INT0addr ; Interuptvector external INT0
rjmp count
.org OC1Aaddr ; Interuptvektor timer 1 match A
rjmp timer1
;--------------------------
; initialise Stack Pointer
;--------------------------
reset:
ldi r16, low(RAMEND)
out SPL, r16
;--------------------------
; Set definitions
;--------------------------
.def data = r0
.def temp = r16
.def temp2 = r17
.def cps = r18
.def avg = r19
.def hex = r20
.def dig1 = r21
.def dig2 = r22
.def dig3 = r23
.def sum = r24
.equ avg_buff_H = 0x01
.equ avg_buff_L = 0x00
.equ buff_length = 8
ldi XH, avg_buff_H
ldi XL, avg_buff_L
ldi temp, 0
zero_buffer:
st X+, temp
cpi XL, buff_length
brne zero_buffer
ldi XH, avg_buff_H
ldi XL, avg_buff_L
ldi sum, 0
;--------------------------
; USART init
;--------------------------
;set baudrate
ldi temp, (0<<U2X0)
sts UCSR0A, temp
ldi temp, 51 ; 51 - 9600 Baud @ 8 MHz
sts UBRR0L, temp
;enable transmitter
ldi temp, (1<<TXEN0)
sts UCSR0B, temp
;set frame format 8n1
ldi temp, (1<<UCSZ00)|(1<<UCSZ01)
sts UCSR0C, temp
;--------------------------
; Set interupts
;--------------------------
ldi temp, (1<<INT0) ; Extern interupt INT0
out EIMSK, temp
ldi temp, (1<<ISC01)|(1<<ISC00) ; Rising edge
sts EICRA, temp
ldi temp, 75 ; Sätter timer compare
ldi temp2, 255 ; 75 ger ungefär 2,5 sek
sts OCR1AH, temp
sts OCR1AL, temp2
ldi temp, (1<<OCIE1A) ; Timer match A interupt
sts TIMSK1, temp
ldi temp, (1<<CS12)|(1<<CS10)|(1<<WGM12) ; Timer1 prescaler 1024 & CTC
sts TCCR1B, temp
sei ; Global interupt on
;--------------------------
; Main program
;--------------------------
main:
rjmp main
;--------------------------
; Timer interupt 1
;--------------------------
timer1:
;Provar medelvärdesbildning....
ld temp, X
sub sum, temp
st X+, cps
add sum, cps
cpi XL, buff_length
brne _timer1
ldi XH, avg_buff_H
ldi XL, avg_buff_L
_timer1:
mov avg, sum
ror avg
clc
ror avg
clc
ror avg
clc
;Slut prov medelvärdesbildning
;Presentera på RS232
ldi ZL, LOW(text_cps*2) ;set Low memory pointer
ldi ZH, HIGH(text_cps*2) ;set High memory pointer
rcall transmitt
mov hex, cps
rcall bcd
ldi ZL, LOW(text_cpsavg*2) ;set Low memory pointer
ldi ZH, HIGH(text_cpsavg*2) ;set High memory pointer
rcall transmitt
mov hex, avg
rcall bcd
ldi ZL, LOW(text_crlf*2) ;set Low memory pointer
ldi ZH, HIGH(text_crlf*2) ;set High memory pointer
rcall transmitt
ldi cps, 0
reti
;--------------------------
; Transmitt via RS232
;--------------------------
transmitt:
rcall ready_tx
lpm
mov temp, data
cpi temp, '#'
breq transmitt1
sts UDR0, data
adiw ZL,1
rjmp transmitt
transmitt1:
ret
;--------------------------
; Count pulse
;--------------------------
count:
inc cps
reti
;--------------------------
; Hex to ascii and out rs232
;--------------------------
;input: hex = 8 bit value 0 ... 255
;output: dig1, dig2, dig3 = digits
bcd:
ldi dig1, -1 + '0'
_bcd1:
inc dig1
subi hex, 100
brcc _bcd1
ldi dig2, 10 + '0'
_bcd2:
dec dig2
subi hex, -10
brcs _bcd2
sbci hex, -'0'
mov dig3, hex
rcall ready_tx
cpi dig1, '0'
brne _bcd3
ldi dig1, ' '
_bcd3:
sts UDR0, dig1
rcall ready_tx
cpi dig2, '0'
brne _bcd4
cpi dig1, ' '
brne _bcd4
ldi dig2, ' '
_bcd4:
sts UDR0, dig2
rcall ready_tx
sts UDR0, dig3
ret
;--------------------------
; waits for tx ready
;--------------------------
ready_tx:
lds temp, UCSR0A
sbrs temp, UDRE0
rjmp ready_tx
ret
;--------------------------
; Dialog text
;--------------------------
.CSEG
text_cps:
.db "cps: #"
text_cpsavg:
.db " cps avg: #"
text_crlf:
.db 10,13,"#"