Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



EEPROM

Сообщений 1 страница 7 из 7

1

EEPROM работает.
Выкладываю черновой вариант , потом сделаю более удобочитаемо...
Запись и чтение - по одному байту
А вот стирание - сразу сектором по 512 байт! Перед удалением надо вычитывать нужное и сохранять на время стирания.

Код:
$regfile = "STC_8H.DAT"                   ' STC registers list
$crystal = 11059200                       ' CPU clock frequence
$ramsize = 512
$romstart = &H0                           ' code starting address

Dim Addr_iap As Word , Temp As Byte

My_led Alias P1.2

'-----------------------------------------
P1ie = &B1111_1111                        ' 1: Enable digital pins
P1pu = &B0000_0000                        ' 1: pull-up resistor
P1m0 = &B_1010_0110 : P1m1 = &B_0000_0000       ' output mode

P3ie = &B1111_1011                        ' 1: Enable digital pins
P3pu = &B0000_0000                        ' 1: pull-up resistor
P3m0 = &B_0000_0000 : P3m1 = &B0000_0000       ' output mode

'-----------------------------------------
'UART1
P_sw1 = &H00                              'RXD/P3.0, TXD/P3.1
'P_sw1 = &H40                              'RXD_2/P3.6, TXD_2/P3.7
'P_sw1 = &H80                              'RXD_3/P1.6, TXD_3/P1.7

Sbuf = 0                                  ' Magic ...
Scon = &H52                               ' 8-Bits And Variable Baudrate
Auxr = &H54                               'Timer is 1T mode, use Timer1 as baudrate generator
Tmod = 2                                  'Set timer work mode
Sbuf = 0                                  ' Magic ...

Tl1 = &HE8 : Th1 = &HFF                   'Initial timer - 115200 / 11059200
'Tl1 = &HE0 : Th1 = &HFE                   'Initial timer - 9600 / 11059200
'Tl1 = &HF3 : Th1 = &HFF                   'Initial timer - 19200 / 1MHz
'Tl1 = &HF3 : Th1 = &HFF                   'Initial timer - 38400 / 2MHz
'Tl1 = &HCC : Th1 = &HFF                   'Initial timer - 38400 / 8MHz

Et1 = 0                                   'Disable Timer interrupt
Tr1 = 1                                   'Timer1 start run

'-----------------------------------------------------------------------------

'(
Addr_iap = 0                              '

Print "Erase"
Gosub Eeprom_erase

Addr_iap = 0 : Temp = 11
Print "Write: " ; Temp
Gosub Eeprom_write

Addr_iap = 1 : Temp = 22
Print "Write: " ; Temp
Gosub Eeprom_write
')

Print " 0-511"

For Addr_iap = 0 To 511
 Gosub Eeprom_read
 Print Addr_iap ; "=" ; Temp
Next

End



'-----------------------------------------------------------------------------

'-----------------------------------------
Eeprom_read:
 Iap_contr.7 = 1                          ' Включить IAP IAPEN=1;
 Iap_tps = 12                             ' Установим параметр ожидания для 12 МГц;
 Iap_cmd = 1                              ' Команда чтения IAP
 Iap_addrl = Low(addr_iap)                ' Установить нижний адрес IAP
 Iap_addrh = High(addr_iap)               ' Устанавливаем верхний адрес IAP
 Iap_trig = &H5A : Iap_trig = &HA5        ' Команда триггера (&h5a и &ha5);
 Temp = Iap_data                          ' Чтение данных IAP;
 Gosub Eeprom_iapidle                     ' Выключаем функцию IAP
Return


'-----------------------------------------
Eeprom_write:
 Iap_contr.7 = 1                          ' Включить IAP IAPEN=1;
 Iap_tps = 12                             ' Установим параметр ожидания 12 МГц;
 Iap_cmd = 2                              ' Команда записи IAP
 Iap_addrl = Low(addr_iap)                ' Установить нижний адрес IAP
 Iap_addrh = High(addr_iap)               ' Устанавливаем верхний адрес IAP
 Iap_data = Temp                          ' Запись данных IAP
 Iap_trig = &H5A : Iap_trig = &HA5        ' Команда триггера (&h5a и &ha5);
 Gosub Eeprom_iapidle                     ' Выключаем функцию IAP
Return


'-----------------------------------------
Eeprom_erase:
 Iap_contr.7 = 1                          ' Включить IAP IAPEN=1;
 Iap_tps = 12                             ' Установим параметр ожидания 12 МГц;
 Iap_cmd = 3                              ' Установить команду стирания IAP
 Iap_addrl = Low(addr_iap)                ' Установить нижний адрес IAP
 Iap_addrh = High(addr_iap)               ' Устанавливаем верхний адрес IAP
 Iap_trig = &H5A : Iap_trig = &HA5        ' Команда триггера (&h5a и &ha5);
 Gosub Eeprom_iapidle                     ' Выключаем функцию IAP
Return

'-----------------------------------------
Eeprom_iapidle:
 nop
 Iap_contr = 0                            'Отключаем Функцию Iap
 Iap_cmd = 0                              'Очистить регистр команд
 Iap_trig = 0                             'Очистить регистр триггера
 Iap_addrh = &H80 : Iap_addrl = 0         'Установить адрес для области, отличной от IAP
Return

0

2

Стоит дополнить. Здесь реализована не отдельная EEPROM как таковая, в качестве EEPROM используется участок из FLASH через регистры IAP..

0

3

да, и ДО загрузки прошивки, через программу-загручик задаём сколько надо откусить flash-памяти программ под типа EEPROM
вторая особенность: стирание и запись - по 512 байт

0

4

Решил потыкать в EEPROM и для быстрого составления выжимки по регистрам прибегнул к AI (пробовал разные). Синтетический утверждает, что на 35 МГц работа записи через IAP может быть не стабильна (в широком диапазоне температур вероятнее). Прямых подтверждений не нашёл. Придётся проверять в морозилке и в тепле.

0

5

В даташите есть ответы ))
есть регистр Iap_tps, в который надо загрузить задержку. Если тактовая 8 МГЦ, то 8, если 35, то 35
Пока жалоб нет (работа до +80с точно проверена. Случайно  :D )

Declare Sub Iap_read(adres_w As Word)       ' Читаем в Data_eeprom
Declare Sub Iap_write(adres_w As Word , Data_eeprom As Byte)

'===============================================================================================
Iap_erase:
Gosub Iap_on
Iap_cmd = 3                         ' Установить команду стирания IAP
Iap_trig = &H5A : Iap_trig = &HA5   ' Команда триггера (&h5a и &ha5)
Gosub Iap_idle                      ' Выключаем функцию IAP
Return

'-----------------------------------------------------------------------------------
Iap_on:
Iap_contr.7 = 1                     ' Включить IAP IAPEN=1
Iap_tps = 24                        ' Установим параметр ожидания для 24 МГц
Iap_addrl = Low(adres_w)            ' Установить нижний адрес IAP
Iap_addrh = High(adres_w)           ' Устанавливаем верхний адрес IAP
Return

'-----------------------------------------------------------------------------------
Iap_idle:
nop
Iap_contr = 0                       'Отключаем Функцию Iap
Iap_cmd = 0                         'Очистить регистр команд
Iap_trig = 0                        'Очистить регистр триггера
Iap_addrh = &H80 : Iap_addrl = 0    'Установить адрес области, отличной от IAP
Return

'-----------------------------------------------------------------------------------
Sub Iap_read(adres_w As Word)        ' Читаем в Data_eeprom
Gosub Iap_on
Iap_cmd = 1                         ' Команда чтения IAP
Iap_trig = &H5A : Iap_trig = &HA5   ' Команда триггера (&h5a и &ha5)
Data_eeprom = Iap_data              ' Чтение данных IAP
Gosub Iap_idle                      ' Выключаем функцию IAP
#if Otladka = 1
  Print "IapR A:" ; Adres_w ; " D:" ; Data_eeprom
#endif
End Sub

'-----------------------------------------------------------------------------------
Sub Iap_write(adres_w As Word , Data_eeprom As Byte)
#if Otladka = 1
  Print "IapW A:" ; Adres_w ; " D:" ; Data_eeprom
#endif
Gosub Iap_on
Iap_cmd = 2                         ' Команда записи IAP
Iap_data = Data_eeprom              ' Запись данных IAP
Iap_trig = &H5A : Iap_trig = &HA5   ' Команда триггера (&h5a и &ha5)
Gosub Iap_idle                      ' Выключаем функцию IAP
End Sub

'==========================================================================================
Sub Delay_ms(my_delay As Word)       ' 1 mS при 6.0 MHz
Do
  Auxr.7 = 1                         ' Timer0 clock is 1T mode
  Tmod = Tmod And &HF0               ' Set Timer0 work mode
  Tl0 = &HFF : Th0 = &HE8
  Tf0 = 0                            ' Tcon.5 = 0  flag clear
  Tr0 = 1                            ' Tcon.4 = 1 Start Timer0

  Do : Loop Until Tf0 = 1            ' Ждём окончания...
  Tr0 = 0                            ' Stop Timer0, Tcon.4 = 0

  Decr My_delay
Loop Until My_delay = 0
End Sub

0

6

Что-то не получается прочитать ID чипа из FFF9-FFFF (8H1K08)
Прошивальщик в логе его сохраняет. Т.е. по uart читает. Но откуда?

Отредактировано Кот Обормот (2026-09-07 19:31:49)

0

7

Предлагаю вообще отказаться от read через iap.
Поскольку наша "EEPROM" находится там же где флеш (это флеш и есть и пространство адресное единое), то можно делать такой кунштюк:
Read_var = cpeek(eeprom_addr)
И прерывания можно не отключать, особенно если это критично.

+1