AT90S2313 запись в EEPROM

Тема в разделе "WASM.ELECTRONICS", создана пользователем simpleX, 22 мар 2009.

  1. simpleX

    simpleX New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2006
    Сообщения:
    26
    Адрес:
    Россия, г. Курск
    Приветствую,
    есть вопрос по AVR-контроллерам, конкретно запись в EEPROM.
    Имею следующий код:

    Код (Text):
    1. #include <avr/io.h>
    2.  
    3. int main(void)
    4. {
    5.     // Записать 10 байтов в EEPROM
    6.     for (int i = 0; i < 10; i++)
    7.     {
    8.         // Ждать готовность к записи
    9.         while ( EECR & 0x02 );
    10.  
    11.         EEAR = i;            // Адрес
    12.         EEDR = i + 0x20;     // Данные
    13.         EECR = 0x04;        // Разрешить запись
    14.         EECR = 0x02;        // Запись
    15.         //asm( "sbi 0x1C, 1" );     (1)
    16.     }
    17.  
    18.     // Читать 10 байтов из EEPROM
    19.     for (int i = 0; i < 10; i++)
    20.     {
    21.         EEAR = i;             // Адрес
    22.         EECR = 0x01;        // Чтение
    23.     }
    24.  
    25.     // Спать
    26.     while ( 1 )
    27.     {
    28.         MCUCR = 0x20;
    29.         asm( "sleep" );
    30.     }
    31. }
    При записи байта в EEPROM следует в регистре EECR сначала выставить 2-й бит (разрешение записи), а затем 1-й (собственно запись). Если отлаживать код в представленном виде, то запись не будет производиться. Если вместо "EECR = 0x02;" раскомментировать строку (1), то запись произойдёт. Почему так? Непонимаю, в чём отличие. Как можно записать байт, не используя в данном случае ассемблерный код?

    Использую для отладки AVR Studio v4.16, компилятор WinAVR.
     
  2. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    А этот код

    не соответствует выше сказаному (написанному).

    Ты сначала устанавливаешь 2-й, а затем устанавливаешь 1-й, но сбрасываешь 2-й. А они должны быть оба "1".


    Доки читать нужно чуть-чуть по внимательней:

    Из PDF-ника:

    Код (Text):
    1. Assembly Code Example
    2. EEPROM_write:
    3. ; Wait for completion of previous write
    4. sbic EECR,EEPE
    5. rjmp EEPROM_write
    6. ; Set up address (r17) in address register
    7. out EEAR, r17
    8. ; Write data (r16) to data register
    9. out EEDR,r16
    10. ; Write logical one to EEMPE
    11. sbi EECR,EEMPE
    12. ; Start eeprom write by setting EEPE
    13. sbi EECR,EEPE
    14. ret
    15.  
    16.  
    17. C Code Example
    18. void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
    19. {
    20. /* Wait for completion of previous write */
    21. while(EECR & (1<<EEPE))
    22. ;
    23. /* Set up address and data registers */
    24. EEAR = uiAddress;
    25. EEDR = ucData;
    26. /* Write logical one to EEMPE */
    27. EECR |= (1<<EEMPE);
    28. /* Start eeprom write by setting EEPE */
    29. EECR |= (1<<EEPE);
    30. }
     
  3. simpleX

    simpleX New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2006
    Сообщения:
    26
    Адрес:
    Россия, г. Курск
    Код для Си не работает (на эмуляторе по крайней мере, реальной железки для проверки у меня нет)
     
  4. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Как это выполнится,
    Код (Text):
    1. /* Start eeprom write by setting EEPE */
    2. EECR |= (1<<EEPE);
    то результата видно не будет.
    Результат работы будет виден после 4-х тактов ядра.
    Время выжидал?
     
  5. simpleX

    simpleX New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2006
    Сообщения:
    26
    Адрес:
    Россия, г. Курск
    Я прям вырезал команды записи из PDF и вставил вместо своих. Прогнал цикл с отрытым окном Memory EEPROM. Помоему значения должны были меняться.
     
  6. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    simpleX
    Эмулятор иногда дико глючит с EEPROM (по крайней мере у меня были случаи).
     
  7. simpleX

    simpleX New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2006
    Сообщения:
    26
    Адрес:
    Россия, г. Курск
    Хорошо, тогда такой вопрос: можно ли надеяться что нижеследующий код будет писать байт в EEPROM (на реальной железке) ?

    Код (Text):
    1.      EEAR = 0x10;
    2.      EEDR = 0xAA;
    3.      EECR = 0x04;
    4.      EECR = 0x06;  // 0x04 | 0x02
    Не будут ли какие-то проблемы с установкой бита Write Master во второй раз?
    Можно ли убрать третью строку из данного кода? Т.е. сразу выставлять и Write Master и Write Enable ?
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    simpleX
    Нет, все работает, говорю как человек, измученый Atmel'ами :)
    Единственное, что - между ними не должно долбануть прерывание, ибо тогда запись не прокатит.
    Не получится. WE просто не установится.
     
  9. simpleX

    simpleX New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2006
    Сообщения:
    26
    Адрес:
    Россия, г. Курск
    Понял, спасибо. Буду ковырять дальше =)