Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 07.12.2011, 12:27  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
можно ли в разных функциях, не работающих одновременно написать в каждой свой обработчик одного и того же прерывания? Компилятор "поймет" к какой функции какой обработчик надо подтыкать? Или обработчик определенного прерывания во всей программе может быть только один?
В прерывании устанавливайте флаг (или несколько флагов), а в основной программе обрабатывайте каждый этот флаг по-своему (как надо)

Сообщение от makakus Посмотреть сообщение
Вы хотите вызывать обработчик из основной программы. Хорошо. Но во время его работы может возникнуть прерывание, снова его вызывающее. Он отработает от начала до конца и вернётся, куда-то в середину собственного тела (здесь уже прочие прерывания будут разрешены!)
Для этого достаточно вместо вызова прерывания устанавливать флаг прерывания. Дальнейшее система прерываний сделает сама
Реклама:
niXto вне форума  
Непрочитано 07.12.2011, 12:51  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от niXto Посмотреть сообщение
устанавливать флаг прерывания
В контроллерах AVR флаги прерывания установить программно невозможно, можно только сбросить.
makakus вне форума  
Непрочитано 07.12.2011, 14:06  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Похоже, если я правильно понял, имея Тини13 и всего один таймер на борту надо писать как бы универсальный (или с ветвлениями) обработчик прерываний от него, чтобы использовать их не в одной функции.
roma9112 вне форума  
Непрочитано 07.12.2011, 14:49  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
надо писать как бы универсальный (или с ветвлениями) обработчик прерываний от него
Даже у таймера тини13 три прерывания. Нужно идти от задачи: зачем вашему девайсу точно мерить время? Нельзя ли обойтись программным счётчиком? Конечно, использовать таймер удобно, он всё равно есть. Дальше можно приделать программный "удлинитель" таймера.

Допустим, вам нужен ШИМ 1 кгц. ШИМ организуем на компараторах таймера с аппаратным выводом на ногу контроллера, управление ШИМом - записал в OCRa / OCRb и всё. В обработчике прерывания по переполнению таймера (период 1 мс) наращиваем счётчик (переменная в памяти). Когда он ==10 сбрасываем его в 0, ставим флаг "10ms". Через этот флаг main вызывает опрос клавиатуры и регенерацию индикатора, а ещё наращивает другой счётчик. Когда этот другой достигнет 100 пройдёт секунда, например это нужно чтобы считать время. Так от одного аппаратного прерывания 1ms образуется несколько программных. Можно в прерывании тупо наращивать, например, чертырёхбайтную переменную. И пусть много функций за ней следят и так ориентируются во времени. Для примера выше она переполнится через 1мс*2^32 = почти 50 суток.

Последний раз редактировалось makakus; 07.12.2011 в 14:57.
makakus вне форума  
Непрочитано 07.12.2011, 15:18  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Прерывание по сравнению уже испоьзую
roma9112 вне форума  
Непрочитано 07.12.2011, 15:58  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
Похоже, если я правильно понял, имея Тини13 и всего один таймер на борту надо писать как бы универсальный (или с ветвлениями) обработчик прерываний от него, чтобы использовать их не в одной функции.
Сформулируйте правильно задачу прежде всего для себя... Если у вас конечный автомат или возникла необходимость в RTOS посмотрите на OSA tester'а, может какие-то решения или подходы подскажут вам решения своей задачи...
Есть такое понятие как tic... таймер непрерывно отсчитывает определённый интервал, допустим 1 mS... все остальные временные интервалы привязываются к tic'у, т.е они кратны ему... Манипулируя флагами и переменными в прерывании и в теле основной проги получаем подобие OS...
st_1 вне форума  
Непрочитано 07.12.2011, 16:17  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Вот, на применении тиков я как раз и остановился, как на наиболее универсальном варианте(для меня). Спасибо!
roma9112 вне форума  
Непрочитано 15.12.2011, 09:37  
pinco
Гражданин KAZUS.RU
 
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
pinco на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
Да подумал, что можно в обработчике прерывания поместить, как бы правильнее сказать-то, вариант выбора обработки прерывания(или это компилятор может делать), в зависимости от каких то условий, а далее перейти на этот самый вариант...
Так тоже вполне нормально будет работать , это обычно используется когда на одно и то же прерывание надо реагировать по разному в соответствии от текущих условий когда это все происходит .Компилятор сам этого не делает - все варианты сработки после возникновения прерывания куда именно нужно идти для попадания в нужную (в зависимости от конкретных условий - про флаги для распознавания этого,и прочее, уже сказали) ветку обработки (одного и того же обработчика прерывания) - Вы пишете сами ,также как и сам весь обработчик прерывания, это задача не компилятора , а Ваш выкрутас ,который Вы хотите реализовать ,или к примеру пытаетесь реализовать, а как именно Вы это реализуете он не может предугадать - машина не "телепат", она только выполняет Ваши написанные задумки , да на ошибки указывает если они есть ,и какие она еще может заметить .И кстати примерно подобные вещи с прерываниями не так давно как-то на С и kison уже делал , можете спросить подробности у него , если там все нормально у него тогда получилось .
__________________
Короче асма кода нет !

Последний раз редактировалось pinco; 15.12.2011 в 10:25.
pinco вне форума  
Непрочитано 15.12.2011, 23:22  
roma9112
Гражданин KAZUS.RU
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Подключил вот я функцию в майн, потом еще одну, и места оперативки в Тини13 не стало хватать, перекомпилировал под 2313, и теперь, в первой вызываемой функции не получается выход из обработки прерывания по переполнению Т0, если у меня там тиков больше 600. При симуляции в АВРСтудии курсор просто зависает на месте и все, а часы идут... Не посмотрит кто-нибудь, где я опять накосячил??
Вложения:
Тип файла: txt Receiv.txt (4.0 Кб, 63 просмотров)
roma9112 вне форума  
Непрочитано 16.12.2011, 08:01  
DAVE_ELEKTRIK
Прописка
 
Аватар для DAVE_ELEKTRIK
 
Регистрация: 18.10.2010
Адрес: Planet Earth )
Сообщений: 120
Сказал спасибо: 14
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
DAVE_ELEKTRIK на пути к лучшему
По умолчанию 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.
DAVE_ELEKTRIK вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите начинающему (PIC16F84A). Slava-martyn Микроконтроллеры, АЦП, память и т.д 11 09.09.2010 21:55
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01
Помогите начинающему! kolira Микроконтроллеры, АЦП, память и т.д 6 30.01.2010 15:22
Помогите советом начинающему eler Делимся опытом 64 11.09.2008 17:28
Помогите начинающему!!!! sma-etu Микроконтроллеры, АЦП, память и т.д 2 13.12.2006 18:31


Часовой пояс GMT +4, время: 05:20.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot