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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа с 24lc64


Работа с 24lc64

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

1

Всем доброго времени суток. Ни как не могу разобраться с микросхемой 24lc64

Пытаюсь читать данные так

Код:
I2cstart                                                    'даем сигнал старт i2c шине
I2cwbyte &B10100000                                         'отправляем адрес микросхемы и адрес блока

I2cwbyte &H00                                           'отправляем адрес ячейки
I2cwbyte &H00                                          ' Старший и младший байт самой первой ячейки 

I2cstart                                                    'снова отправляем старт
I2cwbyte &B10100001                               'отправляем адрес микросхемы ,  на конце посылки теперь будет 1 - бит чтения

I2crbyte M1 ; Nack                                              'кладем в переменную М1 прочитанный байт
I2cstop                                                     'командой Nack прекращаем отправку данных I2cstop
Waitms 30
Pwm1b = M1
Waitms 5

Записываю так

M1 = Pwm1b
I2cstart                                                    'даем сигнал старт i2c шине
I2cwbyte &B10100000                                    'отправляем адрес микросхемы

I2cwbyte &HF0                                             'Старший байт адреса
I2cwbyte &HF0                                             'Младший байт адреса

I2cwbyte M1                                              'отправляем байт, который нужно записать
I2cstop                                                     'останавливаем работу i2c
Waitms 30


Но ничего не получается. всегда значение М1 = 128 а если убрать Nack то просто 0, пожалуйста помогите разобраться что не так,
работаю с данной микросхемой впервые.

0

2

вы походу вообще никогда не работали с I2C и не понимаете до конца алгоритм протокола
в одной сессии не может быть более одного "I2cstart" (и "I2cstop"), сразу видно, что чтение организовано неправильно
алгоритм простой:

1). I2cstart - запуск сессии;
2). I2cwbyte eeprom_step_read - запись адреса команды на чтение одного байта;
3). I2crbyte Tmp_byte1 , Ack - чтение 1 байта в переменную "Tmp_byte1";
4). I2crbyte Tmp_byte2 , Nack - чтение следующего байта в переменную "Tmp_byte2";
5). I2cstop - остановки сессии.

Если при чтение/записи дальше данных не идет, то "Ack", не используется, а вместо него ставится "Nack" (как бы завершаем обмен).
Если нужно перед чтением/записи установить сам адрес ячейки (с которой будет производиться операция), то для этого используется специальная команда (читайте доку на чип), выглядит так:

Код:
      ' установка адреса чтения/записи из ячеек
      I2cstart
      I2cwbyte eeprom_adr_write
      I2cwbyte High_adr
      I2cwbyte Low_adr
      I2cstop
Код:
      ' запись 1 байта
      I2cstart
      I2cwbyte eeprom_step_write
      I2cwbyte Data_byte
      I2cstop

0

3

Обычно инкреминтация адреса чтения/записи из ячейки происходит автоматически (как только производится команда чтения/записи).

0

4

Ну почему не работал? Я не работал с данной микросхемой. Вот и не получается ничего. Спасибо за ответы! Буду пробовать! 8-)

0

5

Кстати по поводу "в одной сессии не может быть более одного "I2cstart"" А почему в даташите написано как у меня 2 раза старт? Может я не правильно понял что то?

0

6

Ничего не получается. Ерунда какая то. Вроде все просто. Буду искать примеры применения этой микросхемы, мож где найду исходники или готовый пример для 24хх64. Не могу ни как вьехать что то...

Судя по даташиту запись вроде правильно.

Код:
M1 = Pwm1b
I2cstart                                                    'даем сигнал старт i2c шине
I2cwbyte &B10100000                                    'отправляем адрес микросхемы

I2cwbyte &HF0                                             'Старший байт адреса
I2cwbyte &HF0                                             'Младший байт адреса

I2cwbyte M1                                              'отправляем байт, который нужно записать
I2cstop                                                     'останавливаем работу i2c
Waitms 30


А вот с чтением ерунда какая то. Ни как не могу разобраться. Жаль даташит на инглише...

Отредактировано Atmel (2013-07-28 10:05:39)

0

7

Да... Понял главное, очень плохо быть новичком, весь день с отладчиком сижу... Без толку... Ладно, буду дальше пробовать. Может что и получиться...

0

8

' установка адреса чтения/записи из ячеек

Код:
      I2cstart
      I2cwbyte eeprom_adr_write
      I2cwbyte High_adr
      I2cwbyte Low_adr
      I2cstop


Код:

      ' запись 1 байта
      I2cstart
      I2cwbyte eeprom_step_write
      I2cwbyte Data_byte
      I2cstop


Начал разбираться потихоньку. Все что написано выше - ЛАЖА которая вводит в заблуждение,не более.

0

9

не понял, что есть "лажа"? :D

0

10

I2cwbyte запись.  I2crbyte чтение. :D

0

11

а чо там сложного, разница между чтением/запись - это состояние последнего бита
формат данных (один из вариантов) такой: [старт] - [байт/команда] - [адрес ячейки (старшая)] - [адрес ячейки (младшая)] - [байт данных (чтение/запись в зависимости от бита в команде)] - [стоп]
вроде бы так
команда на чтение: 1010ххх1
команда на запись: 1010ххх0
ххх - адрес чипа установлены внешними подтяжками (0/1)
адресация идет до 12 бит (с этим разбираться в лом, память какая-то постраничная...)

0

12

Хотя нет, на чтение там чуть другой алгоритм...да, я был не прав, чтение выглядит как-то так:

Код:
   I2cstart
   I2cwbyte &B1010ххх0
   I2cwbyte adr_H
   I2cwbyte adr_L
   I2cstart
   I2cwbyte &B1010ххх1
   I2crbyte Data , Ack
   ...
   ...
   I2crbyte Data , Nack
   I2cstop

Если память новая, то скорее всего там при чтении должны быть везде #FF.
Бывают конечно иногда извращенные чипы с двумя "I2cstart", но я такое видел только в сложных структурах типа: гироскопы, аксели, магнетрометры (память обычно имеет простое управление).

Отредактировано RDW (2013-07-29 18:20:04)

0

13

побайтовое чтение 24c256

0

14

Atmel
Вот еще пример, разжевано дальше уж некуда :
http://avrproject.ru/publ/kak_podkljuch … 8/2-1-0-46

0

15

Пардоньте, это пример для 24lc08. Разница огромная. У 08 вначале отсылается старт,номер блока, затем все дела, у 24 так же, старт, но... Потом старший и младший байт, то есть адрес блока, затем адрес ячейки памяти. Сейчас ломаю голову как записывать и читать long. Это ппц товарищи, мозги кипят и ничего толкового не выходит, хотя записывается величина в 2 байта, но читается только один. Кому не трудно поделитесь опытом, может кто нибудь что то подобное делал?

0

16

что кипят, я же тебе выше написал готовый код чтения?
читай доку, там в картинках всё понятно нарисовано, даже языка знать не надо)

0

17

Atmel написал(а):

Пардоньте, это пример для 24lc08. Разница огромная. У 08 вначале отсылается старт,номер блока, затем все дела, у 24 так же, старт, но... Потом старший и младший байт, то есть адрес блока, затем адрес ячейки памяти. Сейчас ломаю голову как записывать и читать long. Это ппц товарищи, мозги кипят и ничего толкового не выходит, хотя записывается величина в 2 байта, но читается только один. Кому не трудно поделитесь опытом, может кто нибудь что то подобное делал?


Для этого разбивай на байты операцией вида
low()
high()
а потом собирай обратной функцией.

В примерах баскома лежит пример, вот приблизительно по этому пути : C:\Program Files (x86)\MCS Electronics\BASCOM-AVR\SAMPLES\I2C
Его можно легко адаптировать к твоей микре

Отредактировано Skull (2013-07-31 14:25:42)

0

18

Atmel
Там все расписано + даташит.
На этом коде делал это:

Код:
Case 2
 24cxx:
'Сформируем строку для передачи EEPROM 24c64.
' Print " Chip is absent "                                   ' Пока чипа нет
Cls                                                         'выводим время и все остальное
 Lcd "ЁepeгaЖ  24c64>"
 Locate 2 , 1
 Lcd "> > >RS485> > >"
 'Данные чипа 24c64
   I2cstart                                                 'даем сигнал старт i2c шине
   I2cwbyte &B10100000                                      'отправляем адрес микросхемы и адрес первого блока
   I2cwbyte &H00                                            'отправляем адрес самой первой ячейки

   I2cstart                                                 'снова отправляем старт
   I2cwbyte &B10100001                                      'отправляем адрес микросхемы и адрес блока с битом чтения на конце
Do
   Incr Zoomzoom                                            'увеличиваем переменную отвечающую за прочтение микросхемы

   'читаем только одну страницу

   I2crbyte A1 , Ack                                     
   I2crbyte A2 , Ack                                       
   I2crbyte A3 , Ack                                      
   I2crbyte A4 , Ack                                       
   I2crbyte A5 , Ack                                       
   I2crbyte A6 , Ack                                       
   I2crbyte A7 , Ack                                       
   I2crbyte A8 , Ack                                    
   I2crbyte A9 , Ack                                      
   I2crbyte A10 , Ack                                    
   I2crbyte A11 , Ack                                      
   I2crbyte A12 , Ack                                    
   I2crbyte A13 , Ack                                       
   I2crbyte A14 , Ack
   I2crbyte A15 , Ack

    If Zoomzoom < 128 Then

   I2crbyte A16 , Ack

    Else

   I2crbyte A16 , Nack

    End If

Брал за основу тут, все как у АВТОРА: http://avrproject.ru/publ/logger_temperatury/1-1-0-48
Все работает, чтение по одной странице . Может что то не понял я сам?

Отредактировано Aleks (2013-07-31 20:20:31)

0

19

Спасибо за ответы. Что то не дается мне эта микросхема. Вот наконец то время появилось продолжить проект. Попробую все по примерам сделать.

0

20

В общем получилось все таки. В проекте меню. В нем есть значения, меняются с кнопок, если нажать кнопку "Выход" то измененные (или нет) значения записываются в разные ячейки памяти. Потом после выключения питания устройства и повторном включении питания, при запуске программы, происходит чтение этих ячеек, и присвоение значений константам. Ничего нового))) Но все работает))) Еще раз спасибо за советы. Теперь попробую записывать по 2 байта а потом читать их. Вот только пока не придумал как двух байтное чисто которое было разделено, и записано в память потом вернуть к прежнему виду, то есть снова сделать его единым двух байтным О_О

0

21

Atmel написал(а):

то есть снова сделать его единым двух байтным О_О

W = MAKEINT(LSB , MSB)

0

22

sva-don благодарен))) После работы попробую)))

0

23

Что то не понимаю ни фига. Ну записать в микросхему 2 байта не проблема, записываем старший и младший при помощи постраничной записи, просто отослав 2 байта останавливаем передачу данных. Прочитать 2 ячейки и разложить данные из каждой по 2 переменным типа byte думаю можно. Но что то не пойму как использовать пример приведенный выше. Блин плохо когда опыта ноль... Казалось бы все просто, записал 2 байта ,прочитал 2 байта. А вот ни фига. Вообще не пойму как делать О_О

0

24

Дробишь просто всё на байты и записываешь.

0

25

Да с записью то понятно.

Код:
I2cstart                                                    'старт
I2cwbyte &B00000000                                         'Адрес 
Temp = High(w)                                          'Старший байт частоты
I2cwbyte Temp
Temp = Low(w)                                           'Младший байт частоты
I2cwbyte Temp


так можно на старший и младший байты поделить.

Но вот как потом правильно прочитать и при помощи W = MAKEINT(LSB , MSB) положить в Word пока не разобрался О_о

0

26

Atmel написал(а):

Но вот как потом правильно прочитать и при помощи W = MAKEINT(LSB , MSB) положить в Word пока не разобрался О_о

Судя по примеру сначала пишем старший, потом младший байты.
Заводим переменные типа WORD, BYTE и  BYTE, например Dim W As Word, Bhigh As Byte, Blow As Byte;
Читаем точно также, сначала старший, потом младший.
Т.е.
.........
I2crbyte, Bhigh                                          'Старший байт
I2crbyte, Blow                                          'Младший байт
..........
Потом все объединяем
W=MAKEINT(Blow, Bhigh)
В результате в переменной W будем иметь нужную величину.
Теперь понятно?  :flirt:

Отредактировано sva-don (2013-10-24 18:33:25)

+2

27

sva-don круто 8-)  Обьяснил понятнее некуда))) Будем пробовать)))

0

28

W=MAKEINT(Blow, Bhigh) Не получилось. Компилятор ругается на эту строку. Не мог разобраться почему....

Начинаю вьезжать. У меня W это Long. Все плохо.... там в десятичном формате число может быть к примеру 745983.

Хрен его знает как их записывать в память. Надо хранить много таких значений и вызывать их по надобности. Попадалово однако...

Может есть какие нибудь библиотеки которые помогли бы решить такую задачу?

Отредактировано Atmel (2013-10-25 12:13:18)

0

29

Я еще только учусь. Привели бы пример. Я почти ничего не понял :nope:

0

30

Как то плохо все. Искал я про применение оверлея и все только на английском. Придется разбираться методом тыка. Много же времени уйдет...

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа с 24lc64