Доброго времени суток! Почему при начальной записи в 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;
}
}
в вашем коде нихрена не поймешь, что к чему... переменная b1m у вас int, а пишете-читаете ее при помощи байтовых функций... начальное значение ни одной переменной не присваиваете... вникать в дебри неаккуратного кода не хочется, извините.
битва с дураками проиграна, победители торжествуют. слава победителям!
king-live писал(а):Почему записываю в Mem1=0 а считываю с него значение 255?
А файл *.eep в контроллер кто заливать будет?
А вот эмулятор надеется и верит, что 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;
}
}
при сборке проекта формирует файл с расширением .EEP и именем как у .HEX
Поищите рядом с Вашим hex файлом - найдется.
Это файл прошивки МК - области eeprom. Как правило формат у него такой-же как у hex: IHEX.
Вам надо "скормить" этот файл программе прошивки МК - той, которой Вы пользуетесь, и указать что программировать будем не флеш а EEPROM!
— Не говорите мне что делать и я не скажу куда Вам идти...
Уважаемый king-live!
Уважайте и других. Зачем вываливать на страницы форума нескончаемое количество строк кода, совершенно не имеющих отношения к сути вопроса?!
Откуда такое пренебрежение ко всем читающим? Да и пользы эт о не принесет. Лишь единицам захочется ковыряться во всем этом.
Со стороны это выглядит приблизительно так: "Вот я тут понаписывал разного, а вы разбирайтесь, где у меня чего не так".
Еще раз прошу, уважайте читающих!
DDRD=0xff; // все выводы порта D сконфигурировать как выходы
DDRC=0xff; // порт C сконфигурирован на выход только 0,1 бит остальные как вход.
DDRB=0xff; // порт B сконфигурирован на выход только 0,1 бит остальные как вход.
Странно значения одинаковые, а комментарии разные:)