Начальные данные в EEPROM

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Начальные данные в EEPROM

Сообщение king-live »

Доброго времени суток! Почему при начальной записи в EEPROM любого значения в области 8 бит. При первом включении устройства, считывается в переменную b1m с EEPROM всегда значение 255. Но эмулятор показывает то значение, которое записанно в EEPROM. Спасибо!


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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>
#include <avr/eeprom.h>
#define EEPROM_SECTION  __attribute__ ((section (".eeprom"))) // для удобства написания/чтения программы 

EEMEM uint8_t Mem1=0;

unsigned int a; //время переключения функции White
unsigned int c;//переменная деления функции White
volatile unsigned int b;//переменная умножения функции White
unsigned int d;
unsigned int e;
unsigned int b1m;
unsigned int i2;

void Sot()
{
switch(d)
	{
	case 0:
		PORTD=0b01111101;
		break;
	case 1:
		PORTD=0b11100111;
		break;
	case 2:
		PORTD=0b10010100;
		break;
	case 3:
		PORTD=0b10100100;
		break;
	case 4:
		PORTD=0b11100001;
		break;	
	case 5:
		PORTD=0b10101000;
		break;
	case 6:
		PORTD=0b10001000;
		break;
	case 7:
		PORTD=0b11100110;
		break;
	case 8:
		PORTD=0b10000000;
		break;
	case 9:
		PORTD=0b10100000;
		break;
	}
PORTC |= _BV(PC4);
PORTC |= _BV(PC3);
PORTC &=~_BV(PC5);
_delay_us(500);
}					

void Des()
{
switch(c)
	{
	case 0:
		PORTD=0b01111101;
		break;
	case 1:
		PORTD=0b01100111;
		break;
	case 2:
		PORTD=0b00010100;
		break;
	case 3:
		PORTD=0b00100100;
		break;
	case 4:
		PORTD=0b01100001;
		break;
	case 5:
		PORTD=0b00101000;
		break;
	case 6:
		PORTD=0b00001000;
		break;
	case 7:
		PORTD=0b01100110;
		break;
	case 8:
		PORTD=0b00000000;
		break;
	case 9:
		PORTD=0b00100000;
		break;
	}
PORTC |= _BV(PC3);
PORTC |= _BV(PC5);
PORTC &=~_BV(PC4);
_delay_us(500);
}					

void Ed()
{
switch(b)
	{
	case 0:
		PORTD=0b01111101;//  10000010;
		break;
	case 1:
		PORTD=0b11100111;
		break;
	case 2:
		PORTD=0b10010100;
		break;
	case 3:
		PORTD=0b10100100;
		break;
	case 4:
		PORTD=0b11100001;
		break;
	case 5:
		PORTD=0b10101000;
		break;
	case 6:
		PORTD=0b10001000;
		break;
	case 7:
		PORTD=0b11100110;
		break;
	case 8:
		PORTD=0b10000000;
		break;
	case 9:
		PORTD=0b10100000;
		break;
	}
PORTC |= _BV(PC4);
PORTC |= _BV(PC5);
PORTC &=~_BV(PC3);
_delay_us(500);
}					

void Mem()
{
eeprom_update_byte(&Mem1,b1m);
}
int main(void) 
{
b1m=eeprom_read_byte(&Mem1);
ADCSRA|=(1<<ADEN); // АЦП включён
ADCSRA|=(1<<ADSC); // Активизация АЦП
ADCSRA|=(1<<ADFR);// автоматическое считывание данных АЦП (вроде так) 
ADCSRA|=(0<<ADIF); // Флаг прерывания АЦП (не совсем понятен для чего)
ADCSRA|=(0<<ADIE); // бит разрешения прерывания (не совсем понятен для чего)

ADCSRA|=(1<<ADPS2);
ADCSRA|=(0<<ADPS1);
ADCSRA|=(1<<ADPS0);/* установка предделителя на CLK/32 */

ADMUX|=(0<<REFS1); //установка внутреннего опорного напр. internal 1.1V reference.
ADMUX|=(1<<REFS0);
ADMUX|=(1<<ADLAR); //

ADMUX|=(0<<MUX3);  
ADMUX|=(1<<MUX2);  /* при такой настройке MUX подключаем мультиплекс ADC2 на PINB.4 */
ADMUX|=(1<<MUX1);  
ADMUX|=(1<<MUX0);  /* при такой настройке MUX подключаем мультиплекс ADC2 на PINB.4 */
				 // начало основной программы
DDRD=0xff;       // все выводы порта D сконфигурировать как выходы
DDRC=0xff; // порт C сконфигурирован на выход только 0,1 бит остальные как вход.
DDRB=0xff; // порт B сконфигурирован на выход только 0,1 бит остальные как вход.

while(1)
	{
e++;
if (e>100)
	{
	b1m--;
	Mem();
	e=0;
	}

i2=b1m;

	if(i2>99)
		{
		for(i2;i2>99;i2=i2-100)
			{
			d++;
			}
		}
	else d=0;
	Sot();
	
	if(i2>9)
		{
		for(i2;i2>9;i2=i2-10)
			{
			c++;
			}
		}
	else c=0;

	Des();
	
	if(i2>0)
		{
		for(i2;i2>0;i2--)
			{
			b++;
			}
		}
	else b=0;
	Ed();
	d=0;
	c=0;
	b=0;
	}
}
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Начальные данные в EEPROM

Сообщение Мастер Ломастер »

сформулируйте проблему конкретнее, пока ничего не понятно из ваших слов
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Начальные данные в EEPROM

Сообщение king-live »

Почему записываю в Mem1=0 а считываю с него значение 255?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Начальные данные в EEPROM

Сообщение Мастер Ломастер »

в вашем коде нихрена не поймешь, что к чему... переменная b1m у вас int, а пишете-читаете ее при помощи байтовых функций... начальное значение ни одной переменной не присваиваете... вникать в дебри неаккуратного кода не хочется, извините.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Начальные данные в EEPROM

Сообщение md5sum »

king-live писал(а):Почему записываю в Mem1=0 а считываю с него значение 255?
А файл *.eep в контроллер кто заливать будет?
А вот эмулятор надеется и верит, что eeprom Вы запрограммировали при прошивке - потому и показывает правильные данные.
:)))
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Начальные данные в EEPROM

Сообщение king-live »

Вот исправил код и добавил комментарии. Как залить мне в EEPROM данные в этом коде, как его исправить? Или дополнить?

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>
#include <avr/eeprom.h>
#define EEPROM_SECTION  __attribute__ ((section (".eeprom"))) // для удобства написания/чтения программы 

EEMEM uint8_t Mem1=0;

unsigned int d=0;//переменная для индикации сотовых значений
unsigned int c=0;//переменная для индикации десятичных значений
unsigned int b=0;//переменная для индикации единичных значений
unsigned int e=0;//таймер для записи в EEPROM
unsigned char b1m=0;//переменная для хранения значения в EEPROM
unsigned char i2=0;//переменная для разделения числа на три составляющих (100, 10, 1)

void Sot()// функция для индикации значений =>100  
{
switch(d)
	{
	case 0:
		PORTD=0b01111101;
		break;
	case 1:
		PORTD=0b11100111;
		break;
	case 2:
		PORTD=0b10010100;
		break;
	case 3:
		PORTD=0b10100100;
		break;
	case 4:
		PORTD=0b11100001;
		break;	
	case 5:
		PORTD=0b10101000;
		break;
	case 6:
		PORTD=0b10001000;
		break;
	case 7:
		PORTD=0b11100110;
		break;
	case 8:
		PORTD=0b10000000;
		break;
	case 9:
		PORTD=0b10100000;
		break;
	}
PORTC |= _BV(PC4);
PORTC |= _BV(PC3);
PORTC &=~_BV(PC5);
_delay_us(500);
}					

void Des()// функция для индикации значений =>10 
{
switch(c)
	{
	case 0:
		PORTD=0b01111101;
		break;
	case 1:
		PORTD=0b01100111;
		break;
	case 2:
		PORTD=0b00010100;
		break;
	case 3:
		PORTD=0b00100100;
		break;
	case 4:
		PORTD=0b01100001;
		break;
	case 5:
		PORTD=0b00101000;
		break;
	case 6:
		PORTD=0b00001000;
		break;
	case 7:
		PORTD=0b01100110;
		break;
	case 8:
		PORTD=0b00000000;
		break;
	case 9:
		PORTD=0b00100000;
		break;
	}
PORTC |= _BV(PC3);
PORTC |= _BV(PC5);
PORTC &=~_BV(PC4);
_delay_us(500);
}					

void Ed()// функция для индикации значений =>1 
{
switch(b)
	{
	case 0:
		PORTD=0b01111101;
		break;
	case 1:
		PORTD=0b11100111;
		break;
	case 2:
		PORTD=0b10010100;
		break;
	case 3:
		PORTD=0b10100100;
		break;
	case 4:
		PORTD=0b11100001;
		break;
	case 5:
		PORTD=0b10101000;
		break;
	case 6:
		PORTD=0b10001000;
		break;
	case 7:
		PORTD=0b11100110;
		break;
	case 8:
		PORTD=0b10000000;
		break;
	case 9:
		PORTD=0b10100000;
		break;
	}
PORTC |= _BV(PC4);
PORTC |= _BV(PC5);
PORTC &=~_BV(PC3);
_delay_us(500);
}					

void Mem()// функция записи в EEPROM
{
eeprom_update_byte(&Mem1,b1m);
}
int main(void) 
{
b1m=eeprom_read_byte(&Mem1);//считывания данных с EEPROM в переменную b1m

ADCSRA|=(1<<ADEN); // АЦП включён
ADCSRA|=(1<<ADSC); // Активизация АЦП
ADCSRA|=(1<<ADFR);// автоматическое считывание данных АЦП (вроде так) 
ADCSRA|=(0<<ADIF); // Флаг прерывания АЦП (не совсем понятен для чего)
ADCSRA|=(0<<ADIE); // бит разрешения прерывания (не совсем понятен для чего)

ADCSRA|=(1<<ADPS2);
ADCSRA|=(0<<ADPS1);
ADCSRA|=(1<<ADPS0);/* установка предделителя на CLK/32 */

ADMUX|=(0<<REFS1); //установка внутреннего опорного напр. internal 1.1V reference.
ADMUX|=(1<<REFS0);
ADMUX|=(1<<ADLAR); //

ADMUX|=(0<<MUX3);  
ADMUX|=(1<<MUX2);  /* при такой настройке MUX подключаем мультиплекс ADC2 на PINB.4 */
ADMUX|=(1<<MUX1);  
ADMUX|=(1<<MUX0);  /* при такой настройке MUX подключаем мультиплекс ADC2 на PINB.4 */
				 // начало основной программы
DDRD=0xff;       // все выводы порта D сконфигурировать как выходы
DDRC=0xff; // порт C сконфигурирован на выход только 0,1 бит остальные как вход.
DDRB=0xff; // порт B сконфигурирован на выход только 0,1 бит остальные как вход.

while(1)
	{
e++;
if (e>100)
	{
	b1m--;
	Mem();
	e=0;
	}

i2=b1m; 


//------------------------- начало разложения 3-х значного числа на отдельные 3и разряда

	if(i2>99)
		{
		for(i2;i2>99;i2=i2-100)
			{
			d++;
			}
		}
	else d=0;
	Sot();
	
	if(i2>9)
		{
		for(i2;i2>9;i2=i2-10)
			{
			c++;
			}
		}
	else c=0;

	Des();
	
	if(i2>0)
		{
		for(i2;i2>0;i2--)
			{
			b++;
			}
		}
	else b=0;
	Ed();
	d=0;
	c=0;
	b=0;
	}
}
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Начальные данные в EEPROM

Сообщение md5sum »

king-live писал(а):Вот исправил код и добавил комментарии. Как залить мне в EEPROM данные в этом коде, как его исправить? Или дополнить?
Компилятор прочитав строки типа

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

EEMEM uint8_t Mem1=0;
EEMEM my_type my_var=blablabla;
при сборке проекта формирует файл с расширением .EEP и именем как у .HEX
Поищите рядом с Вашим hex файлом - найдется.
Это файл прошивки МК - области eeprom. Как правило формат у него такой-же как у hex: IHEX.
Вам надо "скормить" этот файл программе прошивки МК - той, которой Вы пользуетесь, и указать что программировать будем не флеш а EEPROM!
— Не говорите мне что делать и я не скажу куда Вам идти...
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Начальные данные в EEPROM

Сообщение king-live »

Да! Спасибо получилось!
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Начальные данные в EEPROM

Сообщение ut1wpr »

king-live писал(а):Вот исправил код и добавил комментарии. Как залить мне в EEPROM данные в этом коде, как его исправить? Или дополнить?

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

SKIP ALL
Уважаемый king-live!
Уважайте и других. Зачем вываливать на страницы форума нескончаемое количество строк кода, совершенно не имеющих отношения к сути вопроса?!
Откуда такое пренебрежение ко всем читающим? Да и пользы эт о не принесет. Лишь единицам захочется ковыряться во всем этом.
Со стороны это выглядит приблизительно так: "Вот я тут понаписывал разного, а вы разбирайтесь, где у меня чего не так".
Еще раз прошу, уважайте читающих!
С уважением,
Виктор.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Начальные данные в EEPROM

Сообщение vitalik_1984 »

king-live писал(а):Вот исправил код и добавил комментарии. Как залить мне в EEPROM данные в этом коде, как его исправить? Или дополнить?

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

DDRD=0xff;       // все выводы порта D сконфигурировать как выходы
DDRC=0xff; // порт C сконфигурирован на выход только 0,1 бит остальные как вход.
DDRB=0xff; // порт B сконфигурирован на выход только 0,1 бит остальные как вход.
Странно значения одинаковые, а комментарии разные:)
В поисках истины человек развивается.
Закрыто

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