реклама на сайте
подробности

 
 
> winavr - помогите с прерываниями, не хотят совместно работать в простой программе
семен78
сообщение Aug 10 2009, 20:20
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 10-08-09
Пользователь №: 51 829



делаю прогу под (tiny2313) в winavr
для контроля зависания компа - комп переодически шлет импульс и если очередной не пришол вовремя то контроллер делает сброс

для наколенной проверки вешаю на ногу диод и на другую кнопку - диод мигает а тыкание кнопки частое должно прерывать мигание диода пока щелкается кнопка - но получается лишь продлить период мигания диода

Код
int c=0;

ISR(INT0_vect){c=1;}   //  прерывание от кнопки

ISR(TIMER1_OVF_vect)
{TCNT1=65500;if (c==1){c=0;} else {PORTB^=1<<3;}}  // прерывание по таймеру  -  лампа гаснет или загорается
  

int main(void)
{
TIMSK=0x80;  // Timer 1 Overflow Interrupt: On

TCNT1=65500; // значение счетного регистра  -  чтоб до переполнения было около 1 сек.

DDRB|=_BV(3);// Вывод порта настраеваем как выход (диод)

PORTD&=~_BV(PD2);// вешаем 0  на вход кнопки

GIMSK=0b01000000; //разрешаем прерывание int0 -  кнопка
MCUCR=0x03; // int by rising front -  для кнопки

sei(); //   общее разрешение прерывания  (sreg 0100000....)

while (1);
}


т.е. прерывание по кнопке срабатывает лишь 1 раз сколько бы не нажимать - после очередной сработки по таймеру опять только раз - а надо чтоб постоянно - в чем причина не пойму
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
семен78
сообщение Aug 11 2009, 14:09
Сообщение #2





Группа: Участник
Сообщений: 8
Регистрация: 10-08-09
Пользователь №: 51 829



то есть, нажатия кнопки будут продлевать до бесконечности как выключенное, так и включенное состояние выхода.
вот именно этого я и добиваюсь

1В на входе - видимо это третье состояние такое(высоко импедансное) - формально по умолчанию 0 - а когда туда пишешь 0 то 0.15В показывает

про между ресет и main не понял
Go to the top of the page
 
+Quote Post
Sergey'F
сообщение Aug 11 2009, 16:35
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



Цитата(семен78 @ Aug 11 2009, 18:09) *
1В на входе - видимо это третье состояние такое(высоко импедансное) - формально по умолчанию 0 - а когда туда пишешь 0 то 0.15В показывает

Я бы не назвал это нормальной работой схемы. Советую разобраться со схемой снаружи и посмотреть схему порта.

Цитата(семен78 @ Aug 11 2009, 18:09) *
про между ресет и main не понял

Как Вы считаете, кто делает инициализацию для объявления int c = 0, которое у Вас раньше было? Какой-то код. И если Вы хотите написать надежную программу, надо знать, какой код и как исполняется между адресом сброса и Вашим C-шным main. Это не относится к Вашей проблеме сейчас, но если уж это ветка для начинающих, надо приучаться к определенному стилю проектирования.

Я бы немного по другому упорядочил операторы:
CODE

ISR(INT0_vect){TCNT1=65500;}
ISR(TIMER1_OVF_vect){TCNT1=65500; PORTB^=1<<3;}

main()
{
//конфигурация тактового импульса
CLKPR = 0x80; //разрешаем запись делителя
CLKPR = 0x08; //делитель 256
//по-хорошему, здесь надо подождать T1+T2 для смены частоты

//конфигурация портов
PORTB=0x00;
DDRB=0x08;
PORTD=0x00;
DDRD=0x00;

//конфигурация таймера 1
TCCR1B=0x00; //отключить таймер
TCNT1=65500; //начальное значение для делителя
TCCR1A=0x00; //Normal mode
TCCR1B=0x05; //деление на 1024
TIFR=0x80; //сбрасываем флаг прерывания Timer 1 Overflow
TIMSK=0x80; //разрешаем прерывание Timer 1 Overflow

//прерывания от кнопок
MCUCR=0x03; //прерывание от Int0 по фронту
EIFR=0x40; //сбрасываем флаг прерывания Int0
GIMSK=0x40; //разрешаем прерывание от Int0

//разрешаем прерывания
asm("sei");

while(1);
}


Но, вообще, я бы сделал:
1) Опрос кнопки по 0 (снаружи подтягивающий резистор, или, задействовать встроенный Pullup на ножке).
2) Детектировать встроенным модулем Capture
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- семен78   winavr - помогите с прерываниями   Aug 10 2009, 20:20
- - _Pasha   Цитата(семен78 @ Aug 10 2009, 23:20) в че...   Aug 10 2009, 21:08
- - Sergey'F   Я не работал с тинькой, но чему равен DDRD, если о...   Aug 10 2009, 21:10
- - семен78   дописал volatile int c=0; эффета нет DDRD есть...   Aug 11 2009, 07:12
|- - Кастусь Рыжов   Цитата(семен78 @ Aug 11 2009, 10:12) DDRD...   Aug 11 2009, 10:25
- - семен78   DDRD(2) - вход по умолчанию - т.е. там 0 и...   Aug 11 2009, 10:58
- - _Pasha   Наконец-то вчитался в постановку задачи. Обнаружил...   Aug 11 2009, 11:24
- - семен78   не понял мысли - смысл прерывания по кнопке чт...   Aug 11 2009, 11:57
|- - Sergey'F   Цитата(семен78 @ Aug 11 2009, 15:57) не п...   Aug 11 2009, 13:23
|- - _Pasha   Цитата(Sergey'F @ Aug 11 2009, 19:35)...   Aug 11 2009, 18:12
- - семен78   схема совсем простетская - проверять нечего - ...   Aug 11 2009, 17:04
- - Sergey'F   Цитата(семен78 @ Aug 11 2009, 21:04) схем...   Aug 11 2009, 20:35
- - семен78   вопрос снят причина - отсутствие внешней подт...   Aug 11 2009, 21:04
|- - Sergey'F   Цитата(семен78 @ Aug 12 2009, 01:04) вопр...   Aug 11 2009, 21:09
- - семен78   Цитатарезистор последовательно с диодом я зря шути...   Aug 12 2009, 08:13


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 14:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016