|
Xmega Прерывания |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Feb 28 2011, 15:14
|
Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032

|
Цитата(Pavel_Bor @ Feb 28 2011, 17:03)  подключить кнопочку к ХХХ Набрать в интернете запрос "+кнопки +ХХХ" вообще и/или "антидребезг" конкретно. Ответ получится невежливый (очень!), зато подробный, сразу много вариантов и быстрее. Цитата или где об этом можно почитать. Так и да.
|
|
|
|
|
Mar 1 2011, 16:46
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(Pavel_Bor @ Feb 28 2011, 19:03)  Здравствуйте!
Захотелось подключить кнопочку к хмеге. Я так понимаю нужно использовать следующий вектор прерываний. + уровни прерываний. PORTE_INT0_vect 44 // External Interrupt 0 + как-то надо обратится к биту кнопки. Подскажите как это сделать, или где об этом можно почитать. Про xмегу в инете инфы мало можно сказать нету. Вся почти на сайте производителя. Написана на Си для каждого модуля. Кнопку лучше здесь подсоединить по другому. Кнопку к любому выводу. Вывод к каналу событий. В канале событий включить цифровой фильтр(он будет гасить дребезг) . Ну а дальше можно сделать обычное прерывание.......
|
|
|
|
|
Mar 1 2011, 18:44
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(bob1 @ Mar 1 2011, 18:46)  Про xмегу в инете инфы мало можно сказать нету. Руководство по 8-битным AVR-микроконтроллерам XMEGA AATxmega64A3, ATxmega128A3, ATxmega192A3, ATxmega256A3и Application Notes (довольно неплохо сделали, лучше чем для MegaAvr) Цитата Вывод к каналу событий. В канале событий включить цифровой фильтр(он будет гасить дребезг) . Антидребезг - несколько циклов? Цитата Ну а дальше можно сделать обычное прерывание....... Лучше только его и делать...
|
|
|
|
|
Mar 2 2011, 08:00
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(bob1 @ Mar 1 2011, 19:46)  Про xмегу в инете инфы мало можно сказать нету. Вся почти на сайте производителя. Написана на Си для каждого модуля. Кнопку лучше здесь подсоединить по другому. Кнопку к любому выводу. Вывод к каналу событий. В канале событий включить цифровой фильтр(он будет гасить дребезг) . Ну а дальше можно сделать обычное прерывание....... Можно ли обойтись одной кнопкой без запуска захвата входа одним из модулей таймеров/счетчиков? Например здесь: AVR1001-->4.1 Захват входа Может у Вас есть какой-нибудь пример?
Сообщение отредактировал Pavel_Bor - Mar 2 2011, 13:23
|
|
|
|
|
Mar 3 2011, 05:05
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(Pavel_Bor @ Mar 2 2011, 13:00)  Можно ли обойтись одной кнопкой без запуска захвата входа одним из модулей таймеров/счетчиков? Например здесь: AVR1001-->4.1 Захват входа Может у Вас есть какой-нибудь пример? Какую задачу хотите решить??? По нажатию кнопки , что будет срабатывать и на какой частоте работает ядро?? Цитата(_Артём_ @ Mar 2 2011, 18:33)  Время дребезга - это миллисекунды, а не несколько циклов (на 32 МГц - меньше 1uc - разница на 3 порядка). На 32 Мгц скорее всего фильтр работать не будет. Если в "дребезге" будет импульс больше 8/32=0,25мкс , то фильтр его пропустит!!!!
|
|
|
|
|
Mar 3 2011, 07:56
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(bob1 @ Mar 3 2011, 08:05)  Какую задачу хотите решить??? По нажатию кнопки , что будет срабатывать и на какой частоте работает ядро?? Для примера: по нажатию кнопки переключение светодиодов. А конкретно для задачи - написать какое-то слово на ЖК. Частота работы ядра 4.608 Мгц
Сообщение отредактировал Pavel_Bor - Mar 3 2011, 07:56
|
|
|
|
|
Mar 3 2011, 09:09
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(Pavel_Bor @ Mar 3 2011, 12:56)  А конкретно для задачи - написать какое-то слово на ЖК. Частота работы ядра 4.608 Мгц Кнопка к 2 выводу порта Е. ISR(PORTE_INT0_vect){ while((PORTE.IN&PIN2_bm)!=PIN2_bm){};//ждем отпускания кнопки __delay_cycles(F_CPU/10); //время на дребезг .... здесь выводите на экран или устанавливаете флаг срабатывания кнопки. }; или ISR(PORTE_INT0_vect){ PORTE.INTCTRL =0; //запрещает прерывания .... здесь выводите на экран или устанавливаете флаг срабатывания кнопки. }; void main (void) { PORTE.INTCTRL =(uint8_t)PORT_INT0LVL_LO_gc; sei(); PORTE.PIN2CTRL=PORT_SRLEN_bm|PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; while(1); };
Сообщение отредактировал bob1 - Mar 3 2011, 09:10
|
|
|
|
|
Mar 3 2011, 10:29
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 11-02-08
Пользователь №: 34 931

|
Э... А конденсаторы параллельно кнопочке уже отменили? Я бы поставил последовательно с кнопкой резистор Ом на 100-1000 для ограничения тока... А подтяжка чтобы вытягивала нормальное напряжение обычным образом... То есть цепочка такая - вход оттягивается вверх подтяжкой ( например встроенной ), между входом и землей - кондер ( например на 0,1 мкФ ) и параллельно кондеру кнопка с последовательным резистором. Номиналя я бы подобрал так, чтобы время заряда конденсатора от подтяжки значительно превышало время дребезга, а время разряда через кнопку было меньше длительности дребезга, но больше времени замкнутого состояния кнопки при дребезге. То есть если считать что кнопка дребезжит 1 мС импульсами по 1-10 мкС, то время разряда кондера я бы выбрал 50-100 мкС, и время заряда через подтяжку - порядка 10-100 мС. От таких сигналов даже счетчик нажатия адекватно обрабатывает нажатие кнопки... Ну или развлекаться с программной обработкой...
|
|
|
|
|
Mar 3 2011, 10:31
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(Pavel_Bor @ Mar 3 2011, 14:18)  Спасибо. После того как кнопка отпущена происходит задержка, может надо еще раз проверить? Код по прерываниям, без использования захвата событий. Флаг и разрешение прерывания по порту тоже надо устанавливать? Это всего лишь один из вариантов. Да код по прерыванию порта. вот эти строки разрешают прерывание. PORTE.INTCTRL =PORT_INT0LVL_LO_gc; sei(); А флаг в прерывании скорее всего надо будет сбросить перед выходом из него.
|
|
|
|
|
Mar 3 2011, 17:49
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(Pavel_Bor @ Mar 3 2011, 15:49)  а как изменяется код если с событием? Принцип следующий. Вход канала событий подключается к выводу на котором кнопка. Выход канала событий к счетчику. Период счетчика =1. По переполнению счетчика делаем прерывание........ В канале событий задаем значение цифрового фильтра от 1...8. Часть кода должна быть в AVR1001. Данный метод будет работать при более низких тактовых частотах.
|
|
|
|
|
Mar 14 2011, 12:31
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Код //Допустим вешаю я две кнопки на порт Е 6 и 7
PORTE.PIN6CTRL=PORT_OPC_PULLUP_gc | PORT_ISC_BOTHEDGES_gc; PORTE.PIN7CTRL=PORT_OPC_PULLUP_gc | PORT_ISC_BOTHEDGES_gc;
//ставлю уровень прерывания для этого порта LOW
PORTE.INTCTRL=PORTE.INTCTRL & ~PORT_INT0LVL_gm;
#asm("sei") //Разрешаю прерывания
//Ну и собственно само прерывание
interrupt [PORTE_INT0_vect] void porte_int0_isr(void) { while((PORTE.IN&PIN6_bm)!=PIN6_bm){}; // ждем отпускания кнопки for(i=0;i<20;i++); //время на дребезг PORTD.OUT=0xff; } Так вот не попадаю я в тело прерывания..
|
|
|
|
|
Mar 14 2011, 16:46
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Pavel_Bor @ Mar 14 2011, 14:31)  Код //Допустим вешаю я две кнопки на порт Е 6 и 7
PORTE.PIN6CTRL=PORT_OPC_PULLUP_gc | PORT_ISC_BOTHEDGES_gc; PORTE.PIN7CTRL=PORT_OPC_PULLUP_gc | PORT_ISC_BOTHEDGES_gc;
//ставлю уровень прерывания для этого порта LOW
PORTE.INTCTRL=PORTE.INTCTRL & ~PORT_INT0LVL_gm;
#asm("sei") //Разрешаю прерывания
//Ну и собственно само прерывание
interrupt [PORTE_INT0_vect] void porte_int0_isr(void) { while((PORTE.IN&PIN6_bm)!=PIN6_bm){}; // ждем отпускания кнопки for(i=0;i<20;i++); //время на дребезг PORTD.OUT=0xff; } Так вот не попадаю я в тело прерывания.. Может не разрешён соотв. уровень прерываний? Код PMIC.CTRL |= PMIC_LOLVLEN_bm;
|
|
|
|
|
Mar 17 2011, 14:15
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(_Артём_ @ Mar 14 2011, 19:46)  Может не разрешён соотв. уровень прерываний? Код PMIC.CTRL |= PMIC_LOLVLEN_bm; Cтоит, он вот здесь прописан Код void main(void) { #pragma optsize- #asm("cli") PMIC.CTRL|=PMIC_LOLVLEN_bm;
// Restore optimization for size if needed #pragma optsize_default ... }
Сообщение отредактировал Pavel_Bor - Mar 17 2011, 14:15
|
|
|
|
|
Mar 17 2011, 16:16
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Pavel_Bor @ Mar 17 2011, 16:15)  Cтоит, он вот здесь прописан Код void main(void) { #pragma optsize- #asm("cli") PMIC.CTRL|=PMIC_LOLVLEN_bm;
// Restore optimization for size if needed #pragma optsize_default ... } Наверно не проинициализирован регистр INT0MASK (если нужно прерывание 0). Цитата 13.14.11. INT0MASK - регистр маски прерывания 0
Биты 7:0 - INT0MSK[7:0]: регистр маски прерывания 0
С помощью данных бит можно указать, какие линии порта используются в качестве прерывания 0 порта ввода-вывода. Если бит INT0MASKn сделать равным единице, то линия n будет использоваться, как источник прерывания 0. Условия генерации прерываний для каждой линии порта дополнительно задаются с помощью регистров PINnCTRL. http://www.gaw.ru/html.cgi/txt/doc/micros/...ega_a/13_14.htm
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|