Member
Статус: Не в сети Регистрация: 01.07.2006 Откуда: Челябинск
Вобщем написал программку, всё работает, хотя бывают ошибки в определении направлении вращения, но это скорее из за плохого скрола на мыши (Трещётка слабая)
Member
Статус: Не в сети Регистрация: 01.07.2006 Откуда: Челябинск
Собираюсь ещё прицепить 2 кнопки, но возникает вопрос возможно ли использование одновременно прерываний по INT1/INT0 и PCINT ведь при задействовании PCINT и INT1/INT0 прерываний на PD2/PD3 будит 2, мешать небудут?
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
maco, он еще не сталкивался с дребезгом и помехами. Ничего, потом можно модифицировать софт. Добавлено спустя 5 минут, 1 секунду }{acker, состояние можно брать по прерыванию и/или по опросу. Если опрашивать порт, скажем, каждые 5 милисекунд, то легко отследить изменение состояния кнопки или датчика и сделать вывод о необходимых действиях. При работе 'по прерываниям' в случае дребезга или помех происходит множественное прерывание. И тут придется разбираться - замкнута кнопка или разомкнута. Если прерываний высыпало много, то как понять, какое состояние стало? .... придется вводить измерение времени между прерываниями (т.е. таймер) ... и тут гимору будет не в пример больше.
Последний раз редактировалось serj 16.03.2009 21:33, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 01.07.2006 Откуда: Челябинск
serj писал(а):
}{acker, состояние можно брать по прерыванию и/или по опросу. Если опрашивать порт, скажем, каждые 5 милисекунд, то легко отследить изменение состояния кнопки или датчика и сделать вывод о необходимых действиях. При работе 'по прерываниям' в случае дребезга или помех происходит множественное прерывание. И тут придется разбираться - замкнута кнопка или разомкнута. Если прерываний высыпало много, то как понять, какое состояние стало? .... придется вводить измерение времени между прерываниями (т.е. таймер) ... и тут гимору будет не в пример больше.
Кондёр на кнопку + запрет прерываний в обработчике прерываний.
Member
Статус: Не в сети Регистрация: 01.07.2006 Откуда: Челябинск
maco писал(а):
Лишняя деталь на каждую кнопку и возможность необрабатывания других прерываний (INT0/1) Smile. И на какой промежуток времени накладывается запрет Smile?
Вобще то можно отрубить не все прерывания, а только те которые нам ненужны на данный момент.
Вобщем хватит спорить, то как лучше реализовать надо ещё понимать почему, а если тупо лучше потому что так кто то сказал то это уже деградация в баранов.
Да есть два варианта реализации - PCINT и Таймер, один таймер уже заюзан на шим остаётся второй. А если он тоже понадобится? Чо тогда.
Вот тогда и будете думать .
К тому же можно тактироваться и от таймера, который занимается ШИМом. Прерывание от него у вас ничем не занято. При желании на одно и то же прерывание можно повесить несколько процессов, если нет каких-то противопоказаний.
Member
Статус: Не в сети Регистрация: 06.06.2008 Откуда: Таганрог Фото: 18
}{acker , очень важно одновременно вырабатывать стиль писанины под МК. Впоследствие это очень сильно всё облегчает. Как отладку-модификацию имеющихся прог, так и создание новых. Прерывания нужно использовать только тогда, когда без них действительно не обойдешься. Например, на фоне основной задачи МК как можно быстрее на что-то отреагировать. В подавляющем большинстве случаев всё выполняется в виде так называемого монитора без всяких прерываний. Впрочем, основа монитора существует всегда. Вот один их стилей подобных прог. ;==================================== .code rjmp _Setup .... ; тут текст фигни, связанной с прерываниями. ; если таковые потребуются .... ;==================================== _Setup: ; здесь выполняем всю первоначальную настройку и rjmp Monitor ;============================================= ; Сложим боевую задачу МК из логических кусочков. ; Легко добавить новые и "закомментировать" какие-то для отладки Monitor: rcall Task1 rcall Task2 ... rcall TaskN rjmp Monitor ;====================================== ; Здесь будем писать всё сладкое, не забывая при этом ; подстраивать Setup для возникающих нужд ;-------------------------------------------------------------------- Task1: ... ret ;------ Task2: ... ret .......... ;------ TaskN: ... ret ;================= .end
И для большей конкретики, например, это (без претензий на отсутствие ошибок и опечаток).
;-------------------------------------------- Task1: ; задача будет валять дурака 1000 us, ; создавая общий минимальный цикл монитора .equ AVR_CLK = 8; MHz - частота нашего МК .equ MONITOR_TIME = 1000; us - нужная задержка ldi r24, low((MONITOR_TIME*AVR_CLK)/4) ldi r25,high((MONITOR_TIME*AVR_CLK)/4) sbiw r24,1; цикл идет 4 такта (поэтому ../4) brne PC-1 ret ;------------------------------------------------- Task2: ; задача будет опрашивать входы валкодера и ; всегда формировать 0 или +\-1 в R20 ; не насилуя мозг, сделаем тупо, но рабоче.
ldi r20,0 in r0,PIND mov r16,r15; R15 - у нас всегда предыдущее состояние PIND mov r15,r0 eor r16,r0 sbrs r16,2; PD2 изменил состояние ? ret; неа... никаких перепадов. ; да, перепад ldi r20,1; понтуемся, что +1 sbrs r0,2 rjmp t02_01 ; для положительного перепада sbic PIND,3 neg r20; не +1, а -1 ret t02_01:; для отрицательного - наоборот sbis PIND,3 neg r20 ret ;--------------------------------------------------------- Task03: ; эта задача будет крутить ШИМ с ограничением .equ PWM_MIN = 0 .equ PWM_MAX = 255
or r20,r20 breq t03_03; если нефиг регулировать in r16,OCR0A brmi t03_01 cpi r16,PWM_MAX; смотрим, чтоб не перекрутить за максимум brne t03_02 ret t03_01: cpi r16,PWM_MIN; ну, и не свернуть шею за минимум breq t03_03 t03_02: add r16,r20 out OCR0A,r16 t03_03: ret ;------------------------------------------------------------------ Task04: ; а эта внесет в систему оживляж : ; при любом трогании валкодера будет всегда ; зажигаться LED, прицепленый к PD4 .equ LED_TIME = 200; сколько циклов монитора держать зажженным
sbic PORTD,4 rjmp t04_01 ; если LED потухший or r20,r20; сканер валкодера дал приращение ? breq t04_02 sbi PORTD,4; зажигаем ldi r23,LED_TIME; и взводим таймер ret t04_01:; LED зажжен - держим, пока не смотаем таймер dec r23 brne t04_02 cbi PORTD,4 t04_02:ret
Потом отлаженное можно пересмотреть : повыкидывать ненужное, объединить короткие задачи в одну и т.п. Когда, скажем, потребовались кнопки - сюда и их легко вмонтировать. Не надо пока воевать с прерываниями - это очень коварная штука...
Member
Статус: Не в сети Регистрация: 01.07.2006 Откуда: Челябинск
Walkie писал(а):
Потом отлаженное можно пересмотреть : повыкидывать ненужное, объединить короткие задачи в одну и т.п. Когда, скажем, потребовались кнопки - сюда и их легко вмонтировать. Не надо пока воевать с прерываниями - это очень коварная штука...
Чо то у меня всё проще, прерывание по фронту и проверка на 1 или 0 на втором пине в обработчике. Дальше две подпрограммы меняющие скважность. Главное работает.
Чем прерывания коварны? Вобще то если по таймеру делать то опять же прерывание от компаратора, делать цикл, так он и сожрёт все свободные такты.
Вобще то если по таймеру делать то опять же прерывание от компаратора
Откуда еще возьмется прерывание от компаратора ? Зачем же так извращаться ?
}{acker писал(а):
делать цикл, так он и сожрёт все свободные такты.
Какой именно цикл? Если бесконечный, то он в любом случае присутствует (за исключением ухода в режим энергосбережения).
P.S. Использование прерываний обычно облегчает жизнь разработчика, но требует немного бОльших знаний, чем полностью программная реализация в бесконечном цикле. Ну и как уже говорил Walkie набор задач в бесконечном цикле значительно проще модифицировать, т.е. опять же не требуются дополнительные знания о настройке и функционировании прерываний и периферийных устройств. Как реализовывать - дело добровольное.
Walkie писал(а):
Не надо пока воевать с прерываниями - это очень коварная штука
Тогда лучше превзойти их в коварстве и не воевать, а просто их использовать с особым цинизмом .
Member
Статус: Не в сети Регистрация: 06.06.2008 Откуда: Таганрог Фото: 18
}{acker , хозяин-барин. Просто есть одно железное правило : если задача так же легко реализуется без применения прерываний - ни в коем случае их не используй. Даже не правило, а закон. И вовсе не от страха.
maco, даже не использовать, а, не побоюсь этого слова, иметь.
Member
Статус: Не в сети Регистрация: 06.06.2008 Откуда: Таганрог Фото: 18
maco , групповое имение прерываний может серьёзно увеличивать расходы на содержание имения и создавать фантомные группы, желающие еще более острых ощущений.
Walkie По поводу увеличения расходов вспомнились стУденты, просившие проверить практическую реализацию какого-то курсового проекта на 2313. Типа сначала работает, а потом начинает глючить. Увидев рекурсивный вызов процедуры (выдержка времени, выполнение нужных действий и новый вызов), хотел ради прикола порекомендовать что-нибудь типа 8515 с внешней памятью для увеличения времени нормальной работы (чтобы успели преподу продемонстрировать ), потом поправил. Потом пришлось объяснять, что и зачем правил .
Member
Статус: Не в сети Регистрация: 01.07.2006 Откуда: Челябинск
Walkie писал(а):
}{acker , хозяин-барин. Просто есть одно железное правило : если задача так же легко реализуется без применения прерываний - ни в коем случае их не используй. Даже не правило, а закон. И вовсе не от страха.
Хм странно, ну я понимаю ещё асм но языки с процедурами, там прерывания постоянно. Да и по мне так вообще - зачем делать цикл, если можно на прерываниях сделать.
maco писал(а):
Откуда еще возьмется прерывание от компаратора Smile? Зачем же так извращаться Smile?
Хм как же без прерываний, по таймеру сделать опрос кнопки?
Member
Статус: Не в сети Регистрация: 06.06.2008 Откуда: Таганрог Фото: 18
}{acker , как раз на asm программировать прерывания - одно удовольствие, или я что-то не так понял...
Опрос кнопок без прерываний.
Таймером выступает цикл монитора, который в примере выше =1 мс.
Кнопки подключены PIN-GND, в контроллере включена внутренняя подтяжка к +Uп.
[pre]
;-------------------------------------------- ; пока кнопка, подключенная к PB7, удерживается нажатой, ; ШИМ всегда торчит в серединке ; и нам пофиг дребезг этой кнопки Task05:
ldi r16,128
sbis PINB,7
out OCR0A,r16
ret
; впоследствии монтируется в Task03, ибо уж слишком просто.
;-------------------------------------------- ; А эту кнопку, подключенную к PB6 нам лучше ; иметь (слово нравится maco) бездребезговой. ; В момент ее нажатия мы запомним состояние ШИМ в EEPROM ; R8 - b6-0 - история опроса кнопки ; b7 - бит устойчивого состояния Task06:
bst r8,7
lsl r8
sbrs PINB,6
inc r8
breq t06_00
mov r16,r8
cpi r16,0b1111_1111
breq t06_01
bld r8,7; кнопка дребезжит - вернем b7 взад t06_00:
ret
t06_01:; опа... устойчиво нажата в течение 8 циклов опроса brts t06_00; а до этого была отжата ? ; да - засовываем состояние ШИМ в EEPROM sbic EECR,1; подождем, если EEPROM уже кто-то имеет rjmp PC-1
ldi r16,PWM_AT_START
out EEAR,r16
in r16,OCR0A
out EEDR,r16
sbi EECR,2
sbi EECR,1
ret[/pre]
Ёмаё... а, если кнопок 12 - для каждой будешь аппаратное прерывание обустраивать ? Между прочим, своим способом ты и вовсе не сможешь сделать антидребезг.
Фраза "зачем делать цикл, если можно на прерываниях..." может означать лишь одно : пустой цикл "монитора". Проще говоря, твоя программа должна в этом случае выглядеть или так
[pre]Monitor:
sleep
rjmp Monitor[/pre]
или вовсе вот так :
[pre]Monitor:
rjmp Monitor[/pre]
А всё то, что я приводил в примерах, вынесено в прерывающие процедуры.
Кстати, меня стали терзать смутные сомнения. У тебя вообще где-нибудь есть команда out SPL,... ? Пакеж прогу-то...
Последний раз редактировалось Walkie 19.03.2009 21:04, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения