ATmega164P. Отладчик AVRdragon и Studio Проблема в следующем ,при прогоне программы с подключённым макетом АЦП ведёт себя как ему и положено , но стоит запрограмировать микросхему и запустить в автономке АЦП просыпается только по прерыванию от таймера , в моем случае через секунду. FUSES выставлены - проблем я с ними не вижу. Ниже привожу код , может всё таки что-то упустил. Конечно многое отсёк оставив только относящееся к АЦП. HELP
Код
***********************
; * *
; * *
; * ATMega 164P *
; * *
; ***********************
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m164pdef.inc"
.DEVICE ATmega164P
.org ADCCaddr
jmp ADC3 ; ADC Conversion Complete
; *****************************
; * *
; * Initialization АЦП *
; * *
; * *
; *****************************
ldi temp,(1<<REFS0)|(1<<ADLAR)
sts ADMUX,temp ; Внешнее напряжение AVcc, выравнивание влево
ldi temp,(1<<ADC0D) ; Отключение цифрового контакта от
sts DIDR0,temp ; PORTA pin0
clr temp
sts ADCSRB,temp
ldi temp,(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
sts ADCSRA,temp ; |(0<<ADSC) Преобразование отключено
; АЦП вкл. Прерывание разрешено . Делитель на 64 = 187,5 Кгц частота
; преобразования
; *****************************
; * *
; * Подпрограмма обнаружения *
; * *
; * *
; *****************************
TIM2COMPB:
cli
push temp
push count
in temp,SREG
push temp
ldi Cnt0,Low(255); Инициализация счётчика преобразований
clr rab ; Очиска рабочих регистров
clr mean0
clr mean1
clr ZH
clr ZL
cbi PORTB,0
ADC1:
ldi temp,(1<<SE)|(1<<SM0) ; Настройка режима "сна"
out SMCR,temp ; Запись SMCR
sei
sleep ; Преобразование
dec Cnt0 ;
brne ADC1 ; Если не равно 255 - преобразование
ldi count,$08 ; Начинаем процедуру вычисления среднего
ADC5: lsr mean1 ; 255=2 в степени 8
ror mean0 ; сдвигаем регистры в право 8 раз
dec count
brne ADC5 ; Конец процедуры вычисления среднего
ldi temp,(0<<SE)|(1<<SM0); Выход из режима "сна"
out SMCR,temp
pop temp
out SREG,temp
pop count
pop temp
sbi PORTB,0
sei
rjmp CHECK
; *****************************
; * *
; * Вычисление среднего
; * *
; *****************************
ADC3:
cli
ldi temp,(0<<SE)|(1<<SM0) ; Выход из режима "сна"
out SMCR,temp ; Запись SMCR
lds rab,ADCH ; Считывание только старшего регистра
clr temp
add mean0,rab ; Вычисление среднего
adc mean1,temp ; Вычисление среднего
ret
; *****************************
; * *
; * Таблица значений для ADC
*
; *****************************
tabADC: .db $00,$01,$4A,$4B,$4C,$95,$96,$97
.db $B4,$B5,$B6,$7E,$7F,$80,$FE,$FF
Пояснения
TIM2COMPB: это прерывание от таймера по которому и запускается АЦП- убрано за ненадобностью