Народ помогите пожалуйста, проблема с интерпатом INT0

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 8
Зарегистрирован: Чт окт 16, 2014 14:28:17

Сообщение djanchino »

Друзья помогите !!! У меня подключены к порту Б 8 светодиодов, и задача в том что бы что бы они моргали по очередности с применением интерапта. При нажатии кнопки который подключен к pind2 все работает они моргают, но проблема в том что нужно чтобы они останавливали моргать при повторном нажатии , а при последующем продолжали. Буду при много благодарен !!!

.ORG 0x0000 rjmp RESET
.ORG 0x0001
rjmp INT_0

RESET:

ldi R16,0b11111111
out DDRB,R16
ldi R16,0b00000000
out PORTB,R16
ldi r16, RAMEND
out SPL,r16
ldi R16,0b01000000
out GIMSK,R16
ldi r16,0b00000011
out MCUCR,r16
sei
MAIN:

nop
nop


rjmp MAIN


timer:

ldi r16, 255
ldi r17,100
ldi r18, 0
loop:
subi r16,1
sbci r17,0
sbci r18,0
brcc loop
ret


led_switch:


ldi R16,0b00000001
out PORTB,R16
rcall timer
ldi R16,0b00000010
out PORTB,R16
rcall timer
ldi R16,0b00000100
out PORTB,R16
rcall timer
ldi R16,0b00001000
out PORTB,R16
rcall timer
ldi R16,0b00010000
out PORTB,R16
rcall timer
ldi R16,0b00100000
out PORTB,R16
rcall timer
ldi R16,0b01000000
out PORTB,R16
rcall timer
ldi R16,0b10000000
out PORTB,R16
rcall timer

rjmp led_switch


INT_0:

sbic portb,0
rjmp mi_ban
rjmp led_switch




reti






ааа:

ldi R16, 0b00000000
out PORTB,R16

reti
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

.ORG 0x0000[cоde][/cоde]
Весьма оригинальное использование тегов.
INT_0:
sbic portb,0
rjmp mi_ban
rjmp led_switch
reti
Метка mi_ban нигде не определена.
При нажатии кнопки который подключен к pind2 все работает они моргают, но проблема в том что нужно чтобы они останавливали моргать при повторном нажатии , а при последующем продолжали. Буду при много благодарен !!!
Судя по коду, Вы не понимаете суть прерываний. Попробуйте сначала обойтись без них, этот код все равно пригодится. Последовательность разработки программы может быть, например, такой:
1. Написать программу мигания. Лучше не прямой записью значений, а побитовым сдвигом (lsl / lsr / lor / ror), это займет гораздо меньше места в памяти. Один цикл - одно изменение состояния диодов. То есть на 1 итерации будет 0b00000001, на второй - 0b00000010 и так далее.
2. Добавить обработку кнопки (без прерываний, тупо проверкой PINx), чтобы, если она нажата, итерация мигания выполнялась, если нет - нет.
3. Добавить переменную-флаг, которая будет индицировать состояние вкл/выкл и переключаться кнопкой, а сама управляла миганием.
4. Если необходимость использования прерываний сохранилась (в чем я сомневаюсь - кнопка того не стоит) - перенести обработку кнопки в прерывание.
5. Добавить защиту от дребезга.
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Микроконтроллер какой?

Вот это тоже не понятно кто вызвает..
djanchino писал(а):ааа:

ldi R16, 0b00000000
out PORTB,R16

reti
Нигде нет вызова этой процедурки. Понятно, что программа простая, но можно было регистры как-нибудь обозвать, да и комментарии написать...
В любом случае..
COKPOWEHEU писал(а):Метка mi_ban нигде не определена.
Это тоже вам логично описали...

и все равно, даже если прерывание, с кнопки может идти такой дребезг, что может вызвать прерывание несколько раз..

Пусть вызвали прерывание.. Вот такое обычно я писал не так, просто не знаю, можно ли константу сравнивать с регистром ввода-вывода???? что-то сомневаюсь......
djanchino писал(а):sbic portb,0
Я обычно сначала отправляю все в темп, а потом уже манипуляции...
Да и вообще общее оформление программы... Подключенные библиотеки (инклуды, дефайны и т.д.), описание прерываний, обработчики прерываний, инициализация контроллера, основной цикл, подпрограммы и процедуры... все можно логично оформить и закомментировать...

Программу в МК залили? Она там работает или в протеусе?

А по сути, вам надо где-то в прерывании менять флаг постоянно на противоположное значение, которое в главном цикле будет определять, мигать светодиодоам или нет. Да и лучше все действительно, как сказали выше, сделать все сдвигом.. ))) Так даже меньше писать. )

НУ и вообще, писать команду RJMP из прерывания куда-то на... :facepalm: ПО сути и будет обработчиком прерывания. МОжно было не отправлять, а все в прерывании и делать, хотя это не правильно...
Станислав
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

> Вот такое обычно я писал не так, просто не знаю, можно ли константу сравнивать с регистром ввода-вывода???? что-то сомневаюсь......
>> sbic portb,0
Это не сравнение, а проверка нулевого бита. skip if bit in I/O cleared, пропустить следующую команду если бит в регистре ввода-вывода сброшен. Возможно, здесь имелся в виду не PORTB, a PINB.
> Я обычно сначала отправляю все в темп, а потом уже манипуляции...
Лишний такт и 2 байта экономятся если без буферизации
> Программу в МК залили? Она там работает или в протеусе?
Учитывая прыжок хз куда, работать она не может нигде
> А по сути, вам надо где-то в прерывании менять флаг постоянно на противоположное значение, которое в главном цикле будет определять, мигать светодиодоам или нет.
В моем списке это пункты 3-4
> НУ и вообще, писать команду RJMP из прерывания куда-то на..
там не просто rjmp а ветвление. Выполняется, конечно, в прерывании, что плохо. И оформлено криво - кусок здесь, кусок там.
Реклама
Эиком - электронные компоненты и радиодетали
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

COKPOWEHEU писал(а):не сравнение, а проверка нулевого бита. skip if bit in I/O cleared,
Признаю. вспомнил такую команду. ))) Как всегда, подвело, что не все команды работают со всеми регистрами...

Кстати, про защиту от дребезга я тоже писал... , как и вы. )))))
СКАЗОЧНИК писал(а): даже если прерывание, с кнопки может идти такой дребезг, что может вызвать прерывание несколько раз..
И я не понимаю логику.. ЗАчем в прерывании проверять чистый ли бит 0 порта В??? Если на нем висят светодиоды...
Станислав
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Пусть сначала реализует хотя бы лобовое решение, добавить защиту от дребезга можно и простой задержкой (не в прерывании, разумеется).
Реклама
Родился
Сообщения: 8
Зарегистрирован: Чт окт 16, 2014 14:28:17

Сообщение djanchino »

СКАЗОЧНИК писал(а):
COKPOWEHEU писал(а):не сравнение, а проверка нулевого бита. skip if bit in I/O cleared,
Признаю. вспомнил такую команду. ))) Как всегда, подвело, что не все команды работают со всеми регистрами...

Кстати, про защиту от дребезга я тоже писал... , как и вы. )))))
СКАЗОЧНИК писал(а): даже если прерывание, с кнопки может идти такой дребезг, что может вызвать прерывание несколько раз..
И я не понимаю логику.. ЗАчем в прерывании проверять чистый ли бит 0 порта В??? Если на нем висят светодиоды...



Уважаемый сказочник я проверяю чистый ли бит 0 порта В , потому что мне нужно узнать включен ли мой первый светодиод , потому что с него и все начинается, если нет то программа входит в метку led_switch.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Как там прогресс, на каком этапе? Или ждете, пока кто-нибудь напишет готовое?
Ответить

Вернуться в «AVR»