hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 .org 0 ;начальный адрес rjmp reset ;прерывание по сбросу .org 2 rjmp int_0 ;прерывание по порту int0 //а даташит считает, что INT0 находится по адресу 0х01, а по 0х02 - PCINT .org 0x0b Если вы не заметели с прерываниями все правельно потому что перед rjmp int_0 стоит .org 2 и означает что метка int_0 насамом деле PCINT просто имя у нее изменено. 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 Именно по этому я написал, что нужно сбросить флаг изменения уровня на выводе порта (именно этот флаг и вызывает первое прерывание). А вы не знаете как это изменить. Почитал даташит там такого нет вроде бы. Читал в статьях написано что PCINT вызываеться по изменению состояния пина. 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 (изменено) • Bit 7 – INTF1: External Interrupt Flag 1 When an edge or logic change on the INT1 pin triggers an interrupt request, INTF1 becomes set (one). If the I-bit in SREG and the INT1 bit in GIMSK are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared when INT1 is configured as a level interrupt. • Bit 6 – INTF0: External Interrupt Flag 0 When an edge or logic change on the INT0 pin triggers an interrupt request, INTF0 becomes set (one). If the I-bit in SREG and the INT0 bit in GIMSK are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared when INT0 is configured as a level interruptа, Кидайте весь проект сюды так быстрее будет. Изменено 15 августа, 2013 пользователем korsaj 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
COKPOWEHEU Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 Если вы не заметели с прерываниями все правельно потому что перед rjmp int_0 стоит .org 2 и означает что метка int_0 насамом деле PCINT просто имя у нее изменено. Заметил, конечно. Если бы вы проанализировали вариант с полной таблицей векторов, вы бы в этом убедились. Просто неправильно, когда комментарий не соответствует самой программе.ldi temp,0x80 ;отключениеout acsr,temp ;чегото там Это просто без комментариев! Вероятно, имелся в виду аналоговый компаратор.ldi temp,0b00000100 ;3 пину разрешено рерыванеout PCMSK,temp Вроде же второму?Разобрались бы вы вначале с прерываниями. Ну там, чтобы по нажатию мигал светодиодик или еще чего несложное. И с орфографией! Столько ошибок в таком коротком предложении (выделены не все). Если вы не заметели с прерываниями все правельно потому что перед rjmp int_0 стоит .org 2 и означает что метка int_0 насамом деле PCINT(запятая) просто имя у нее изменено. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 Набросал пример работы с PCINT, при изменении уровня на PB2 меняется уровень на PB0. Конечно, для такой задачи (фактически, повторитель) контроллер не нужен, однако для иллюстрации вполне достаточно. В симуляторе Студии и Протеусе все работает, в железе не проверял, не делать же отдельную плату специально для такого! .include "tn13def.inc" .def temp=r16 .def mask=r17 ;таблица векторов прерываний, неиспользуемые заткнуты reti, чтобы не сбрасывалось при ошибочном разрешении чего-нибудь rjmp RESET reti; INTO rjmp PCINT reti; TIMER0OVF reti; EE_RDY reti; ANA_COMP reti; TIMER0COMPA reti; TIMER0 COMPB reti; WDT reti; ADC RESET: ldi temp,RAMEND ;инициализация стека out SPL,temp ldi temp,(1<<2) ;разрешаем PCINT только для PB2 out PCMSK,temp ldi temp,(1<<PCIE);разрешение прерывания по изменению уровня out GIMSK,temp ldi temp,(1<<0) ; PB0 - выход, остальные - входы out DDRB,temp ldi temp,(1<<2) ; PB2 - подтянут к питанию out PORTB,temp ldi mask,(1<<0) ; маска для инверсии PB0 sei CYCLE: ;бесконечный цикл rjmp CYCLE PCINT: in temp,PORTB eor temp,mask ;инверсия PB0 out PORTB,temp reti Код вроде похож на ваш. Немного смущает ldi temp,0b00000100 ;3 пину разрешено рерыванеout PCMSK,temp , когда по коду видно, что прерывание генерируется по перепаду PB2 а не PB3. Опять несоответствие комментария и кода. Хоть кнопка-то правильно висит? 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 (изменено) Вот так делается сброс флагов. ;------------------------------------------ ;ИНИЦИАЛИЗАЦИЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ;------------------------------------------ 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 temp,0xFF ;сбрасываем флаги прерывания out GIFR,temp sei ;разрешение прерывания И обратите внимание на код COKPOWEHEU, а именно на работу с портом. Порт вначале считали, потом изменили и вывели. Это сделано для того чтобы не менять состояние неиспользуемых в данной операции битов порта. У вас в коде есть подтяжка пина, но при выводе в порт вы отключаете эту подтяжку, что при определенных условиях вызовет прерывание. Изменено 15 августа, 2013 пользователем korsaj 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 Кнопка висит правильно. Просто коментар копировал и может с номером ошибся. До этого я делал прерывание по наростающему фронту INTO. Задача была : при нажатии увеличивалась частота мерцания светодиода на. Тогда работало. и Переключение программ мерцания по прерыванию INT0 тоже работало. Но вот решил сделать на PCINT. И что то пошло не так. Извините же за грамотность сам не Русский. Я ж не могу на форуме писать чисто по Украински, меня тогда не поймут. А что при такой записи пинов вход,выход. Их нельзя будут изменить в программе??? ldi temp,(1<<0) ; PB0 - выход, остальные - входы out DDRB,temp ldi temp,(1<<2) ; PB2 - подтянут к питанию out PORTB,temp 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 можно 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 Есть отчасти и моя вина. Совсем забыл, что у этих кастратов всего 8-мь ног. Лучше поставить внешнюю подтяжку на кнопку и не париться с маской. Ложные срабатывания дает дребезг механических контактов. Тут желательно софтовую защиту от дребезга сделать. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 15 августа, 2013 Автор Поделиться Опубликовано 15 августа, 2013 (изменено) От дребезга спасет конденсатор. А подтяжку желательно программную. ldi temp,(1<<0) ; PB0 - выход, остальные - входы out DDRB,temp ldi temp,(1<<2) ; PB2 - подтянут к питанию out PORTB,temp Проверял так записывать настройку порта а в 2-ичном выводить в порт сигналы. Всё ровно срабатывает прерывание и убираеться подтяжка. Пока проверяю в симуляторе. Если нужно могу и на железо кинуть. Макетная плата есть на attiny13 и на attiny2313. Изменено 15 августа, 2013 пользователем hardbar 0 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Григорий Т. Опубликовано 15 августа, 2013 Поделиться Опубликовано 15 августа, 2013 От дребезга спасет конденсатор. Только ухудшит ситуацию. По моему, раньше код был лучше, при побитном выводе. Перестарались с оптимизацией 1 Никогда не спорьте с дураком - люди могут не заметить между вами разницы Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 Все то же самое. Единственное не учли маску вывода в порт. Не зная схемы я, например, гасил все пины порта по привычке работы с Мегами. Тупанул немного и получилось, что сбрасывая выходы в 0 заодно и снимал подтяжку входной линии этого убогого МК. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 для побитного вывода есть sbi / cbi / sbr / cbr. Они других выводов трогать не умеют. Я делал маску на порт для простоты, чтобы инверсия занимала одну команду. Проверял так записывать настройку порта а в 2-ичном выводить в порт сигналы. Всё ровно срабатывает прерывание и убираеться подтяжка.у меня все работает. На PB2 висит только кнопка, соединяющая с землей. Просто надо при любом изменении PORTB записывать 2-й бит (0b00000100 = (1<<2)).Совсем забыл, что у этих кастратов всего 8-мь ног8 ног это на самом корпусе, на порт выведены 5,5 (ресет лучше не использовать)До этого я делал прерывание по наростающему фронту INTO INT0 висит на PB1 (6 вывод) в здесь вызывается PCINT по PB2 (7 вывод).Вот так делается сброс флагов.Если самопроизвольное переключение режима в начале не пугает - да и плевать на него. Хотя можно инициализировать последним номером. main: cpi prog_num,1 ;if(программа 1) breq PROG_1 cpi prog_num,2 ;if(программа 2) breq PROG_2 cpi prog_num,3 ;if(программа 3) breq PROG_3 rjmp PROG_4 ;else . Впрочем код последней можно засунуть прямо сюда. PROG_1: ;код программы 1 rjmp main ;код остальных программ PCINT: ;какой-то код в прерывании dec prog_num ;переключение программы brne PCINT_END ;если дошли до 0 - инициализируем заново. Таким образом программы будут от 1 до 4 ldi prog_num,4 ;еще какой-то код rcall WAIT_256 ;антидребезг ldi temp,(1<<PCIF) ;вроде флаг сбрасывается такой комбинацией. Если не так - поправьте. out GIFR,temp PCINT_END:reti WAIT_256: ;задержка на глазок, авось 524 (оценочно) тактов хватит для борьбы с дребезгом clr temp WAIT_256_LOOP: dec temp brne WAIT_256_LOOP ret Набросал чуть более читаемый код переключения подпрограмм. В данном случае, для упрощения обработчика PCINT счет идет 4-3-2-1. Метки и названия портов большими буквами после знакомства с Си, там так принято, а ассемблеру пофиг. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 К побитовым операциям пришли, но потом пришлось от них отходить, когда автор начал копировать и размножать блоки кода, отличающиеся только номером линии порта. Вот чтобы причесать листинг, а заодно и показать автору, как можно оптимизировать код, я и предложил вариант без побитовых операций. Для исключения моих глюков с кастрированными МК, достаточно в регистрах r17, r18 учесть подтяжку на используемой как вход линии порта. PS. В обработчике прерывания, разве не лучше переместить задержку антидребезга и сброс флага PCIF за метку PCINT_END? Тогда они будут распространяться на все варианты обработчика. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 (изменено) ldi temp,(1<<0) ; PB0 - выход, остальные - входы out DDRB,temp ldi temp,(1<<2) ; PB2 - подтянут к питанию out PORTB,temp Проверял так записывать настройку порта а в 2-ичном выводить в порт сигналы. Всё ровно срабатывает прерывание и убираеться подтяжка. Совсем запудрили голову новичку. Когда я говорил обратите внимание на работу с портом для сохранение подтяжки, я имел ввиду: считали портв во временный регистр - изменили нужные биты во временном регистре, не затрагивая биты подтяжки - вывели значение во временном регистре в порт. А точ то вы там куралесите с двоичным выводом и с формированием двоичной константы сдвигом 1 - так это одно и тоже и лишь упрашает понимание, но никак не влияет на откомпилированную программу! Изменено 16 августа, 2013 пользователем korsaj 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 16 августа, 2013 Автор Поделиться Опубликовано 16 августа, 2013 (изменено) Вот сократил код. Сделал кнопочную регулировку частоты. Полностью работоспособна. Давайте отталкиваться от этого кода если что пере делаем вывод в порт. .include "tn13adef.inc" .list .def temp=r16 ;переименуем регистр под удобное имя .def cicle=r17 .def tim=r18 .def timer=r19 ;-------------------------------------- ;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ ;-------------------------------------- .cseg ;выбор памяти. внашем случае работаем с flesh. .org 0 ;начальный адрес rjmp reset ;прерывание по сбросу .org 2 rjmp pcint ;прерывание по порту pcint .org 0x0b ;------------------------------------------ ;ИНИЦИАЛИЗАЦИЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ;------------------------------------------ reset: ; cli ;запрет прерывания ldi temp,ramend ;установка нижней границы стека out spl,temp ; ldi temp,0b00011000 ;настройка порта на out ddrb,temp ;вод.вывод ldi temp,0b00000111 ;подтяжка резистрами out portb,temp ;установка в порте лог.0 ldi temp,0b00000110 ;3 пину разрешено рерыване out PCMSK,temp ldi temp,(1<<PCIE) ;глобальное разрешение прерывния для пинов порта out GIMSK,temp ldi temp,0x05 ;пред-делитель out tccr0b,temp ;таймера ldi temp,0x80 ;отключение out acsr,temp ;чегото там ldi timer,100 ;задержка sei ;разрешение прерывания ;------------------------------------------- ;ОСНОВНАЯ ПРОГРАМА. ;------------------------------------------- pro1: ldi cicle,3 m1: sbi portb,4 rcall wait ;вызов задержки cbi portb,4 rcall wait ;вызов задержки dec cicle brne m1 ldi cicle,3 m2: sbi portb,3 rcall wait ;вызов задержки cbi portb,3 rcall wait ;вызов задержки dec cicle brne m2 rjmp pro1 ;безусловный переход ;---------------------------------------------------; ;ПРЕРЫВАНИЯ ;---------------------------------------------------; pcint: ;метка вызова прерываний по порту in r20,SREG ;сохраним регистр статуса push r20 sbic pinb,1 dec timer sbic pinb,2 inc timer pop r20 out SREG,r20 ;восстановим при выходе reti ;---------------------------------------------------------------------; ; ПП задержки ;---------------------------------------------------------------------; wait: ;Все что снизу задержка на таймере. ldi tim,0 out tcnt0,tim wt1: in tim,tcnt0 cp tim,timer brlo wt1 ret Вот схема. Прокоментируйте код. В смысле как он вам. Изменено 16 августа, 2013 пользователем hardbar 2 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 (изменено) Нормально, только перед разрешением прерывания стоит очистить флаги прерываний дабы сразу мк не переходил на прерывание. ldi temp,0xFF ;сбрасываем флаги прерывания out GIFR,temp см пост №56 Изменено 16 августа, 2013 пользователем korsaj 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 16 августа, 2013 Автор Поделиться Опубликовано 16 августа, 2013 Сделал так как вы говорили. И для проверки вставил вот такую команду. Проверить не срабатывает ли прерывание при запуске. ;---------------------------------------------------; ;ПРЕРЫВАНИЯ ;---------------------------------------------------; int_0: ;метка вызова прерываний по порту int0 in r20,SREG ;сохраним регистр статуса push r20 sbic pinb,1 dec timer sbic pinb,2 inc timer ;------------- sbi portb,0 ;- rcall wait ;- cbi portb,0 ;- ;------------- pop r20 out SREG,r20 ;восстановим при выходе reti Как оказалось не срабатывает. Но немогу понять почему прерывание при нажатии вызываеться дважды?? 1 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 Потому что у вас два раза меняется состояние пина (вначале с 1 на 0 - нажатие кнопки, потом с 0 на 1 - отпускание кнопки). 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 16 августа, 2013 Автор Поделиться Опубликовано 16 августа, 2013 А как изменить такое явление?? Ведь в даташите нет настройки Pcint такой же как и Int0. В смысле по наростающему или спадающему фронту. Там указано что прерывание вызываеться по изменению логического состояния порта. 1 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
korsaj Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 А зачем? Увас инкримен/дикримент выполняется 1 раз из-за условий. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 16 августа, 2013 Автор Поделиться Опубликовано 16 августа, 2013 Извините туплю. Вот даташит подтвердил что прерывание вызываеться дважды. Пока вопросов нет. Пойду дальше изучать. 1 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 Нет смысла сохранять и восстанавливать из стека регистр r20 в прерывании. Вы же им не пользуетесь. Записали в него SREG и ладно. Это уже достаточное действие. На будущее, при сохранении регистра статуса (SREG) в РОН, выбирайте регистры из числа 5-15, т.к. они менее функциональные и ими реже пользуются. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hardbar Опубликовано 16 августа, 2013 Автор Поделиться Опубликовано 16 августа, 2013 (изменено) С CREG вас понял. Вот код я сделал наконец то что хотел. Прошу не наежать. Ч то у меня плохая оптимизацыя. .include "tn13adef.inc" .list .def temp=r16 ;переименуем регистр под удобное имя .def cicle=r17 .def tim=r18 .def timer=r19 .def numer=r21 .def konst=r22 ;-------------------------------------- ;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ ;-------------------------------------- .cseg ;выбор памяти. внашем случае работаем с flesh. .org 0 ;начальный адрес rjmp reset ;прерывание по сбросу .org 2 rjmp int_0 ;прерывание по порту int0 .org 0x0a ;------------------------------------------ ;ИНИЦИАЛИЗАЦИЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ. ;------------------------------------------ reset: ; cli ;запрет прерывания ldi temp,ramend ;установка нижней границы стека out spl,temp ; ldi temp,0b00011000 ;настройка порта на out ddrb,temp ;вод.вывод ldi temp,0b00000111 ;подтяжка резистрами out portb,temp ;установка в порте лог.0 ldi temp,0b00000111 ;3 пину разрешено рерыване out PCMSK,temp ldi temp,(1<<PCIE) ;глобальное разрешение прерывния для пинов порта out GIMSK,temp ldi temp,0x05 ;пред-делитель out tccr0b,temp ;таймера ldi temp,0x80 ;отключение out acsr,temp ;чегото там ldi temp,0xFF ;сбрасываем флаги прерывания out GIFR,temp ldi timer,200 ;задержка ldi numer,3 ;РОН теста ldi konst,5 ;РОН констант sei ;разрешение прерывания ;------------------------------------------- ;ОСНОВНАЯ ПРОГРАМА. ;------------------------------------------- main: ;тест РОНа.выбор програмы cpi numer,3 breq pro3 cpi numer,2 breq pro2 cpi numer,1 breq pro1 rjmp main ;------------------------------------ pro3: ;програма 3 sbi portb,3 sbi portb,4 rcall wait cbi portb,3 cbi portb,4 rcall wait rjmp main ;безусловный переход ;------------------------------------- pro2: ;програма 2 sbi portb,3 rcall wait cbi portb,3 rcall wait rjmp main ;безусловный переход ;----------------------------------------- pro1: ;програма 1 sbi portb,4 rcall wait cbi portb,4 rcall wait rjmp main ;безусловный переход ;---------------------------------------------------; ;ПРЕРЫВАНИЯ ;---------------------------------------------------; int_0: ;метка вызова прерываний по порту int0 in r5,SREG ;сохраним регистр статуса sbis pinb,1 ;проверка pb1. пропустить если 1 subi timer,5 ;вычесть 5 с РОН sbis pinb,2 ;проверка pb2. пропустить если 1 add timer,konst ; сложить РОН с РОН sbis pinb,0 ;проверка pb0. пропустить если 1 dec numer ; вычесть 1 с РОН tst numer ;проверка РОН не 0 ли brne outi ;переход если не = ldi numer,3 ;запись в РОН 3 outi: ; out SREG,r5 ;восстановим при выходе reti ;---------------------------------------------------------------------; ; ПП задержки ;---------------------------------------------------------------------; wait: ;Все что снизу задержка на таймере. ldi tim,0 out tcnt0,tim wt1: in tim,tcnt0 cp tim,timer brlo wt1 ret Вот схема Изменено 16 августа, 2013 пользователем hardbar 1 Очень люблю спасибку. Спасибка ни кого еще не убила. Професия: Електро-механик. Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 16 августа, 2013 Поделиться Опубликовано 16 августа, 2013 PS. В обработчике прерывания, разве не лучше переместить задержку антидребезга и сброс флага PCIF за метку PCINT_END? Тогда они будут распространяться на все варианты обработчика. Лучше, конечно. Это я сначала думал обойтись без антидребезга, потом добавил его, а вот метку поправить забыл. Ее стоит перенести сразу после ldi prog_num,4. Но так тоже ничего получилось, может народ задумается наконец о принципе действия программы и не будет копипастить :-) 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.