Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 50 • Страница 2 из 3<  1  2  3  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 01.07.2006
Откуда: Челябинск
Вобщем написал программку, всё работает, хотя бывают ошибки в определении направлении вращения, но это скорее из за плохого скрола на мыши (Трещётка слабая)



Партнер
 

Member
Статус: Не в сети
Регистрация: 01.07.2006
Откуда: Челябинск
Собираюсь ещё прицепить 2 кнопки, но возникает вопрос возможно ли использование одновременно прерываний по INT1/INT0 и PCINT ведь при задействовании PCINT и INT1/INT0 прерываний на PD2/PD3 будит 2, мешать небудут?


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
}{acker писал(а):
ведь при задействовании PCINT и INT1/INT0 прерываний на PD2/PD3 будит 2
Нда, чтением документации некоторые юзеры предпочитают себя не обременять :).

}{acker писал(а):
Собираюсь ещё прицепить 2 кнопки
Для кнопок желателен антидребезг --> прерывание от таймера, а PCINT в таком случае не нужен.


 

Member
Статус: Не в сети
Регистрация: 01.07.2006
Откуда: Челябинск
maco писал(а):
Нда, чтением документации некоторые юзеры предпочитают себя не обременять Smile.


Вобще-то даташит скачен, так же книжки по AVR. Читаю.

maco писал(а):
Для кнопок желателен антидребезг --> прерывание от таймера, а PCINT в таком случае не нужен.

Нужно именно по изменению состояния на линии, INT1 уже заюзан на валкодер. Таймер не катит.


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
maco, он еще не сталкивался с дребезгом и помехами. Ничего, потом можно модифицировать софт. :)
Добавлено спустя 5 минут, 1 секунду
}{acker, состояние можно брать по прерыванию и/или по опросу.
Если опрашивать порт, скажем, каждые 5 милисекунд, то легко отследить изменение состояния кнопки или датчика и сделать вывод о необходимых действиях.
При работе 'по прерываниям' в случае дребезга или помех происходит множественное прерывание. И тут придется разбираться - замкнута кнопка или разомкнута. Если прерываний высыпало много, то как понять, какое состояние стало? .... придется вводить измерение времени между прерываниями (т.е. таймер) ... и тут гимору будет не в пример больше.


Последний раз редактировалось serj 16.03.2009 21:33, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 04.10.2004
serj
IMHO лучше сначала подумать и потом ничего не модифицировать - быстрее получается :). Но это дело добровольное.


 

Member
Статус: Не в сети
Регистрация: 01.07.2006
Откуда: Челябинск
serj писал(а):
}{acker, состояние можно брать по прерыванию и/или по опросу. Если опрашивать порт, скажем, каждые 5 милисекунд, то легко отследить изменение состояния кнопки или датчика и сделать вывод о необходимых действиях. При работе 'по прерываниям' в случае дребезга или помех происходит множественное прерывание. И тут придется разбираться - замкнута кнопка или разомкнута. Если прерываний высыпало много, то как понять, какое состояние стало? .... придется вводить измерение времени между прерываниями (т.е. таймер) ... и тут гимору будет не в пример больше.


Кондёр на кнопку + запрет прерываний в обработчике прерываний.


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
}{acker писал(а):
Кондёр на кнопку + запрет прерываний в обработчике прерываний.
Лишняя деталь на каждую кнопку и возможность необрабатывания других прерываний (INT0/1) :). И на какой промежуток времени накладывается запрет :)?


 

Member
Статус: Не в сети
Регистрация: 01.07.2006
Откуда: Челябинск
maco писал(а):
Лишняя деталь на каждую кнопку и возможность необрабатывания других прерываний (INT0/1) Smile. И на какой промежуток времени накладывается запрет Smile?


Вобще то можно отрубить не все прерывания, а только те которые нам ненужны на данный момент.

Вобщем хватит спорить, то как лучше реализовать надо ещё понимать почему, а если тупо лучше потому что так кто то сказал то это уже деградация в баранов.

Да есть два варианта реализации - PCINT и Таймер, один таймер уже заюзан на шим остаётся второй. А если он тоже понадобится? Чо тогда.


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
}{acker писал(а):
А если он тоже понадобится?
Вот тогда и будете думать :).
К тому же можно тактироваться и от таймера, который занимается ШИМом. Прерывание от него у вас ничем не занято. При желании на одно и то же прерывание можно повесить несколько процессов, если нет каких-то противопоказаний.


 

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 на втором пине в обработчике. Дальше две подпрограммы меняющие скважность. Главное работает.

Чем прерывания коварны? Вобще то если по таймеру делать то опять же прерывание от компаратора, делать цикл, так он и сожрёт все свободные такты.


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
}{acker писал(а):
Вобще то если по таймеру делать то опять же прерывание от компаратора
Откуда еще возьмется прерывание от компаратора :)? Зачем же так извращаться :)?

}{acker писал(а):
делать цикл, так он и сожрёт все свободные такты.
Какой именно цикл? Если бесконечный, то он в любом случае присутствует (за исключением ухода в режим энергосбережения).

P.S. Использование прерываний обычно облегчает жизнь разработчика, но требует немного бОльших знаний, чем полностью программная реализация в бесконечном цикле. Ну и как уже говорил Walkie набор задач в бесконечном цикле значительно проще модифицировать, т.е. опять же не требуются дополнительные знания о настройке и функционировании прерываний и периферийных устройств. Как реализовывать - дело добровольное.


Walkie писал(а):
Не надо пока воевать с прерываниями - это очень коварная штука
Тогда лучше превзойти их в коварстве и не воевать, а просто их использовать с особым цинизмом ;).


 

Member
Статус: Не в сети
Регистрация: 06.06.2008
Откуда: Таганрог
Фото: 18
}{acker , хозяин-барин. Просто есть одно железное правило : если задача так же легко реализуется без применения прерываний - ни в коем случае их не используй. Даже не правило, а закон. И вовсе не от страха.

maco, даже не использовать, а, не побоюсь этого слова, иметь.


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
Walkie
Угу, для любителей острых ощущений можно иметь прерывания в особо извращенной форме (группововое имение прерываний, например :)).


 

Member
Статус: Не в сети
Регистрация: 06.06.2008
Откуда: Таганрог
Фото: 18
maco , групповое имение прерываний может серьёзно увеличивать расходы на содержание имения и создавать фантомные группы, желающие еще более острых ощущений.


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
Walkie
По поводу увеличения расходов вспомнились стУденты, просившие проверить практическую реализацию какого-то курсового проекта на 2313. Типа сначала работает, а потом начинает глючить. Увидев рекурсивный вызов процедуры (выдержка времени, выполнение нужных действий и новый вызов), хотел ради прикола порекомендовать что-нибудь типа 8515 с внешней памятью для увеличения времени нормальной работы (чтобы успели преподу продемонстрировать :)), потом поправил. Потом пришлось объяснять, что и зачем правил :).


 

Member
Статус: Не в сети
Регистрация: 01.07.2006
Откуда: Челябинск
Walkie писал(а):
}{acker , хозяин-барин. Просто есть одно железное правило : если задача так же легко реализуется без применения прерываний - ни в коем случае их не используй. Даже не правило, а закон. И вовсе не от страха.


Хм странно, ну я понимаю ещё асм но языки с процедурами, там прерывания постоянно. Да и по мне так вообще - зачем делать цикл, если можно на прерываниях сделать.

maco писал(а):
Откуда еще возьмется прерывание от компаратора Smile? Зачем же так извращаться Smile?

Хм как же без прерываний, по таймеру сделать опрос кнопки?


 

Member
Статус: Не в сети
Регистрация: 04.10.2004
}{acker писал(а):
как же без прерываний, по таймеру сделать опрос кнопки?
Прерывание от таймера, этого достаточно. Прерывание от компаратора излишне.


 

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 раз.

Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 50 • Страница 2 из 3<  1  2  3  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan