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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование внешней EEPROM типа AT24Cxx и 24LCxx


Исследование внешней EEPROM типа AT24Cxx и 24LCxx

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

1

Исследование внешней EEPROM типа AT24Cxx и 24LCxx

0

2

Побайтовая запись, чтение и стирание переменных типа "Long (DWord)" в EEPROM 24LC64

Исходник (Bascom 2.0.7.1) + эмуляция (Протеус 7.10) - скачать

http://s6.uploads.ru/t/KUvGx.jpghttp://s6.uploads.ru/t/8btkK.jpg
http://s7.uploads.ru/t/fyuLz.jpghttp://s7.uploads.ru/t/qWB4G.jpg

+1

3

Разрезание и склеивание переменной типа Long

$map    ' Получаем карту распределения памяти
  $regfile = "m8def.dat"       ' Используемый контроллер
  $crystal = 1000000       ' 1 МГц
  $framesize = 32       'размер области используемой и необходимой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека
  $baud = 4800       '4800     '9600     '19200     '38400

  Dim Цикл As Byte

  Dim Переменная_для_записи_byte(4) As Byte
  Dim Переменная_для_записи_long As Long At Переменная_для_записи_byte Overlay

  Dim Переменная_для_чтения_long As Long
  Dim Переменная_для_чтения_byte(4) As Byte At Переменная_для_чтения_long Overlay

  Do

      Incr Переменная_для_записи_long

      For Цикл = 1 To 4
          Print Переменная_для_записи_byte(цикл) ; " ";
          Переменная_для_чтения_byte(цикл) = Переменная_для_записи_byte(цикл)
      Next Цикл
      Print ""
      Print ""

      Print Переменная_для_чтения_long
      Print ""

      Waitms 10

  Loop
End

Вместо Print вставте запись или чтение EEPROM

http://s6.uploads.ru/t/tpfcV.jpg

0

4

Исследование EEPROM AT24Cxx

Есть такая платка

http://s4.uploads.ru/t/1EBdc.jpghttp://s4.uploads.ru/t/wkEfK.jpg

На ней кроме Ds1307 стоит EEPROM AT24C32, и все это за 2$.

Исследование работы с EEPROM AT24C32. Постраничная и побайтная запись. В Протеус почему-то отказалась работать при 32 байт на страницу, в железе работает.

Эмуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://s5.uploads.ru/t/jWmia.jpg

+1

5

Всем Доброго Здоровья!

Архивы перезалиты  07.03.2015

0

6

Работа с EEPROM вынесена в подпрограммы и функции

Исходник

'===============================================================================

  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"       'Документация Atmel - http://www.atmel.com/images/Atmel-8271- … mplete.pdf
  $crystal = 8000000
  $framesize = 32       ' Размер области используемой и необходимой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека

  $baud = 4800 : Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'===============================================================================
'                        Настраиваем шину I2c
'===============================================================================
Config Sda = Portc.4       ' Конфигурация порта для SDA
Config Scl = Portc.5       ' Конфигурация порта для SCL
Config I2cdelay = 1       ' Задержка I2c 10 - 100кгц , 5 - 200кгц , 2 - 500кгц , 1 - 1мгц " - для стабильной работы чем длиннее провода тем меньше частота"
I2cinit       ' Инициализация шины i2c

'===============================================================================
'                 Конфигурация внешней EEPROM 24LCxxx
'===============================================================================
  Const Lc24xxx_запись = &HA0       ' Адрес чтения EEPROM
  Const Lc24xxx_чтение = &HA1       ' Адрес записи EEPROM

  Dim Буфер_чтения_24lcxxx_low_byte As Byte
  Dim Буфер_чтения_24lcxxx_high_byte As Byte

  Dim Буфер_записи_24lcxxx_byte As Byte
  Dim Буфер_записи_24lcxxx_word As Word
  Dim Буфер_записи_24lcxxx_low_byte As Byte At Буфер_записи_24lcxxx_word Overlay
  Dim Буфер_записи_24lcxxx_high_byte As Byte At Буфер_записи_24lcxxx_word + 1 Overlay

  Dim Адрес_ячейки_24lcxxx_word As Word
  Dim Адрес_ячейки_24lcxxx_low As Byte At Адрес_ячейки_24lcxxx_word Overlay
  Dim Адрес_ячейки_24lcxxx_high As Byte At Адрес_ячейки_24lcxxx_word + 1 Overlay

'Используемые подпрограммы и функции
  Declare Function Read_lc24xxx_byte(byval Copy_adress_word As Word) As Byte
  Declare Function Read_lc24xxx_word(byval Copy_adress_word As Word) As Word
  Declare Sub Write_lc24xxx_byte(byval Copy_adress_word As Word , Byval Copy_data_byte As Byte)
  Declare Sub Write_lc24xxx_word(byval Copy_adress_word As Word , Byval Copy_data_word As Word)

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

  Dim Адрес_word As Word

  Dim Переменная_byte As Byte
  Dim Переменная_word As Word

'--------------  Разрешаем работу необходимых прерываний  ----------------------

'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================
      nop

      Переменная_byte = Read_lc24xxx_byte(адрес_word)

      Переменная_word = Read_lc24xxx_word(адрес_word)

      Write_lc24xxx_byte Адрес_word , Переменная_byte

      Write_lc24xxx_word Адрес_word , Переменная_word

'      Waitms 250

   'Power Adcnoise  -  нельзя использовать по причине неработы прерываний INT0 (смотреть документацию с.39 (Power Managementand Sleep Modes))
'    Idle
'===============================================================================
  Goto Главный_цикл
End
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

'===============================================================================
  Sub Write_lc24xxx_byte(byval Copy_adress_word As Word , Byval Copy_data_byte As Byte)
'-------------------------------------------------------------------------------
    Адрес_ячейки_24lcxxx_word = Copy_adress_word
    Буфер_записи_24lcxxx_byte = Copy_data_byte

    I2cstart       ' Стартуем
    I2cwbyte Lc24xxx_запись       ' Адресное обращение к микросхеме
    I2cwbyte Адрес_ячейки_24lcxxx_high       ' Отправляем старший байт адреса ячейки памяти
    I2cwbyte Адрес_ячейки_24lcxxx_low       ' Отправляем младший байт адреса ячейки памяти
    I2cwbyte Буфер_записи_24lcxxx_byte       ' Записываемый в EEPROM байт
    I2cstop       ' Освобождаем шину I2c

    Gosub Подтвержение_записи_lc24xxx
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Sub Write_lc24xxx_word(byval Copy_adress_word As Word , Byval Copy_data_word As Word)
'-------------------------------------------------------------------------------
    Адрес_ячейки_24lcxxx_word = Copy_adress_word
    Буфер_записи_24lcxxx_word = Copy_data_word

    I2cstart       ' Стартуем
    I2cwbyte Lc24xxx_запись       ' Адресное обращение к микросхеме
    I2cwbyte Адрес_ячейки_24lcxxx_high       ' Отправляем старший байт адреса ячейки памяти
    I2cwbyte Адрес_ячейки_24lcxxx_low       ' Отправляем младший байт адреса ячейки памяти
    I2cwbyte Буфер_записи_24lcxxx_high_byte       ' Записываемый в EEPROM байт
    I2cwbyte Буфер_записи_24lcxxx_low_byte       ' Записываемый в EEPROM байт
    I2cstop       ' Освобождаем шину I2c

    Gosub Подтвержение_записи_lc24xxx
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Function Read_lc24xxx_byte(byval Copy_adress_word As Word) As Byte
'-------------------------------------------------------------------------------
    Адрес_ячейки_24lcxxx_word = Copy_adress_word

    I2cstart       ' Стартуем
    I2cwbyte Lc24xxx_запись       ' Адресное обращение к микросхеме
    I2cwbyte Адрес_ячейки_24lcxxx_high
    I2cwbyte Адрес_ячейки_24lcxxx_low
    I2crepstart       ' Аналог команды "I2cstop-I2cstart", можно просто "I2cstart", но так надежнее
    I2cwbyte Lc24xxx_чтение       ' Адресное обращение к микросхеме
    I2crbyte Буфер_чтения_24lcxxx_low_byte , Nack       ' Считанный из EEPROM байт
    I2cstop       ' Освобождаем шину I2c

    Read_lc24xxx_byte = Буфер_чтения_24lcxxx_low_byte
'-------------------------------------------------------------------------------
  End Function
'===============================================================================

'===============================================================================
  Function Read_lc24xxx_word(byval Copy_adress_word As Word) As Word
'-------------------------------------------------------------------------------
    Адрес_ячейки_24lcxxx_word = Copy_adress_word

    I2cstart       ' Стартуем
    I2cwbyte Lc24xxx_запись       ' Адресное обращение к микросхеме
    I2cwbyte Адрес_ячейки_24lcxxx_high
    I2cwbyte Адрес_ячейки_24lcxxx_low
    I2crepstart       ' Аналог команды "I2cstop-I2cstart", можно просто "I2cstart", но так надежнее
    I2cwbyte Lc24xxx_чтение       ' Адресное обращение к микросхеме
    I2crbyte Буфер_чтения_24lcxxx_high_byte , Ack       ' Считанный из EEPROM байт
    I2crbyte Буфер_чтения_24lcxxx_low_byte , Nack       ' Считанный из EEPROM байт
    I2cstop       ' Освобождаем шину I2c

    Read_lc24xxx_word = Makeint(буфер_чтения_24lcxxx_low_byte , Буфер_чтения_24lcxxx_high_byte)
'-------------------------------------------------------------------------------
  End Function
'===============================================================================

'===============================================================================
  Подтвержение_записи_lc24xxx:       ' Подпрограмма для подтверждения записи данных в EEPROM
'-------------------------------------------------------------------------------
    I2cstart       ' Стартуем
    I2cwbyte Lc24xxx_запись       ' Адресное обращение к микросхеме
    If Err = 1 Then
        Goto Подтвержение_записи_lc24xxx       ' Ждем подтверждения окончания записи EEPROM
    End If
'-------------------------------------------------------------------------------
  Return
'===============================================================================

0

7

приветствую всех!
Наверное, вопрос больше к Александру:
Есть массив данных, он не кратен "страницам" памяти EEPROM (примерно 180 байт будет).
Нельзя последовательную запись данных, если в процессе записи я пересекаю "страницу"?

Из даташита на 24c512
Instead, after the EEPROM acknowledges receipt of the first data word, the microcontroller can transmit up to 127 more data words
When the word address, internally generated, reaches the page boundary, the following byte is placed at the beginning of the same page. If more than 128 data words are transmitted to the EEPROM, the data word address will roll-over,
and the previous data will be overwritten. The address roll over during write is from the last byte of the current page to the first byte of the same page.

Я так понимаю, подряд можно писать только 127 байт? Иначе перезапишется вся текущая страница?

0

8

Александр Д. написал(а):

Я так понимаю, подряд можно писать только 127 байт? Иначе перезапишется вся текущая страница?

Писать можно постранично или побайтно

Если побайтно, то сначала указывается адрес записываемой ячейки, затем записываемые данные.
Если постранично, то сначала указывается адрес записываемой страницы, затем записываемые данные, перезапись сразу всей страницы, т.е. предыдущие данные будут утеряны.

0

9

понятно,
я так и переделал...

0


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование внешней EEPROM типа AT24Cxx и 24LCxx