Demontrup писал(а):Ребята в процессе отладки в Протеусе выяснил что у меня не работает АЦП, кто может сказать почему? вот переписал без всего лишнего:
Тактовая частота контроллера какая?
Код: Выделить всё
start:
sbi adcsra,ADSC
_wait_adc:
sbic adcsr,ADSC
rjmp _wait_adc
in r17, ADCL
in r18, ADCHКод: Выделить всё
start:
sbi adcsra,ADSC ;запуск АЦП
_wait_adc:
sbis ADCSRA,ADIF ;ждем конца преобразования(ADIF=1)
rjmp _wait_adc
sbi ADCSRA,ADIF ;сбрасываем флаг ADIF
in r17, ADCL
in r18, ADCHDemontrup писал(а):Ну в Студии у меня тоже все работает.. и даже когда я это код для АЦП просто в программу пихаю.. а вот в прерывании в Протеусе не хочет и все.... может дело в симуляторе?
Код: Выделить всё
ldi r19, (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
out ADCSRA, r19Demontrup писал(а):....Мне надо чтобы при попадании в определенный диапазон чисел я попадал на метку иначе дальше, как это реализовать на асме? например есть число 125 и два диапазона: 0-127(переход на метку 1), 128-255 (переход на метку 2), не догоню как слепить..))
Код: Выделить всё
; r16 - число
cpi r16, 127 ; сравниваем число с 127
brcc metka1 ; если флаг переноса не установлен, т. е. r16 меньше или равно 127, то переходим на метку1, иначе далее
; далее поскольку если беззнаковое целое 8-ми битное число больше
; 127, то оно в любом случае входит в диапазон 128-255, т. е здесь
; сразу может быть метка 2
metka2:
...some code;
rjmp end_of_compare
metka1:
...some code;
rjmp end_of_compare;
end_of_compare:Alexeus писал(а):понятно что прочесть придется весь порт in r16,pinb
Код: Выделить всё
sbic PINB,0 ; если пин 0 порта B сброшен, то сл. команду пропустить
rjmp _clear ; прыгаем на сброс B1 в "0"
sbi PORTB,1 ; ставим в "1" бит 1 порта B
rjmp _end ; всё сделали, уходим
_clear:
cbi PORTB,1 ; обнуляем бит 1 порта B
_end:Код: Выделить всё
in tmpa,PINB ;читаем пины порта B
com tmpa ;инвертируем (это для твоего алгоритма)
bst tmpa,0 ;запоминаем в T значение 0-го бита
cli ;запрет прерываний. Это надо только если есть прерывания, работающие с портом B
in tmpa,PORTB ;читаем текущее состояние PORTB
bld tmpa,1 ;пишем T в 1-й бит
out PORTB,tmpa ;выводим в порт
sei ;разрешение прерываний. Если выше была команда cliКод: Выделить всё
;tmpb содержит байт, биты 0-3 которого надо вывести в порт B
in tmpa,PORTB
andi tmpa,0b11110000
andi tmpb,0b00001111
or tmpa,tmpb
out PORTB,tmpaКод: Выделить всё
ldi TMP_Y,(1<<CS00)+(1<<CS01);запускаем счетчик OSC/64 = 1.015 msec
out TCCR0B,TMP_Y ; предделитель в регистр записался
ldi TMP_Y,1<<TOV0 ; здесь в регистр записыветься
out TIFR0,TMP_Y ; а здесь не как не перемещается и через sts тож не в какую
ldi TMP_Y,1<<TOIE0 ; здесь в регистр записыветься
sts TIMSK0,TMP_Y ;Установливаеться флаг для прерывания по переполнению