Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » EEPROM память

Страниц (2): [1] 2 »
 

1. mctim - 04 Декабря, 2009 - 22:12:22 - перейти к сообщению
Привет!
Подскажите пожалуйста в чем у меня ошибка.
Пытаюсь записать байт в EEPROM память и считать.
CODE:

EEPROM_write(0,0x1A); // запись в нулевую ячейку значения 0х1А
if(EEPROM_read(0) == 0x1A) // считывание значения из ячейки по адресу 0 и сравнение его с записаным
while(1)
{ // мигание светодиодом
PORTC |= 0b00000010;
_delay_ms(1000);
PORTC &= ~0b00000010;
_delay_ms(1000);
}

По идее светодиод должен замигать.

Вот функции записи/чтения:
CODE:

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
EEAR = uiAddress; /*Проинициализировать регистры*/
EEDR = ucData;
EECR |= (1<<EEMWE); /*Установить флаг EEMWE*/
EECR |= (1<<EEWE); /*Начать запись в EEPROM*/
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
EEAR = uiAddress; /*Проинициализировать регистр адреса*/
EECR |= (1<<EERE); /*Выполнить чтение*/
return EEDR;
}

Скопировал их из datasheet.
2. nest - 04 Декабря, 2009 - 22:27:30 - перейти к сообщению
mctim, посмотрите, с какого адреса начинается EEPROM у вашего МК.
3. mctim - 04 Декабря, 2009 - 22:39:03 - перейти к сообщению
Пытался. Начала не нашел. Но вот написано:
"
Верхняя
граница
(E_END)
$1FF
"
При обьеме 512 байт я сделал предположение что нижняя граница - 0.
Это я говорю о ATmega8
4. nest - 04 Декабря, 2009 - 22:44:00 - перейти к сообщению
а! я с SRAM спутал :)

а почему бы вам с даташита не скопировать нужные куски кода ?
CODE:

; чтение
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}
5. mctim - 04 Декабря, 2009 - 22:48:11 - перейти к сообщению
Подшучивать, дразнить а я что сделал?
mctim пишет:
Скопировал их из datasheet.
6. nest - 04 Декабря, 2009 - 23:13:48 - перейти к сообщению
хм. а если так:
CODE:
EEPROM_write(0,0x1A); // запись в нулевую ячейку значения 0х1А
data=EEPROM_read(0); считывание значения из ячейки по адресу 0
if(data == 0x1A) // сравнение с записаным
7. mctim - 04 Декабря, 2009 - 23:27:15 - перейти к сообщению
Ничего не меняет.
Считывал EEPROM память с МК после записи.
CODE:

:020000020000FC
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:00000001FF

Насколько я понимаю все биты выставлены в 1. Тоесть память девственно чиста.

О! И точно.
CODE:

EEPROM_write(0,0x1A); // запись в нулевую ячейку значения 0х1А
if(EEPROM_read(0) == 0xFF) // считывание значения из ячейки по адресу 0 и сравнение его с 0xFF
while(1)
{ // мигание светодиодом
PORTC |= 0b00000010;
_delay_ms(1000);
PORTC &= ~0b00000010;
_delay_ms(1000);
}

Так мигает.
Почему же запись не выполняется. Может есть гдето запрет записи. Я такого в документации не встречал Замешательство
8. nest - 04 Декабря, 2009 - 23:44:21 - перейти к сообщению
дайте ка прошивочку, где НЕ мигает ?
9. mctim - 04 Декабря, 2009 - 23:59:28 - перейти к сообщению
так не мигает
CODE:
EEPROM_write(0,0x1A); // запись в нулевую ячейку значения 0х1А
if(EEPROM_read(0) == 0x1A) // считывание значения из ячейки по адресу 0 и сравнение его с записаным
while(1)
{ // мигание светодиодом
PORTC |= 0b00000010;
_delay_ms(1000);
PORTC &= ~0b00000010;
_delay_ms(1000);
}

так мигает
CODE:
EEPROM_write(0,0x1A); // запись в нулевую ячейку значения 0х1А
if(EEPROM_read(0) == 0xFF) // считывание значения из ячейки по адресу 0 и сравнение его с 0xFF
while(1)
{ // мигание светодиодом
PORTC |= 0b00000010;
_delay_ms(1000);
PORTC &= ~0b00000010;
_delay_ms(1000);
}

вся разница в сравнении считанного значения.
сравниваем с записанным - не равно.
сравниваем с 0xFF - равно.
Функции записи чтения все теже - датащитовские.
10. nest - 05 Декабря, 2009 - 00:13:26 - перейти к сообщению
прошивку, а не исходный код :)
11. mctim - 05 Декабря, 2009 - 00:22:03 - перейти к сообщению
.hex файл. вот он:

:1000000012C019C018C017C016C015C014C013C044
:1000100012C011C010C00FC00EC00DC00CC00BC06C
:100020000AC009C008C011241FBECFE5D4E0DEBF5E
:10003000CDBF57D07EC2E4CFDF93CF9300D00F92D5
:10004000CDB7DEB79A8389836B83ECE3F0E08081E0
:10005000882F90E0827090700097B9F7EEE3F0E09F
:1000600089819A8191838083EDE3F0E08B818083A5
:10007000ACE3B0E0ECE3F0E0808184608C93ACE32F
:10008000B0E0ECE3F0E0808182608C930F900F9001
:100090000F90CF91DF910895DF93CF9300D0CDB72C
:1000A000DEB79A838983ECE3F0E08081882F90E0CB
:1000B000827090700097B9F7EEE3F0E089819A8141
:1000C00091838083ACE3B0E0ECE3F0E08081816079
:1000D0008C93EDE3F0E080810F900F90CF91DF9152
:1000E0000895DF93CF93CDB7DEB76C970FB6F89432
:1000F000DEBF0FBECDBFE4E3F0E08EEF8083E1E32F
:10010000F0E01082E2E3F0E08FEF8083E7E3F0E0DD
:1001100081E0808380E090E06AE18EDF80E090E023
:10012000BBDF8F3F09F0E7C0A5E3B0E0E5E3F0E017
:10013000808182608C9380E090E0AAE7B4E4898FAC
:100140009A8FAB8FBC8F698D7A8D8B8D9C8D20E0C3
:1001500030E04AE755E462D1DC01CB018D8B9E8B08
:10016000AF8BB88F6D897E898F89988D20E030E0C4
:1001700040E85FE3D2D088232CF481E090E09C8BB0
:100180008B8B3BC06D897E898F89988D20E03FEFF6
:100190004FE757E43FD118163CF5698D7A8D8B8D6A
:1001A0009C8D20E030E040E251E438D1DC01CB010D
:1001B000BC01CD01B6D0DC01CB019C8B8B8B0FC079
:1001C00080E991E09A8B898B89899A890197F1F767
:1001D0009A8B898B8B899C8901979C8B8B8B8B89C4
:1001E0009C89009769F713C06D897E898F89988DE6
:1001F00098D0DC01CB019C8B8B8B8B899C89988B55
:100200008F878F8598890197F1F7988B8F87A5E362
:10021000B0E0E5E3F0E080818D7F8C9380E090E0BA
:10022000AAE7B4E48B879C87AD87BE876B857C8506
:100230008D859E8520E030E04AE755E4EFD0DC0173
:10024000CB018F839887A987BA876F817885898545
:100250009A8520E030E040E85FE35FD088232CF40B
:1002600081E090E09E838D833BC06F817885898596
:100270009A8520E03FEF4FE757E4CCD018163CF5C5
:100280006B857C858D859E8520E030E040E251E4E1
:10029000C5D0DC01CB01BC01CD0143D0DC01CB01D9
:1002A0009E838D830FC080E991E09C838B838B813B
:1002B0009C810197F1F79C838B838D819E810197AF
:1002C0009E838D838D819E81009769F72DCF6F81ED
:1002D000788589859A8525D0DC01CB019E838D8325
:1002E0008D819E819A83898389819A810197F1F713
:1002F0009A83898319CFA5E3B0E0E5E3F0E080813C
:100300008D7F8C9380E090E06C960FB6F894DEBF02
:100310000FBECDBFCF91DF9108952FD008F481E0BB
:10032000089557D088F09F5790F0B92F9927B7516B
:10033000A0F0D1F0660F771F881F991F1AF0BA95A9
:10034000C9F712C0B13081F05ED0B1E008955BC052
:10035000672F782F8827B85F39F0B93FCCF386959F
:1003600077956795B395D9F73EF4909580957095FC
:1003700061957F4F8F4F9F4F0895990F0008550F3C
:10038000AA0BE0E8FEEF16161706E807F907C0F01B
:1003900012161306E407F50798F0621B730B840B23
:1003A000950B39F40A2661F0232B242B252B21F4FD
:1003B00008950A2609F4A140A6958FEF811D811D9D
:1003C000089557FD9058440F551F59F05F3F71F045
:1003D0004795880F97FB991F61F09F3F79F08795AC
:1003E0000895121613061406551FF2CF4695F1DF35
:1003F00008C0161617061806991FF1CF86957105C5
:10040000610508940895E894BB2766277727CB01F8
:1004100097F90895B2DF08F48FEF08950BD078C0F4
:1004200069D028F06ED018F0952309F05AC05FC04B
:100430001124EACFC6DFA0F3959FD1F3950F50E0CA
:10044000551F629FF001729FBB27F00DB11D639F86
:10045000AA27F00DB11DAA1F649F6627B00DA11D2C
:10046000661F829F2227B00DA11D621F739FB00DD2
:10047000A11D621F839FA00D611D221F749F332742
:10048000A00D611D231F849F600D211D822F762FDB
:100490006A2F11249F5750408AF0E1F088234AF0D8
:1004A000EE0FFF1FBB1F661F771F881F9150504024
:1004B000A9F79E3F510570F014C0A6CF5F3FECF343
:1004C000983EDCF3869577956795B795F795E79510
:1004D0009F5FC1F7FE2B880F911D9695879597F921
:1004E000089597F99F6780E870E060E008959FEFB6
:1004F00080EC089500240A941616170618060906BB
:10050000089500240A941216130614060506089589
:10051000092E0394000C11F4882352F0BB0F40F411
:10052000BF2B11F460FF04C06F5F7F4F8F4F9F4F51
:060530000895F894FFCFCE
:00000001FF

А что тут можно заметить?
12. nest - 05 Декабря, 2009 - 00:42:05 - перейти к сообщению
EEWE не устанавливается что то ...
а если так:
CODE:
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
EEAR = uiAddress; /*Проинициализировать регистры*/
EEDR = ucData;
#asm "sbi EECR,2";/*Установить флаг EEMWE*/
#asm "sbi EECR,1";/*Установить флаг EEWE*/
}
13. mctim - 05 Декабря, 2009 - 01:14:27 - перейти к сообщению
Не пойму как вставить эти команды В WinAVR.
nop вставлял так:
asm ("nop":Улыбка;
Нашел такую схемку:
asm(code : output operand list : input operand list [: clobber list]);
Только не соображу как вставить
sbi EECR,2
sbi EECR,1
И где тут значение которое надо установить в регисстр?
14. nest - 05 Декабря, 2009 - 01:20:35 - перейти к сообщению
mctim пишет:
где тут значение которое надо установить в регисстр?

после запятой

asm ("sbi EECR,2") ;/*Установить флаг EEMWE*/
asm ("sbi EECR,1") ;/*Установить флаг EEWE*/
15. mctim - 05 Декабря, 2009 - 01:36:37 - перейти к сообщению
Оттакая ошибка:
Error: constant value required
Не дает вставить ассемблер Грустный