Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
07.12.2011, 12:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
можно ли в разных функциях, не работающих одновременно написать в каждой свой обработчик одного и того же прерывания? Компилятор "поймет" к какой функции какой обработчик надо подтыкать? Или обработчик определенного прерывания во всей программе может быть только один?
|
В прерывании устанавливайте флаг (или несколько флагов), а в основной программе обрабатывайте каждый этот флаг по-своему (как надо)
Сообщение от makakus
|
Вы хотите вызывать обработчик из основной программы. Хорошо. Но во время его работы может возникнуть прерывание, снова его вызывающее. Он отработает от начала до конца и вернётся, куда-то в середину собственного тела (здесь уже прочие прерывания будут разрешены!)
|
Для этого достаточно вместо вызова прерывания устанавливать флаг прерывания. Дальнейшее система прерываний сделает сама
|
|
|
|
07.12.2011, 12:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от niXto
|
устанавливать флаг прерывания
|
В контроллерах AVR флаги прерывания установить программно невозможно, можно только сбросить.
|
|
|
|
07.12.2011, 14:06
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Похоже, если я правильно понял, имея Тини13 и всего один таймер на борту надо писать как бы универсальный (или с ветвлениями) обработчик прерываний от него, чтобы использовать их не в одной функции.
|
|
|
|
07.12.2011, 14:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
надо писать как бы универсальный (или с ветвлениями) обработчик прерываний от него
|
Даже у таймера тини13 три прерывания. Нужно идти от задачи: зачем вашему девайсу точно мерить время? Нельзя ли обойтись программным счётчиком? Конечно, использовать таймер удобно, он всё равно есть. Дальше можно приделать программный "удлинитель" таймера.
Допустим, вам нужен ШИМ 1 кгц. ШИМ организуем на компараторах таймера с аппаратным выводом на ногу контроллера, управление ШИМом - записал в OCRa / OCRb и всё. В обработчике прерывания по переполнению таймера (период 1 мс) наращиваем счётчик (переменная в памяти). Когда он ==10 сбрасываем его в 0, ставим флаг "10ms". Через этот флаг main вызывает опрос клавиатуры и регенерацию индикатора, а ещё наращивает другой счётчик. Когда этот другой достигнет 100 пройдёт секунда, например это нужно чтобы считать время. Так от одного аппаратного прерывания 1ms образуется несколько программных. Можно в прерывании тупо наращивать, например, чертырёхбайтную переменную. И пусть много функций за ней следят и так ориентируются во времени. Для примера выше она переполнится через 1мс*2^32 = почти 50 суток.
Последний раз редактировалось makakus; 07.12.2011 в 14:57.
|
|
|
|
07.12.2011, 15:18
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Прерывание по сравнению уже испоьзую
|
|
|
|
07.12.2011, 15:58
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
Похоже, если я правильно понял, имея Тини13 и всего один таймер на борту надо писать как бы универсальный (или с ветвлениями) обработчик прерываний от него, чтобы использовать их не в одной функции.
|
Сформулируйте правильно задачу прежде всего для себя... Если у вас конечный автомат или возникла необходимость в RTOS посмотрите на OSA tester'а, может какие-то решения или подходы подскажут вам решения своей задачи...
Есть такое понятие как tic... таймер непрерывно отсчитывает определённый интервал, допустим 1 mS... все остальные временные интервалы привязываются к tic'у, т.е они кратны ему... Манипулируя флагами и переменными в прерывании и в теле основной проги получаем подобие OS...
|
|
|
|
07.12.2011, 16:17
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Вот, на применении тиков я как раз и остановился, как на наиболее универсальном варианте(для меня). Спасибо!
|
|
|
|
15.12.2011, 09:37
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
Да подумал, что можно в обработчике прерывания поместить, как бы правильнее сказать-то, вариант выбора обработки прерывания(или это компилятор может делать), в зависимости от каких то условий, а далее перейти на этот самый вариант...
|
Так тоже вполне нормально будет работать , это обычно используется когда на одно и то же прерывание надо реагировать по разному в соответствии от текущих условий когда это все происходит .Компилятор сам этого не делает - все варианты сработки после возникновения прерывания куда именно нужно идти для попадания в нужную (в зависимости от конкретных условий - про флаги для распознавания этого,и прочее, уже сказали) ветку обработки (одного и того же обработчика прерывания) - Вы пишете сами ,также как и сам весь обработчик прерывания, это задача не компилятора , а Ваш выкрутас ,который Вы хотите реализовать ,или к примеру пытаетесь реализовать, а как именно Вы это реализуете он не может предугадать - машина не "телепат", она только выполняет Ваши написанные задумки , да на ошибки указывает если они есть ,и какие она еще может заметить .И кстати примерно подобные вещи с прерываниями не так давно как-то на С и kison уже делал , можете спросить подробности у него , если там все нормально у него тогда получилось .
__________________
Короче асма кода нет !
Последний раз редактировалось pinco; 15.12.2011 в 10:25.
|
|
|
|
15.12.2011, 23:22
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Подключил вот я функцию в майн, потом еще одну, и места оперативки в Тини13 не стало хватать, перекомпилировал под 2313, и теперь, в первой вызываемой функции не получается выход из обработки прерывания по переполнению Т0, если у меня там тиков больше 600. При симуляции в АВРСтудии курсор просто зависает на месте и все, а часы идут... Не посмотрит кто-нибудь, где я опять накосячил??
|
|
|
|
16.12.2011, 08:01
|
|
Прописка
Регистрация: 18.10.2010
Адрес: Planet Earth )
Сообщений: 120
Сказал спасибо: 14
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Доброго времени суток!
У меня появился вопрос в изучении написания программ.
На числа в регистрах задержки прошу не смотреть, сделал для удобоотслеживания в пошаговом режиме аврстудио4. Рассматриваю на примере простенькой программы
Алгоритм программы таймера счетчика таков:
1. Инициализация портов на ввод и вывод
2. делаем опрос кнопки назовем Pincykle
3. отслеживание нажатие кнопки
4. пропустить если нажата
5. если не нажата то вернуться к отслеживанию на метку Pincykle
б) если нажата то записываем число в регистры процедуры задержки 0.2с
в) сама процедура - задержка ( убираем дребезг контактов)
6. делаем опрос кнопки на отжатие
7. пропустить если отпущенна
а) если нажата то вернуться к отслеживанию на метку Pincykle происходит цикл пока не отпустим
б) если отжали то что-то делаем
в) записываем число в регистры. 0.5с
г) сама процедура задержки
8. вернуться к отслеживанию на метку Pincykle
Так всеж-таки не пойму почему нужно ставить задержку после выполнения чего либо, а не сразу после отжатия кнопки - задержка, а потом выполнения чего не будь и вернуться опять к отслеживанию!? В моем случае это увеличения счетчика и вывод его в порт. В принципе Я так понимаю не только для дребезга, не могу до конца вкурить.
; ************************************************** **********************
.device ATmega8515 ; Используется МК ATmega8515
.nolist ; Отключенна генерация листинга
.include "m8515def.inc" ; Вложенные файлы не будут отображены в листинге
.list ; Включена генерация листинга
;************************************************* ************************
;************************************************* ************************
.def temp=r16 ;рабочая переменная
.def Razr0=r17 ;разряды задержки
.def Razr1=r18
.def Razr2=r19
.def counter=r20 ;счетчик
;************************************************* ***********************
.cseg ; Начало кодового сегмента
.org 0x0000
rjmp RESET ; Обработка сброса
.org 0x0001 ;rjmp EXT_INT0 ; внешнее прерывание IRQ0
reti
.org 0x0002 ; rjmp EXT_INT1 ; внешнее прерывание IRQ1
reti
.org 0x0003 ; rjmp TIM1_CAPT ; Обработка захвата таймера/счетчика T1
reti
.org 0x0004 ; rjmp TIM1_COMPA ; Совпадение А таймера/счетчика T1
reti
.org 0x0005 ; rjmp TIM1_COMPB ; Совпадение В таймера/счетчика T1
reti
.org 0x0006 ; rjmp TIM1_OVF ; Обработка переполнения таймера/счетчика T1
reti
.org 0x0007 ; rjmp TIM0_OVF ; Обработка переполнения таймера/счетчика T0
reti
.org 0x0008 ; rjmp SPI_STC ; Передача по SPI завершена
reti
.org 0x0009 ; rjmp USART_RXC ; USART RX прием завершен
reti
.org 0x000A ; rjmp USART_UDRE ; Регистр данных USART пуст
reti
.org 0x000B ; rjmp USART_TXC ; USART TX Передача завершена
reti
.org 0x000C ; rjmp ANA_COMP ; Обработка прерывания аналогового компаратора
reti
.org 0x000D ; rjmp EXT_INT2 ; Обработка внешнего прерывания IRQ2
reti
.org 0x000E ; rjmp TIM0_COMP ; Обработка совпадения таймера/счетчика T0
reti
.org 0x000f ; rjmp EE_RDY ; EEPROM готово
reti
.org 0x0010 ; rjmp SPM_RDY ; Store Program memory - готово
reti
;************************************************* ************************
RESET:
;инициализация стека
ldi R16,high(RAMEND)
out SPH,temp
ldi R16,low(RAMEND)
out SPL,temp
;-------------------------------------------------------------------------
ldi temp,0b00000100 ; для второго разряда порта D
out PORTD,temp ; подтягивающий резистор на всякий случай
ldi temp,0b11111111 ; порт A все контакты на выход
out DDRA,temp
clr counter ; очищаем счетчик
Pincykle: ; цикл отслеживания кнопки
sbic PinD,2 ; пропустить, если нажата
rjmp Pincykle ; вернутся обратно, если не нажата
; кнопка нажата - пауза 0,2 с, N = $027100
ldi Razr2,$00
ldi Razr1,$00
ldi Razr0,$01
rcall Delay
Pin_release: ; отслеживаем отпускание
sbis PinD,2 ; пропустить, если отпущена
rjmp Pincykle ; вернуться обратно, если нажата
inc counter ; если отпущена, увеличиваем счетчик
out PORTA, counter ; выводим счетчик в порт A
; пауза 0,5 с, N = $061A80
ldi Razr2,$00
ldi Razr1,$00
ldi Razr0,$02
rcall Delay
rjmp Pincykle ; вернуться обратно к отсеживанию
;---------------------------------------------------------------------
Delay: ; процедура задержки
subi Razr0,1
sbci Razr1,0
sbci Razr2,0
brcc Delay
ret ; возврат из процедуры
__________________
Мозги кипят, ядрить твою валентность!!! Пойду закладывать остальные ингредиенты...
Последний раз редактировалось DAVE_ELEKTRIK; 17.12.2011 в 04:02.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:20.
|
|