Прерывание не меняет переменную

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

Код: Выделить всё

#include (avr/interrupt.h)  // скобы угловые
#include (util/delay.h)
#define F_CPU 1000000UL      // 1 MHz
char a;
 ISR(INT0_vect){  //Обработчик внешнего прерывания
 a = 0x01;  
}

int main(void){     //Главная функция
DDRC = 0xff;
PORTD = 0xff; // Подтяжка int0
MCUCR=0x02; // 00 - Прерывание при 0 уровне; 02 - при падении; 03 - при повышении
GICR  = 0b11000000;
sei ();

 while (1) {
PORTC = a;}
}
При срабатывании прерывания на порт С должна подаваться 1, но этого не происходит :cry: Объясните почему?? :oops:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Может не хочет из-за того что указана символьная переменная char, смените на беззнаковое число unsigned int... Си язык требующий всяческих приведений переменных.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

Meteor писал(а):смените на беззнаковое число unsigned int... Си язык требующий всяческих приведений переменных.
Сменил - ничего не дало :cry:

В самом обработчике, переменная меняется, но при выходе в цикле while переменная опять равна 0 :evil:
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Объявите ее глобальной staticесли не ошибаюсь
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

Meteor писал(а):Объявите ее глобальной
Она же и так глобальна :shock:, или можно еще глобальней ? :))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Если мне память не изменяет, то объявление всех переменных в С, производится в основном теле программы. А не вне этого тела
int main(void){
static unsigned int a;
unsigned int b; и пр
}
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

Meteor писал(а):Если мне память не изменяет, то объявление всех переменных в С, производится в основном теле программы. А не вне этого тела
int main(void){
static unsigned int a;
unsigned int b; и пр
}

Да ничего подобного, если делать так, то переменная будет действовать только в пределах функции main, т.е. та что в обработчике будет вообще не объявлена и копмилятор будет ругаться!! :idea:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

-==MAXCELERON==- писал(а): Да ничего подобного, если делать так, то переменная будет действовать только в пределах функции main, т.е. та что в обработчике будет вообще не объявлена и копмилятор будет ругаться!! :idea:
попробуй объяви переменную как
volatile char a;
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

Neekeetos писал(а): попробуй объяви переменную как
volatile char a;
Спасибо!! так работает:

Код: Выделить всё

#include (avr/interrupt.h)  // скобы угловые 
#include (util/delay.h)
#define F_CPU 1000000UL      // 1 MHz 
volatile char a; 
 ISR(INT0_vect){  //Обработчик внешнего прерывания 
 a = 0x01;  
} 

int main(void){     //Главная функция 
DDRC = 0xff; 
PORTD = 0xff; // Подтяжка int0 
MCUCR=0x02; // 00 - Прерывание при 0 уровне; 02 - при падении; 03 - при повышении 
GICR  = 0b11000000; 
sei (); 

 while (1) { 
PORTC = a;} 
}
:))) :))) :)))
Электрический кот
Аватара пользователя
Сообщения: 1040
Зарегистрирован: Чт фев 19, 2009 17:46:34

Сообщение neonix »

-==MAXCELERON==- Ты хоть понял почему так заработало ?

Код: Выделить всё

volatile char a;
Where technology meets enjoyment.
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

neonix писал(а):-==MAXCELERON==- Ты хоть понял почему так заработало ?

Код: Выделить всё

volatile char a;
Неправильный вопрос, откуда бы он мог знать что gcc/винавр в погоне за оптимизацией физически удаляет переменные если они не меняются в основном коде, а функция прерывания из мэйна не вызывается соотв переменная для компилятора выглядит как константа.
Контактная информация:
Электрический кот
Аватара пользователя
Сообщения: 1040
Зарегистрирован: Чт фев 19, 2009 17:46:34

Сообщение neonix »

Дык собственно я и хотел попытатся заствить узнать почему не работало :) Ибо бездумное следование советам опыта не прибавит )
Where technology meets enjoyment.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

neonix писал(а): Ибо бездумное следование советам опыта не прибавит )
Почему бездумное?? Я подумал, запомнил 8)
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

neonix писал(а):Дык собственно я и хотел попытатся заствить узнать почему не работало :) Ибо бездумное следование советам опыта не прибавит )
Не надо никого заставлять, он и так все правильно делает. Я с этими переменными неделю промучался пока не догадался заглянуть в ассемблер который гцц сгенерил, фишка в том что обычно компиляторы так не делают.
Контактная информация:
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Neekeetos писал(а):
neonix писал(а):Дык собственно я и хотел попытатся заствить узнать почему не работало :) Ибо бездумное следование советам опыта не прибавит )
Не надо никого заставлять, он и так все правильно делает. Я с этими переменными неделю промучался пока не догадался заглянуть в ассемблер который гцц сгенерил, фишка в том что обычно компиляторы так не делают.
На самом деле довольно многие компиляторы примерно так поступают, просто большинство из них не знакомо "широкой общественности", ведь основная масса программистов пишут программы на ПК и под ПК, а там такой проблемы нет. Ну а вообще, если программа ведёт себя странным образом, очень полезно не гадать, а сразу же смотреть, какой ассемблерный код был получен. Иногда, например, он попросту неверный из-за ошибок в компиляторе. Естественно, это относится к любому языку программирования на любой платформе -- совершенных вещей, увы, не существует.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»