atmega32 и atmega16 проблема переменных

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

atmega32 и atmega16 проблема переменных

Сообщение shurikss123 »

всем здрасте!
есть проблема непойму ничего когда выставляю переменные в глобально то не могу их изменить при работе таймера
таймер работает все рисует и делает а вот переменнные не изменяються

так не работает

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

...

unsigned char mode=0;//Переменная пункта меню
int flag=0;//Флаг вывода на экран пункта меню

...

ISR(TIMER0_OVF_vect)
{
++mode;
LCDsendChar(mode);
}
а так работает

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

...

unsigned char mode=0;//Переменная пункта меню
int flag=0;//Флаг вывода на экран пункта меню

...

int main (void)
{
while (1)
{
++mode;
LCDsendChar(mode);
}
}
Заранее посибо
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: atmega32 и atmega16 проблема переменных

Сообщение ARV »

поискать на форуме лень... а я уже пальцы стер по самые локти, набирая одно и то же:
все переменные, используемые и в обработчике прерываний и в других функциях, должны объявляться, как volatile!!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: atmega32 и atmega16 проблема переменных

Сообщение shurikss123 »

Хм все равно не работает! :oops:
грабли гдето в другом месте
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: atmega32 и atmega16 проблема переменных

Сообщение ARV »

другим местом может быть вторая уже навязшая в зубах тема о том, что в прерываниях крайне нежелательно использовать обращение к другим функциям...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: atmega32 и atmega16 проблема переменных

Сообщение shurikss123 »

Пол дня долбался и тока что впомнил про флаг, я их не правильно в таимере обозвал и он просто молчит как партизан и никаких действий на лсд

вот код, можете ругать это все в кучу скидал и оно работает

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

#define F_CPU 16000000UL   // Объявляем, что у нас припаян резонатор на 16 МГц. От этой строки зависит
						  // корректность работы функции _delay_ms. Следует писать в начале файла, до
                          // #include, так как F_CPU используется в заголовочных файлах
#include </usr/lib/avr/include/avr/io.h>// Всегда нужно включать. Эти заголовки содержат объявления, общие для всех AVR
#include </usr/lib/avr/include/avr/iom32.h>// Файл с описанием объявлений для конкретного микроконтроллера
#include </usr/lib/avr/include/avr/interrupt.h>//Библиотека прерываний
#include </usr/lib/avr/include/util/delay.h>// Для использования "пауз"
#include </home/shurik/workspace/robo2/lcd_lib.h> //для лсд

const unsigned char codes[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

char mode=0;//Переменная пункта меню
int flag=0;//Флаг вывода на экран пункта меню

char i;
char prog=10;
int mute=0;
int temp,res;

ISR(TIMER0_OVF_vect)
{
	if (mode==0)
	{
		if ((PINB&0x01)==0x00) //Если низкий уровень на PB0 есть
		{
			_delay_ms(10); //Ждем 0.01с
			if ((PINB&0x01)==0x00)
			{
				while ((PINB&0x01)==0x00); //Ждем отжатия клавиши;
				{
				if (prog <100)
					{
					++prog;
					flag=0;
					}
				}
			}
			TCNT0 = 0xcc;
		}
		if ((PINB&0x02)==0x00) //Если низкий уровень на PB0 есть
		{
			_delay_ms(10); //Ждем 0.01с
			if ((PINB&0x02)==0x00)
			{
				while ((PINB&0x02)==0x00); //Ждем отжатия клавиши;
				{
					if (prog>0)
					{
						--prog;
						flag=0;
					}
				}
			}
			TCNT0 = 0xcc;
		}
		if ((PINB&0x04)==0x00) //Если низкий уровень на PB0 есть
		{
			_delay_ms(10); //Ждем 0.01с
			if ((PINB&0x04)==0x00)
			{
				while ((PINB&0x04)==0x00); //Ждем отжатия клавиши;
				{
					if (mute==1) --mute;
					else  ++mute;
					flag=0;
				}
			}
			TCNT0 = 0xcc;
		}
		if ((PINB&0x08)==0x00) //Если низкий уровень на PB0 есть
		{
			_delay_ms(10); //Ждем 0.01с
			if ((PINB&0x08)==0x00)
			{
				while ((PINB&0x08)==0x00); //Ждем отжатия клавиши;
				{
					++mode;
					flag=0;
				}
			}
			TCNT0 = 0xcc;
		}
	}
	if (mode==1)
	{
		if ((PINB&0x08)==0x00) //Если низкий уровень на PB0 есть
		{
			_delay_ms(10); //Ждем 0.01с
			if ((PINB&0x08)==0x00)
			{
				while ((PINB&0x08)==0x00); //Ждем отжатия клавиши;
				{
					--mode;
					flag=0;
				}
			}
			TCNT0 = 0xcc;
		}
	}
	TCNT0 = 0xcc;
	return;
}

void lcd_string( char *s )
{
while( *s )
LCDsendChar(*s++ );
}

void menu(void)
{
	if (mode==0)//Если переменная меню=0
	{
		if (flag==0)//Если флаг=0
		{
			LCDclr();
			lcd_string("<Menu1>");//Выводим название первого пункта меню 1
			LCDGotoXY(0,1);
			LCDprogressBar(prog,100,13);
			LCDGotoXY(13,1);

			temp=prog;
			res=temp/100; //Calculate 100-s
			LCDsendChar(codes[res]);
			temp=temp-res*100;

			res=temp/10; //Calculate 10-s
			LCDsendChar(codes[res]);
			temp=temp-res*10;

			res=temp/1; //Calculate 1-s
			LCDsendChar(codes[res]);
			temp=temp-res*1;
			if (mute == 1)
			{
				LCDGotoXY(15,0);
				LCDsendChar('X');
			}
			else
			{
				LCDGotoXY(15,0);
				LCDsendChar(' ');
			}
			flag=1;//Переключаем флаг=1
		}
	}
	if (mode==1)//Если переменная меню=1
	{
		if (flag==0)//Если флаг=0
		{
			LCDclr();
			lcd_string("<Menu2>");//Выводим название первого пункта меню 2
			LCDGotoXY(0,1);
			lcd_string("USB Ready");
			flag=1;//Переключаем флаг=1
		}
	}
	if (mode==2)//Если флаг=0
	{
		LCDclr();
		lcd_string("<Menu3>");//Выводим название первого пункта меню 3
		LCDGotoXY(0,1);
		lcd_string("about");
		flag=1;//Переключаем флаг=1
	}
}

int main (void)
{
	DDRB=0xF0;
	PORTB=0x0F;

	LCDinit();
	LCDclr();

	_delay_ms(100);

	TCCR0 = (1<<CS01)|(1<<CS00); //8
	TCNT0 = 0xcc; // 300hz

	TIMSK |= (1<<TOIE0);
	TIFR |= (1<<TOV0);
	sei();

	while(1)//Вечный цикл
	{
		menu();//Запуск обработки пунктов меню
	}

}
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Реклама
Закрыто

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