Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .include "m128def.inc"
- .def temp=r16
- .def counter=r17
- .def resultl=r18
- .def resulth=r19
- .cseg
- .org $0000
- jmp reset
- .org $0018
- jmp TIMER1_COMPA_ISR
- .org $0100
- reset:
- ldi temp, low(RAMEND)
- out SPL, temp
- ldi temp, high(RAMEND)
- out SPH, temp
- clr counter
- clr resultl
- clr resulth
- ; max compare value: 65535
- ; max prescaler: 1024
- ; 65535 / (4MHz / 1024) = 16s
- ser temp
- out OCR1AH, temp
- out OCR1AL, temp
- ldi temp, (1 << OCIE1A)
- out TIMSK, temp
- clr temp
- out TCCR1A, temp
- ldi temp, (1 << WGM12) | (1 << CS12) | (1 << CS10) ; CTC mode, prescaler = 1024
- out TCCR1B, temp
- ldi temp, (1 << REFS0) ; AVcc, input: ADC0
- out ADMUX, temp
- ldi temp, 0b11001111 ; enable, start of conversion, single conversion mode, interrupt enable, max prescaler
- out ADCSRA, temp
- set
- sei
- loop:
- sbis ADCSRA, ADIF ; do we have a ready result?
- rjmp loop
- in temp, ADCL
- add resultl, temp
- in temp, ADCH
- adc resulth, temp
- sbi ADCSRA, ADIF ; manually clear flag (by setting it)
- sbi ADCSRA, ADSC ; manually start next conversion (single conversion mode)
- brts loop
- rjmp reset
- TIMER1_COMPA_ISR:
- cpi counter, 8 ; 8 * 16s = 128s
- brlo next
- ; divide result by 128 (= 7 right rotations) to get average
- lsr resulth
- ror resultl
- lsr resulth
- ror resultl
- lsr resulth
- ror resultl
- lsr resulth
- ror resultl
- lsr resulth
- ror resultl
- lsr resulth
- ror resultl
- lsr resulth
- ror resultl
- clt
- next:
- inc counter
- reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement