hardbar Опубликовано 14 августа, 2013 Автор Поделиться Опубликовано 14 августа, 2013 (изменено) На смысловые блоки не разбивал но прокоментировал. С макросами буду учиться. Изменено 14 августа, 2013 пользователем hardbar 1 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Григорий Т. Опубликовано 14 августа, 2013 Поделиться Опубликовано 14 августа, 2013 А разрешить прерывания по INT0? И чем оно будет вызываться, кнопкой? 0 Никогда не спорьте с дураком - люди могут не заметить между вами разницы Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
hardbar Опубликовано 14 августа, 2013 Автор Поделиться Опубликовано 14 августа, 2013 Вызываеться подачей сигнала на ногу int0. А как разрешить прерывания??? 1 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Григорий Т. Опубликовано 14 августа, 2013 Поделиться Опубликовано 14 августа, 2013 hardbar, вы не путайте форум с даташитом. Полистайте, почитайте. 1 Никогда не спорьте с дураком - люди могут не заметить между вами разницы Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 14 августа, 2013 Поделиться Опубликовано 14 августа, 2013 Комментарии делаются тоже по смыслу, а не по описанию команды. Не сочтите за носотыканье. Все это дружеский совет, который вам в дальнейшем обязательно поможет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Григорий Т. Опубликовано 14 августа, 2013 Поделиться Опубликовано 14 августа, 2013 Раздел 9, называется Interrupts. 0 Никогда не спорьте с дураком - люди могут не заметить между вами разницы Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 14 августа, 2013 Автор Поделиться Опубликовано 14 августа, 2013 (изменено) По гуглил почитал даташит. Прерывания заработало но програма начинаеться с прерывания потом работает нормально. Вот скрины. Запуск програмы видно что почемуто начало с прерывания а не с основного кода. Дале програма работает норм. Вызов прерывания тоже норм. После нажатия клавиши, преривания дает по 2 импулься в каждую линию. Вот код. .include "tn13adef.inc" .list .def temp=r16 ;переименуем регистр под удобное имя .equ kdel=50 ;добавим константу .equ kdel2=100 ;добавим константу ;----------------------------------------------------- ;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ ;----------------------------------------------------- .cseg ;выбор памяти. внашем случае работаем с flesh. .org 0 ;начальный адрес rjmp reset;прерывание по сбросу rjmp int_0;прерывание по порту int0 .org 0x0b ;чтоб не писать reti много раз вместо векторов прерываний.сразу пропускаем их командой. ;----------------------------------------------------------------------------- ;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ;----------------------------------------------------------------------------- reset: ; ldi temp,ramend ;чтото с памятю связано out spl,temp ; ldi temp,(0<<ISC00)|(1<<ISC01) ;Условие прерывания - наростающий фронт сигнала out MCUCR,temp ldi temp,(1<<INT0) ;INT.Enable=1 Разрешаем прерывание INT0 out GICR,temp ldi temp,0b11111100;настройка порта на out ddrb,temp ;вод.вывод ldi temp,0b00000011;подтяжка резистрами out portb,temp ;установка в порте лог.0 ldi temp,0x05 ;пред-делитель out tccr0b,temp ;таймера ldi temp,0x80 ;отключение out acsr,temp ;чегото там sei ;завершенеи прерывание по сбросу ;------------------------------------------- ;ОСНОВНАЯ ПРОГРАМА. ;------------------------------------------- main: ;имя части програмы ldi r17,0b00001000 ;установка порта в 0 rcall mak1 ;вызов подпрограмы rcall wait1 ;вызов задержки ldi r17,0b00000100 ;установка порта в 1 rcall mak1 ;вызов подпрограмы rcall wait1 ;вызов задержки rjmp main ;безусловный переход ;---------------------------------------------------; ;ПРЕРЫВАНИЯ ;---------------------------------------------------; int_0: ;метка вызова прерываный по порту int0 push temp ;сохранение регистра в стеке in temp,SREG push temp ldi temp,2 ;запись в регистер числа 2 m3: sbi portb,2 ;установка порта в 0 rcall wait2 ;вызов задержки cbi portb,2 ;установка порта в 1 rcall wait2 ;вызов задержки m4: sbi portb,3 ;установка порта в 0 rcall wait2 ;вызов задержки cbi portb,3 ;установка порта в 1 rcall wait2 ;вызов задержки dec temp ;РОН:=РОН-1 brne m3 ;проверка РОН не ноль ли?? да едем дальше, нет возврат на метку pop temp out SREG,temp pop temp ;востановления регистра из стека reti ;конец прерывания ;---------------------------------------------------------------------; ;ПОДПРОГРАМЫ ;---------------------------------------------------------------------; mak1: ldi temp,3 ;запись в регистер 3 m2: out portb,r17 ;установка порта в 0 rcall wait1 ;вызов задержки out portb,r18 ;установка порта в 1 rcall wait1 ;вызов задержки dec temp ;РОН:=РОН-1 brne m2 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку ret wait1: ;Все что снизу задержка на таймере. push temp ldi temp,0 out tcnt0,temp wt1: in temp,tcnt0 cpi temp,kdel brlo wt1 pop temp ret wait2: push temp ldi temp,0 out tcnt0,temp wt2: in temp,tcnt0 cpi temp,kdel2 brlo wt2 pop temp ret Изменено 15 августа, 2013 пользователем hardbar 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Григорий Т. Опубликовано 14 августа, 2013 Поделиться Опубликовано 14 августа, 2013 У вас прерывание задано по низкому уровню на INT0. А что за регистр GICR ? 0 Никогда не спорьте с дураком - люди могут не заметить между вами разницы Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 Это новое название GIMSK. Адрес $3b. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 (изменено) Коментар не правельно написал.Уже исправил. У меня кнопка на минусе сидит а пин порта к плюсу подтянут. Когда кнопка нажимаеться на пин порта поступает минус, то есть спадающий фронт. Но почему прерывание срабатывает в начале когда кнопка не нажата. Изменено 15 августа, 2013 пользователем hardbar 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 Потому что изначально у вас установлен флаг прерывания. В начале программы, до разрешения прерывания, очистите флаг прерывания записью в него 1. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 Спасибо запретыл прерывание. И все работает норамльно. ;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ ;-------------------------------------- .cseg ;выбор памяти. внашем случае работаем с flesh. .org 0 ;начальный адрес rjmp reset;прерывание по сбросу rjmp int_0;прерывание по порту int0 .org 0x0b ;чтоб не писать reti много раз вместо векторов прерываний.сразу пропускаем их командой. ;---------------------------------------- ;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ; reset: ; cli ;запрет прерывания ldi temp,ramend ;чтото с памятю связано out spl,temp ; ldi temp,(0<<ISC00)|(1<<ISC01) ;Условие прерывания - наростающий фронт сигнала out MCUCR,temp ldi temp,(1<<INT0) ;INT.Enable=1 Разрешаем прерывание INT0 out GICR,temp ldi temp,0b11111100;настройка порта на out ddrb,temp ;вод.вывод ldi temp,0b00000011;подтяжка резистрами out portb,temp ;установка в порте лог.0 ldi temp,0x05 ;пред-делитель out tccr0b,temp ;таймера ldi temp,0x80 ;отключение out acsr,temp ;чегото там ldi r19,200 sei ;разрешение прерывания 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 Вопрос есть ли команда с точностю наоборот повторяющая SUBI. Нужно в AVR Studio. сложить РОН с числом без переноса. Даташит не помог, и в списке команд avr asm тоже не нашел. Там есть только команда ADD сложение РОН с РОН. 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 (изменено) Вычитайте отрицательное число или вначале число в РОН, а уж потом ADD POH1,POH. PS. правильно говорить не "с числом", а "с константой". Изменено 15 августа, 2013 пользователем korsaj 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 (изменено) Опять проблема. После второго нажатия кнопки программа зависает. .include "tn13adef.inc" .list .def temp=r16 ;переименуем регистр под удобное имя ;-------------------------------------- ;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ ;-------------------------------------- .cseg ;выбор памяти. внашем случае работаем с flesh. .org 0 ;начальный адрес rjmp reset;прерывание по сбросу .org 2 rjmp int_0;прерывание по порту int0 .org 0x0b ;чтоб не писать reti много раз вместо векторов прерываний.сразу пропускаем их командой. ;------------------------------------------ ;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ;------------------------------------------ reset: ; cli ;запрет прерывания ldi temp,ramend ;чтото с памятю связано out spl,temp ; ldi temp,0b00000100;3 пину разрешено рерыване out PCMSK,temp ldi temp,(1<<PCIE) ; глобальное разрешение прерывния для пинов порта out GIMSK,temp ldi temp,0b11111000;настройка порта на out ddrb,temp ;вод.вывод ldi temp,0b00000111;подтяжка резистрами out portb,temp ;установка в порте лог.0 ldi temp,0x05 ;пред-делитель out tccr0b,temp ;таймера ldi temp,0x80 ;отключение out acsr,temp ;чегото там ldi r19,100 ldi r21,200 sei ;разрешение прерывания ;------------------------------------------- ;ОСНОВНАЯ ПРОГРАМА. ;------------------------------------------- main: cpi r20,0 ;сравнение с РОН breq pro1 ;если равно переход по метке cpi r20,1 ;сравнение с РОН breq pro2 ;если равно переход по метке cpi r20,2 ;сравнение с РОН breq pro3 ;если равно переход по метке cpi r20,3 ;сравнение с РОН breq pro4 ;если равно переход по метке cpi r20,4 ;сравнение с РОН breq reg ;если равно переход по метке rjmp main pro1: ;имя части програмы: ldi r17,0b00010111 ;установка порта в 0 rcall mak1 ;вызов подпрограмы rcall wait1 ;вызов задержки ldi r17,0b00001111 ;установка порта в 1 rcall mak1 ;вызов подпрограмы rcall wait1 ;вызов задержки rjmp main ;безусловный переход pro2: ;програма мерцания светодиодом cbi portb,4 rcall wait1 sbi portb,4 rcall wait1 rjmp main pro3: ;програма мерцания светодиодом cbi portb,3 rcall wait1 sbi portb,3 rcall wait1 rjmp main pro4: ;програма мерцания 2 светодиодами ldi r18,0b00000111 ldi r17,0b00011111 out portb,r17 rcall wait2 out portb,r18 rcall wait2 rjmp main ;---------------------------------------------------; ;ПРЕРЫВАНИЯ ;---------------------------------------------------; int_0: ;метка вызова прерываный по порту int0 cli nop sbic portb,2 inc r20 sei reti ;---------------------------------------------------------------------; ;ПОДПРОГРАМЫ ;---------------------------------------------------------------------; mak1: ldi temp,3 ;запись в регистер 3 m4: out portb,r17 ;установка порта в 0 rcall wait1 ;вызов задержки out portb,r18 ;установка порта в 1 rcall wait1 ;вызов задержки dec temp ;РОН:=РОН-1 brne m4 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку ret wait1: ;Все что снизу задержка на таймере. push temp ldi temp,0 out tcnt0,temp wt1: in temp,tcnt0 cp temp,r19 brlo wt1 pop temp ret wait2: ;Все что снизу задержка на таймере. push temp ldi temp,0 out tcnt0,temp wt2: in temp,tcnt0 cp temp,r21 brlo wt2 pop temp ret reg: ;обнуление РОНа ldi r20,0 ret Изменено 15 августа, 2013 пользователем hardbar 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 (изменено) Кто мешает сложить константу с регистровой парой? hardbar, сделай одну функцию wait и перед вызовом загружай разные задержки в регистр R19(R21). А сейчас у тебя слишком много повторяющегося кода, читать сложно. Изменено 15 августа, 2013 пользователем Геннадий 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 Вот это reg: ;обнуление РОНа ldi r20,0 ret Неправильно. Это вызовет переполнение стека. Вы перешли сюда по метке, а не вызвали подпрограмму. Так вот, если переходите по метке то и уходите по метке. нужно так: reg: ;обнуление РОНа ldi r20,0 rjmp main 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Григорий Т. Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 (изменено) int_0: ;метка вызова прерываный по порту int0 cli nop sbic portb,2 inc r20 sei reti Красным всё лишнее. Изменено 15 августа, 2013 пользователем Григорий Т. 0 Никогда не спорьте с дураком - люди могут не заметить между вами разницы Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 (изменено) .include "tn13adef.inc" .list .def temp=r16 ;переименуем регистр под удобное имя ;-------------------------------------- ;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ ;-------------------------------------- .cseg ;выбор памяти. внашем случае работаем с flesh. .org 0 ;начальный адрес rjmp reset ;прерывание по сбросу .org 2 rjmp int_0 ;прерывание по порту int0 .org 0x0b ;------------------------------------------ ;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ;------------------------------------------ reset: ; cli ;запрет прерывания ldi temp,ramend ;чтото с памятю связано out spl,temp ; ldi temp,0b00000100 ;3 пину разрешено рерыване out PCMSK,temp ldi temp,(1<<PCIE) ;глобальное разрешение прерывния для пинов порта out GIMSK,temp ldi temp,0b11111000 ;настройка порта на out ddrb,temp ;вод.вывод ldi temp,0b00000111 ;подтяжка резистрами out portb,temp ;установка в порте лог.0 ldi temp,0x05 ;пред-делитель out tccr0b,temp ;таймера ldi temp,0x80 ;отключение out acsr,temp ;чегото там ldi r19,100 ldi r21,200 sei ;разрешение прерывания ;------------------------------------------- ;ОСНОВНАЯ ПРОГРАМА. ;------------------------------------------- main: cpi r20,0 ;сравнение с РОН breq pro1 ;если равно переход по метке cpi r20,1 ;сравнение с РОН breq pro2 ;если равно переход по метке cpi r20,2 ;сравнение с РОН breq pro3 ;если равно переход по метке cpi r20,3 ;сравнение с РОН breq pro4 ;если равно переход по метке cpi r20,4 ;сравнение с РОН brne main ;если НЕ равно переход по метке ldi r20,0 ;обнуление РОНа rjmp main ;------------------------------------------- pro1: ldi r17,0b00010111 ;установка порта в 0 rcall mak1 ;вызов подпрограмы rcall wait1 ;вызов задержки ldi r17,0b00001111 ;установка порта в 1 rcall mak1 ;вызов подпрограмы rcall wait1 ;вызов задержки rjmp main ;безусловный переход ;------------------------------------------- pro2: ;програма мерцания светодиодом cbi portb,4 rcall wait1 sbi portb,4 rcall wait1 rjmp main ;------------------------------------------- pro3: ;програма мерцания светодиодом cbi portb,3 rcall wait1 sbi portb,3 rcall wait1 rjmp main ;------------------------------------------- pro4: ;програма мерцания 2 светодиодами ldi r17,0b00011111 out portb,r17 rcall wait2 ldi r18,0b00000111 out portb,r18 rcall wait2 rjmp main ;---------------------------------------------------; ;ПРЕРЫВАНИЯ ;---------------------------------------------------; int_0: ;метка вызова прерываний по порту int0 ;cli Эта команда здесь лишняя ;nop Эта команда здесь лишняя sbic portb,2 inc r20 ;sei Эта команда здесь лишняя reti ;Если в прерывании есть команда которая воздействует на флаги, то ;необходимо при входе в прерывание сохранить регистр статуса SREG ;Если этого не сделать то в программе будут всевозможные,непредсказуемые сбои. ;---------------------------------------------------------------------; ;ПОДПРОГРАМЫ ;---------------------------------------------------------------------; mak1: ldi temp,3 ;запись в регистер 3 m4: out portb,r17 ;установка порта в 0 rcall wait1 ;вызов задержки out portb,r18 ;установка порта в 1 rcall wait1 ;вызов задержки dec temp ;РОН:=РОН-1 brne m4 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку ret ;---------------------------------------------------------------------; ; ПП задержки 1 ;---------------------------------------------------------------------; wait1: ;Все что снизу задержка на таймере. push temp ldi temp,0 out tcnt0,temp wt1: in temp,tcnt0 cp temp,r19 brlo wt1 pop temp ret ;---------------------------------------------------------------------; ; ПП задержки 2 ;---------------------------------------------------------------------; wait2: ;Все что снизу задержка на таймере. push temp ldi temp,0 out tcnt0,temp wt2: in temp,tcnt0 cp temp,r21 brlo wt2 pop temp ret Движок форума ужасен, замучился вставлять код!!! Изменено 15 августа, 2013 пользователем korsaj 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 На счет РОНа вы не поняли. Каждый раз когда нажимаеться кнопка срабатывает прерывание которое добавляет в РОН r20 по +1. и Он должен обнуляться если значение РОНа дошло до 4. Ведь по РОНу определяеться какая програма должна работать в даный момент. В цикле main стоит проверка РОНа, и если его там постояно обнулять то програма дальше 0 програмы не сдвинеться. А в остальном правы. 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 Подчистил. .include "tn13adef.inc" .list .def temp=r16 ;переименуем регистр под удобное имя ;-------------------------------------- ;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ ;-------------------------------------- .cseg ;выбор памяти. внашем случае работаем с flesh. .org 0 ;начальный адрес rjmp reset ;прерывание по сбросу .org 2 rjmp int_0 ;прерывание по порту int0 .org 0x0b ;------------------------------------------ ;ИНИЦИАЛИЗАЦИЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ;------------------------------------------ reset: ; cli ;запрет прерывания ldi temp,ramend ;установка нижней границы стека out spl,temp ; ldi temp,0b00000100 ;3 пину разрешено рерыване out PCMSK,temp ldi temp,(1<<PCIE) ;глобальное разрешение прерывния для пинов порта out GIMSK,temp ldi temp,0b11111000 ;настройка порта на out ddrb,temp ;вод.вывод ldi temp,0b00000111 ;подтяжка резистрами out portb,temp ;установка в порте лог.0 ldi temp,0x05 ;пред-делитель out tccr0b,temp ;таймера ldi temp,0x80 ;отключение out acsr,temp ;чегото там sei ;разрешение прерывания ;------------------------------------------- ;ОСНОВНАЯ ПРОГРАМА. ;------------------------------------------- main: tst r20 ;проверка на нулевое значение breq pro1 ;если равно переход по метке cpi r20,1 ;сравнение с РОН breq pro2 ;если равно переход по метке cpi r20,2 ;сравнение с РОН breq pro3 ;если равно переход по метке cpi r20,3 ;сравнение с РОН breq pro4 ;если равно переход по метке cpi r20,4 ;сравнение с РОН brne main ;если НЕ равно переход по метке clr r20 ;обнуление РОНа rjmp main ;------------------------------------------- pro1: ldi r19,100 ;задержка ldi r17,0b00010111 ;установка порта в 0 rcall mak1 ;вызов подпрограмы rcall wait ;вызов задержки ldi r17,0b00001111 ;установка порта в 1 rcall mak1 ;вызов подпрограмы rcall wait ;вызов задержки rjmp main ;безусловный переход ;------------------------------------------- pro2: ;програма мерцания светодиодом ldi r19,100 ;задержка ldi r17,0b00010000 ldi r18,0b00000000 rcall out_port rjmp main ;------------------------------------------- pro3: ;програма мерцания светодиодом ldi r19,100 ;задержка ldi r17,0b00001000 ldi r18,0b00000000 rcall out_port rjmp main ;------------------------------------------- pro4: ;програма мерцания 2 светодиодами ldi r19,200 ;задержка ldi r17,0b00011111 ldi r18,0b00000111 rcall out_port rjmp main ;------------------------------------------- out_port: ;подпрограмма вывода в порт out portb,r17 rcall wait out portb,r18 rcall wait ret ;---------------------------------------------------; ;ПРЕРЫВАНИЯ ;---------------------------------------------------; int_0: ;метка вызова прерываний по порту int0 in r5,SREG ;сохраним регистр статуса sbic portb,2 inc r20 out SREG,r5 ;восстановим при выходе reti ;---------------------------------------------------------------------; ;ПОДПРОГРАМЫ ;---------------------------------------------------------------------; mak1: ldi temp,3 ;запись в регистер 3 ldi r19,100 ;задержка m4: rcall out_port dec temp ;РОН:=РОН-1 brne m4 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку ret ;---------------------------------------------------------------------; ; ПП задержки ;---------------------------------------------------------------------; wait: ;Все что снизу задержка на таймере. ldi r25,0 out tcnt0,r25 wt1: in r25,tcnt0 cp r25,r19 brlo wt1 ret Да... Вставить блок кода проблематично. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 Спасибо за код но он все равно не работает. НЕ мой не ваш. При запуске программа пропускает prog1 и начинает с prog2 после нажатия клавиши пропускает prog3 и после 3 нажатия виснет. Но если поставить кнопку между reset и -. То при нажатии программа функционирует так как нужно. При сбросе программа меняеться. Точнее кнопка сброса работает как должна работать кнопка вызывающая прырывание Не понимаю в чем причина??? 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 .cseg ;выбор памяти. внашем случае работаем с flesh. //работаем с плотью?! С чьей, интересно..org 0 ;начальный адрес rjmp reset ;прерывание по сбросу .org 2 rjmp int_0 ;прерывание по порту int0 //а даташит считает, что INT0 находится по адресу 0х01, а по 0х02 - PCINT .org 0x0b Чтобы не мучиться с адресами прерываний, я обычно просто копирую таблицу векторов из даташита: rjmp RESET reti;INTO rjmp PCINT reti;TIMER0OVF reti;EE_RDY reti;ANA_COMP reti;TIMER0COMPA reti;TIMER0 COMPB reti;WDT reti;ADC В RESET'е нет инициализации r20 (кстати, дали бы ей имя, что ли .def prognum=r20). В прерывании нет защиты от дребезга, оно может отрабатывать произвольное число раз. Движок форума ужасен, замучился вставлять код!!!Вот с этим согласен! 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 Нашел причину. Все из за подтяжки пинов резисторами. Прерывание работает когда уровень на пине меняеться с 0 на 1 или с 1 на 0. Снял подтяжку по всем регистрам. И теперь работает только 1 команда так как прерывание не вызываеться. и в регистер не записываеться +1. 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 (изменено) А чему у вас равно r20 после старта??? Его нужно обнулить при старте. Есть хорошее правило - инициализировать все перед началом основного цикла. Еще замечание, как вы узнаете что r20 больше 4? Вывод, выход за диапазон стоит проверять в прерывании, так как в основной программе вы не заметите что r20 стало равно 4 или больше. Насчет подтяжки - я в начале писал что у вас сразу установлен флаг прерывания - именно из-зи подтяжки. В реальной схеме (в протеусе это тоже симулируется) есть некая емкость вывода порта. Это влечет за собой некоторую задержку установки лог 1 на выводе. За это время в мк устанавливается флаг прерывания. Именно по этому я написал, что нужно сбросить флаг изменения уровня на выводе порта (именно этот флаг и вызывает первое прерывание). Изменено 15 августа, 2013 пользователем korsaj 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.