Тестовая схема простецкая
процессор AT90S2313
.def Temp=R16
.def Flag=R17
.cseg
.org 0
........ сдеся вся байда по настройке прерываний на 1 сек (это усе работает)
ldi Temp,0b11111110 ;настройка портов на вывод/ввод (0)
out DDRB,Temp
ldi Temp,0b11111100 ;настройка портов на вывод/ввод (0, 1)
out DDRD,Temp
; на разряды 0 и 1 порта Д и на 0 порт Б подцеплены кнопеи на замыкание
подтягивающие резисторы на +5 естествено стоят
на вывод 1 порта Б повешан светодиод
в обработчике прерывание 1 раз в сек устанавливается и збрасывается флаг
по этому флагу в основном цикле если флаг установлен светодиод горит если сброшен
погашен (вобщем мигает с частотой 1 сек) как я говорил это усе работает
главный цикл
start:
cpi Flag,1
brne ledoff ;если флаг не 1 то гасим светодиод иначе зажигаем
ldi Temp,0b00000000 ;зажигаем светодиод
out PORTB,Temp
rjmp start
ledoff:
ldi Temp,0b00000010 ;гасим светодиод
out PORTB,Temp
rjmp start
потребовалось при нажатии на кнопку (допустим на 0 разряде порта Б)
чтоб светодиод светился постоянно вне зависимости от флага
start:
in Temp,PinB ;читаем порт
andi Temp,0b00000000 ;маскируем
cpi Temp,0 ; если нажата клавиша то зажигаем
breq ledon ; иначе как обычно в зависимости от флага
cpi Flag,1
brne ledoff ;если флаг не 1 то гасим светодиод иначе зажигаем
ledon: ldi Temp,0b00000000 ;зажигаем светодиод
out PORTB,Temp
rjmp start
ledoff:
ldi Temp,0b00000010 ;гасим светодиод
out PORTB,Temp
rjmp start
так вот после этого изменения прога не работает
на нажате клавиши ваще нет реакции
и попутно вопрос по подавлению дребезга
кто как делает (желательно алгоритм или примерчик на АСМе
Всего хорошего всем
процессор AT90S2313
.def Temp=R16
.def Flag=R17
.cseg
.org 0
........ сдеся вся байда по настройке прерываний на 1 сек (это усе работает)
ldi Temp,0b11111110 ;настройка портов на вывод/ввод (0)
out DDRB,Temp
ldi Temp,0b11111100 ;настройка портов на вывод/ввод (0, 1)
out DDRD,Temp
; на разряды 0 и 1 порта Д и на 0 порт Б подцеплены кнопеи на замыкание
подтягивающие резисторы на +5 естествено стоят
на вывод 1 порта Б повешан светодиод
в обработчике прерывание 1 раз в сек устанавливается и збрасывается флаг
по этому флагу в основном цикле если флаг установлен светодиод горит если сброшен
погашен (вобщем мигает с частотой 1 сек) как я говорил это усе работает
главный цикл
start:
cpi Flag,1
brne ledoff ;если флаг не 1 то гасим светодиод иначе зажигаем
ldi Temp,0b00000000 ;зажигаем светодиод
out PORTB,Temp
rjmp start
ledoff:
ldi Temp,0b00000010 ;гасим светодиод
out PORTB,Temp
rjmp start
потребовалось при нажатии на кнопку (допустим на 0 разряде порта Б)
чтоб светодиод светился постоянно вне зависимости от флага
start:
in Temp,PinB ;читаем порт
andi Temp,0b00000000 ;маскируем
cpi Temp,0 ; если нажата клавиша то зажигаем
breq ledon ; иначе как обычно в зависимости от флага
cpi Flag,1
brne ledoff ;если флаг не 1 то гасим светодиод иначе зажигаем
ledon: ldi Temp,0b00000000 ;зажигаем светодиод
out PORTB,Temp
rjmp start
ledoff:
ldi Temp,0b00000010 ;гасим светодиод
out PORTB,Temp
rjmp start
так вот после этого изменения прога не работает
на нажате клавиши ваще нет реакции
и попутно вопрос по подавлению дребезга
кто как делает (желательно алгоритм или примерчик на АСМе
Всего хорошего всем
