реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> запись большого числа в EEPROM
EmbedElektrik
сообщение Aug 11 2008, 16:27
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 30-07-08
Из: Тверь, Россия
Пользователь №: 39 321



Цитата(defunct @ Aug 11 2008, 01:50) *
Хм... ээээ... А разве компилятор не обязан заботиться об этом самостоятельно, если разрешает конструкции вида:
(eeprom long)b = a;

Поидее запись должна гарантироваться и так.
какие дела? и кто делает,
тут про записть в eeprom. как union этому поможет? ;>

как-как - разбить любое число на байты, а уж байты записывать в епром. CVAVR и IAR по разному с епромом работают
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 11 2008, 20:04
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(EmbedElektrik @ Aug 11 2008, 19:27) *
как-как - разбить любое число на байты, а уж байты записывать в епром.

Есть более простой способ разбить любую переменную, структуру да и что угодно на байты - через указатель. пусть есть
anytype x;

eeprom_write( <куда>, (char *)&x, sizeof(x));

eeprom_read( <откуда>, (char *)&x, sizeof(x));
Go to the top of the page
 
+Quote Post
Laksus
сообщение Aug 13 2008, 12:29
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата(defunct @ Aug 11 2008, 14:34) *
А как он тогда пишет long переменные? (они же 4 байта и проверку перед каждым вручную не вставишь)..
асм листинг можете привести?

По моему, компилятор CVAVR все делает правильно. Вот поигрался,
CodeVisinAVR Version 1.25.8a Evaluation
Простейший пример кода Си
Код
#include <mega16.h>
long x,y=0x12345678;
eeprom long eex;
      
main()
{
x=PINB;
x *=y;

eex=x;

while (1);
}

сгенерированный код ассемблера
Код
;      21  eex=x;
    LDS  R30,_x
    LDS  R31,_x+1
    LDS  R22,_x+2
    LDS  R23,_x+3
    LDI  R26,LOW(_eex)
    LDI  R27,HIGH(_eex)
    CALL __EEPROMWRD
...
...
...
__EEPROMWRD:
...
    RCALL __EEPROMWRW
...
    RET

__EEPROMWRW:
...
    RCALL __EEPROMWRB
...
    RET

### Вот блок ожидания доступности EEPROM. Как указано в даташите:
"When the write access time has elapsed, the EEWE bit is cleared by hardware. The
user software can poll this bit and wait for a zero before writing the next byte. When
EEWE has been set, the CPU is halted for two cycles before the next instruction is
executed. (ATmega16, doc2466.pdf page 20)"

__EEPROMWRB:
    SBIS EECR,EEWE
    RJMP __EEPROMWRB1
    WDR
    RJMP __EEPROMWRB


__EEPROMWRB1:
    IN   R25,SREG
### Вот запрет прерываний
    CLI            
    OUT  EEARL,R26
    OUT  EEARH,R27
    SBI  EECR,EERE
    IN   R24,EEDR
    CP   R30,R24
    BREQ __EEPROMWRB0
### Выше была проверка содержимого, чтобы не писать в ячейку лишний раз

### И вот запись
    OUT  EEDR,R30
    SBI  EECR,EEMWE
    SBI  EECR,EEWE
__EEPROMWRB0:
    OUT  SREG,R25
    RET

При записи первого байта, командой
SBI EECR,EEWE
флаг EEWE ставится в единицу.
А затем при следующей попытке записи будет вертется в
__EEPROMWRB:
пока флаг EEWE не обнулится (в даташите пишуть - через 8.5 мсек).
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016