Код под спойлером
Спойлер
Код: Выделить всё
.include "8535def.inc" ;файл определений AT90S8535
.def temp = r16 ;временный регистр
.def reg_led = r19 ;регистр индикации
.org $0
rjmp init
.org $001
rjmp inter
.org $00E
rjmp analog
init:
ldi temp,low(RAMEND) ;установка
out SPL,temp ; указателя стека
ldi temp,high(RAMEND) ; на последнюю
out SPH,temp ; ячейку ОЗУ
ser temp ;порт PC
out DDRC,temp ; на вывод
out PORTC,temp
ldi temp,0xFB ;инициализация 2-ого вывода
out DDRD,temp ; порта PD на ввод
clr temp ;аналоговые входы
out DDRA, temp ; порта PA,
ldi temp,0x40 ;разрешение внешнего
out GIMSK,temp ; прерывания
ldi temp,0x02 ;обработка прерывания INT0
out MCUCR,temp ; по перепаду 1/0
ldi temp, 0x8D ; ADEN=1, ADIE=1, Fadc=Fclk/32
out ADCSR, temp
ldi temp, 0 ; Канал 0 АЦП (вход PA0)
out ADMUX, temp
sei ;разрешение прерываний
sbi ADCSR, ADSC ;пуск преобразования
loop: ;цикл ожидания прерываний
rjmp loop
;обработка прерывания от АЦП
analog:
in r18, ADCL ;считывание ADCL:ADCH
in r17, ADCH
reti
; Обработка внешнего прерывания от кнопки для просмотра результатов.
inter:
cbi ADCSR, ADIE ;запрет прерывания от АЦП
mov reg_led, r17 ;скопируем r17 в reg_led
com reg_led ;дополнение до 1
cp r17,r18 ;сравнение регистра
brcs r17_less ;переход на метку, если установлен флаг переноса, т.е. r17 меньше
rjmp t0 ;переход на метку, если r18 меньше
r17_less:
out PORTC, reg_led ;вывод на порт C
reti
t0:
mov reg_led, r18 ;скопируем r18 в reg_led
com reg_led ;дополнение до 1
out PORTC, reg_led ;вывод на порт C
sbi ADCSR, ADIE ;разрешение прерывания с АЦП
sbi ADCSR, ADSC ;пуск преобразования
reti
В итоге всегда выводит в порт C один и тот же результат, не могу понять почему.В чем ошибка?
Собрал в протеусе схемку, но к успеху это не привело. скрин под спойлером
Спойлер

