В целях ознакомления с периферией, сделал такой вот проект:
CODE
.include "avr000/tn26def.inc"
.cseg
.org 0
start:
ldi r16,RAMEND
out sp,r16
ldi r16,0b00001111
out ddrb,r16
ldi r16,2
out pllcsr,r16
start_01:
in r16,pllcsr
andi r16,1
breq start_01
ldi r16,6
out pllcsr,r16
ldi r16,0
out ocr1a,r16
out ocr1b,r16
ldi r16,255
out ocr1c,r16
ldi r16,0b01010011
out tccr1a,r16
ldi r16,0b10000011
out tccr1b,r16
;CK/8
ldi r16,0b00000010
out tccr0,r16
ldi r16,128
out tcnt0,r16
rcall pause
forever:
;Ждём ADIF=1
;ADLAR = 1 сдвигать результат влево, 8 бит в регистре ADCH
ldi r16,0b00100000
out admux,r16
;ADEN = 1
;ADSC = 1
;ADPS = 001; division by 2
ldi r16,0b11000001
out adcsr,r16
start_02:
in r16,adcsr
andi r16,16
breq start_02
;Сбросим ADIF
ldi r16,0b10010001
out adcsr,r16
in r16,adch
out ocr1a,r16
rcall pause
;ADLAR = 1 сдвигать результат влево, 8 бит в регистре ADCH
ldi r16,0b00100001
out admux,r16
;ADEN = 1
;ADSC = 1
;ADPS = 001; division by 2
ldi r16,0b11000001
out adcsr,r16
;Ждём ADIF=1
start_03:
in r16,adcsr
andi r16,16
breq start_03
;Сбросим ADIF
ldi r16,0b10010001
out adcsr,r16
in r16,adch
mov r17,r16
andi r17,128
out porta,r17
out ocr1b,r16
rcall pause
rjmp forever
pause:
;Ждём TOV0
pause_01:
in r16,tifr
andi r16,2
breq pause_01
;Clear TOV0
ldi r16,2
out tifr,r16
ldi r16,128
out tcnt0,r16
ret
.cseg
.org 0
start:
ldi r16,RAMEND
out sp,r16
ldi r16,0b00001111
out ddrb,r16
ldi r16,2
out pllcsr,r16
start_01:
in r16,pllcsr
andi r16,1
breq start_01
ldi r16,6
out pllcsr,r16
ldi r16,0
out ocr1a,r16
out ocr1b,r16
ldi r16,255
out ocr1c,r16
ldi r16,0b01010011
out tccr1a,r16
ldi r16,0b10000011
out tccr1b,r16
;CK/8
ldi r16,0b00000010
out tccr0,r16
ldi r16,128
out tcnt0,r16
rcall pause
forever:
;Ждём ADIF=1
;ADLAR = 1 сдвигать результат влево, 8 бит в регистре ADCH
ldi r16,0b00100000
out admux,r16
;ADEN = 1
;ADSC = 1
;ADPS = 001; division by 2
ldi r16,0b11000001
out adcsr,r16
start_02:
in r16,adcsr
andi r16,16
breq start_02
;Сбросим ADIF
ldi r16,0b10010001
out adcsr,r16
in r16,adch
out ocr1a,r16
rcall pause
;ADLAR = 1 сдвигать результат влево, 8 бит в регистре ADCH
ldi r16,0b00100001
out admux,r16
;ADEN = 1
;ADSC = 1
;ADPS = 001; division by 2
ldi r16,0b11000001
out adcsr,r16
;Ждём ADIF=1
start_03:
in r16,adcsr
andi r16,16
breq start_03
;Сбросим ADIF
ldi r16,0b10010001
out adcsr,r16
in r16,adch
mov r17,r16
andi r17,128
out porta,r17
out ocr1b,r16
rcall pause
rjmp forever
pause:
;Ждём TOV0
pause_01:
in r16,tifr
andi r16,2
breq pause_01
;Clear TOV0
ldi r16,2
out tifr,r16
ldi r16,128
out tcnt0,r16
ret
Запускается периферия, затем в цикле измеряется напряжение с нулевого входа АЦП, выводится в первый канал PWM,
после этого измеряется напряжение на первом входе АЦП, выводится во второй канал PWM.
Светодиод на PA7 отображает состояние старшего бита данных с АЦП для второго канала.
Имеем странный результат: вращая ручку переменного резистора, подключенного делителем к первому входу АЦП
длительность импульса выходного сигнала сначала плавно увеличивается, потом доходит до максимума и затем резко обрывается, падая в ноль.
Это происходит где-то после 75% шкалы.
Светодиод при этом светится, то есть это не АЦП.
Далее, проверяем PWM.
С этой целью запускаем след. код на микроконтроллере:
CODE
.include "avr000/tn26def.inc"
.cseg
.org 0
start:
ldi r16,RAMEND
out sp,r16
ldi r16,0b00001111
out ddrb,r16
ldi r16,2
out pllcsr,r16
start_01:
in r16,pllcsr
andi r16,1
breq start_01
ldi r16,6
out pllcsr,r16
ldi r16,254
out ocr1a,r16
out ocr1b,r16
ldi r16,255
out ocr1c,r16
ldi r16,0b01010011
out tccr1a,r16
ldi r16,0b10000011
out tccr1b,r16
forever:
rjmp forever
.cseg
.org 0
start:
ldi r16,RAMEND
out sp,r16
ldi r16,0b00001111
out ddrb,r16
ldi r16,2
out pllcsr,r16
start_01:
in r16,pllcsr
andi r16,1
breq start_01
ldi r16,6
out pllcsr,r16
ldi r16,254
out ocr1a,r16
out ocr1b,r16
ldi r16,255
out ocr1c,r16
ldi r16,0b01010011
out tccr1a,r16
ldi r16,0b10000011
out tccr1b,r16
forever:
rjmp forever
Код инициализирует периферию и запускает таймер-счётчик с коэффициентом 254 на обоих каналах PWM
Код работает.
Не могу понят, что происходит в системе, если у кого-нибудь есть опыт или идеи, прошу поделиться.