AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
25.01.2013, 13:40
|
|
Временная регистрация
Регистрация: 08.01.2007
Сообщений: 92
Сказал спасибо: 17
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Запись в EPROM AVR
Доброго времени суток!
Обращаюсь к Обществу!
Помогите записать в прерывании UART по приему в EPROM
PHP код:
|
eeprom char basa_1[15]="+380675000850"; //Диспечерский Центр 1 (Д.Ц.1) eeprom char basa_2[15]; //Диспечерский Центр 2 (Д.Ц.2) eeprom char basa_3[15]; //Диспечерский Центр 3 (Д.Ц.3)
interrupt [USART0_RXC] void usart0_rx_isr(void) { unsigned char data; static unsigned char j=0, PROG_N1=0xFF, PROG_N2=0xFF, PROG_N3=0xFF, PROG_N=0x00, flag_84=0x00;
data=UDR0;
if(PROG_N1==0x00) //запись номера ДЦ1 { if(j==0) { basa_1[0]= (0x20|(data››4)); basa_1[1]= (0x30|(data&0x0F)); j=1; } else { basa_1[j*2] = (0x30|(data››4)); basa_1[j*2+1]= (0x30|(data&0x0F)); j++; } if(j==7) { PROG_N1=0xFF; j=0x00; }; return; };
if(PROG_N2==0x00) //запись номера ДЦ2 { if(j==0x00) { basa_2[0]= (0x20|(data››4)); basa_2[1]= (0x30|(data&0x0F)); j++; } else { basa_2[j*2] = (0x30|(data››4)); basa_2[j*2+1]= (0x30|(data&0x0F)); j++; } if(j==7) { PROG_N2=0xFF; j=0x00; }; return; };
if(PROG_N3==0x00) //запись номера ДЦ3 { if(j==0x00) { basa_3[0]= (0x20|(data››4)); basa_3[1]= (0x30|(data&0x0F)); j++; } else { basa_3[j*2] = (0x30|(data››4)); basa_3[j*2+1]= (0x30|(data&0x0F)); j++; } if(j==7) { PROG_N3=0xFF; j=0x00; }; return; }; if(data==0x84) { flag_84=0xFF; stop_timer_0_2(); }; if(data==0x78) { flag_84=0x00; start_timer_0_2(); }; if((data&flag_84)==0x70) PROG_N=0xFF; switch (data&PROG_N) { case 0x04: PROG_N1=0x00; PROG_N=0x00; break; case 0x05: PROG_N2=0x00; PROG_N=0x00; break; case 0x06: PROG_N3=0x00; PROG_N=0x00; break; case 0x84: putchar(0x04); putchar((basa_1[0]‹‹4)|(basa_1[1]&0x0F)); putchar((basa_1[2]‹‹4)|(basa_1[3]&0x0F)); putchar((basa_1[4]‹‹4)|(basa_1[5]&0x0F)); putchar((basa_1[6]‹‹4)|(basa_1[7]&0x0F)); putchar((basa_1[8]‹‹4)|(basa_1[9]&0x0F)); putchar((basa_1[10]‹‹4)|(basa_1[11]&0x0F)); putchar((basa_1[12]‹‹4)|0x0F); putchar(0xFF); PROG_N=0x00; break; case 0x85: putchar(0x05); putchar((basa_2[0]‹‹4)|(basa_2[1]&0x0F)); putchar((basa_2[2]‹‹4)|(basa_2[3]&0x0F)); putchar((basa_2[4]‹‹4)|(basa_2[5]&0x0F)); putchar((basa_2[6]‹‹4)|(basa_2[7]&0x0F)); putchar((basa_2[8]‹‹4)|(basa_2[9]&0x0F)); putchar((basa_2[10]‹‹4)|(basa_2[11]&0x0F)); putchar((basa_2[12]‹‹4)|0x0F); putchar(0xFF); PROG_N=0x00; break; case 0x86: putchar(0x06); putchar((basa_3[0]‹‹4)|(basa_3[1]&0x0F)); putchar((basa_3[2]‹‹4)|(basa_3[3]&0x0F)); putchar((basa_3[4]‹‹4)|(basa_3[5]&0x0F)); putchar((basa_3[6]‹‹4)|(basa_3[7]&0x0F)); putchar((basa_3[8]‹‹4)|(basa_3[9]&0x0F)); putchar((basa_3[10]‹‹4)|(basa_3[11]&0x0F)); putchar((basa_3[12]‹‹4)|0x0F); putchar(0xFF); PROG_N=0x00; break; default: UDR0=data; }; }
|
Подскажите что нибудь дельное
Последний раз редактировалось papa_n; 25.01.2013 в 13:43.
|
|
|
|
25.01.2013, 14:06
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Запись в EPROM AVR
IMHO, прерывание должно быть как тост - кратким и содержательным. Я бы не стал в прерывании писать в EEPROM да еще вызывать процедуры типа putchar, а принимал бы в какой-то буфер, по заполнении буфера выставлял флаг - а в рабочем цикле по этому флагу делай что угодно...
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
25.01.2013, 14:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Запись в EPROM AVR
Время записи в EPROM 5 mc, за это времени на скорости 9600 - придет почти 5 байт.
|
|
|
|
25.01.2013, 15:27
|
|
Временная регистрация
Регистрация: 08.01.2007
Сообщений: 92
Сказал спасибо: 17
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Запись в EPROM AVR
Спасибо! Попробую
|
|
|
|
25.02.2014, 09:28
|
|
Прописка
Регистрация: 28.04.2008
Сообщений: 134
Сказал спасибо: 7
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
|
Re: Запись в EPROM AVR
Ребята помогите записать в EEPROM два байта переменную int. Что то у меня не получается. С переменной char проблем нет. Компилятор CodeWizardAVR V2.03.9 Standard
|
|
|
|
25.02.2014, 09:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,831
Сказал спасибо: 742
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
|
Re: Запись в EPROM AVR
Первоисточник здесь http://radiokot.ru/forum/viewtopic.php?t=1360
Код:
|
// EEPROM Data Read Function - чтение байта из EEPROM по заданному адресу
unsigned int readEEPROM (unsigned int addr)
{
unsigned int data = 0;
while (EECR.1 != 0);
EEAR = addr;
EECR.0 = 1;
EECR.0 = 0;
data = EEDR;
return data;
}
// EEPROM Data Write Function - запись байта data в EEPROM по заданному адресу
void writeEEPROM (unsigned int addr, unsigned char data)
{
while (EECR.1 != 0);
EEAR = addr;
EEDR = data;
EECR.2 = 1;
EECR.1 = 1;
}
// EEPROM Data Copy Function - копирование данных из ячейки в ячейку
void copyEEPROM (unsigned int saddr, unsigned char taddr)
{
writeEEPROM (taddr, readEEPROM (saddr));
}
// EEPROM 2-byte Data Write Function - запись двухбайтового числа в 2 последовательные ячейки с адресом первой addr
void _2bwriteEEPROM (unsigned int addr, unsigned int data)
{
if ((data / 256) != readEEPROM (addr)) writeEEPROM (addr, (unsigned char)(data / 256));
writeEEPROM (addr + 1, (unsigned char)(data % 256));
}
// EEPROM 2-byte Data Read Function - чтение двухбайтового числа из 2 последовательных ячеек с адресом первой addr
unsigned int _2breadEEPROM (unsigned int addr)
{
unsigned int data = 0;
data = 256 * readEEPROM(addr) + readEEPROM(addr + 1);
return data;
} |
__________________
Да здравствует Разум,да сгинет Маразм!
|
|
|
|
25.02.2014, 10:06
|
|
Прописка
Регистрация: 28.04.2008
Сообщений: 134
Сказал спасибо: 7
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
|
Re: Запись в EPROM AVR
Сообщение от E_C_C
|
Первоисточник здесь http://radiokot.ru/forum/viewtopic.php?t=1360
Код:
|
// EEPROM Data Read Function - чтение байта из EEPROM по заданному адресу
unsigned int readEEPROM (unsigned int addr)
{
unsigned int data = 0;
while (EECR.1 != 0);
EEAR = addr;
EECR.0 = 1;
EECR.0 = 0;
data = EEDR;
return data;
}
// EEPROM Data Write Function - запись байта data в EEPROM по заданному адресу
void writeEEPROM (unsigned int addr, unsigned char data)
{
while (EECR.1 != 0);
EEAR = addr;
EEDR = data;
EECR.2 = 1;
EECR.1 = 1;
}
// EEPROM Data Copy Function - копирование данных из ячейки в ячейку
void copyEEPROM (unsigned int saddr, unsigned char taddr)
{
writeEEPROM (taddr, readEEPROM (saddr));
}
// EEPROM 2-byte Data Write Function - запись двухбайтового числа в 2 последовательные ячейки с адресом первой addr
void _2bwriteEEPROM (unsigned int addr, unsigned int data)
{
if ((data / 256) != readEEPROM (addr)) writeEEPROM (addr, (unsigned char)(data / 256));
writeEEPROM (addr + 1, (unsigned char)(data % 256));
}
// EEPROM 2-byte Data Read Function - чтение двухбайтового числа из 2 последовательных ячеек с адресом первой addr
unsigned int _2breadEEPROM (unsigned int addr)
{
unsigned int data = 0;
data = 256 * readEEPROM(addr) + readEEPROM(addr + 1);
return data;
} |
|
Спасибо, понял.
|
|
|
|
25.02.2014, 10:06
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Запись в EPROM AVR
из хэлпа CV:
/* The value 1 is stored in the EEPROM during chip programming */
eeprom int alfa=1;
/* Write directly the value 0x55 to the EEPROM */
alfa=0x55;
|
|
|
|
25.02.2014, 11:18
|
|
Прописка
Регистрация: 28.04.2008
Сообщений: 134
Сказал спасибо: 7
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
|
Re: Запись в EPROM AVR
Сообщение от oleg110592
|
из хэлпа CV:
/* The value 1 is stored in the EEPROM during chip programming */
eeprom int alfa=1;
/* Write directly the value 0x55 to the EEPROM */
alfa=0x55;
|
Это я читал, спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:55.
|
|