Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
24C08+Pic
доцент2 Дата: Ср, 06.03.2013, 16:47  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

подскажите где ошибка.
считываю данные из 24С08 командой
I2CIn PORTB.6, PORTB.5,$a1, in_adres, [Lcd_Data]
для начала объявил переменную адреса
Dim in_adres As Byte
данные читаются нормально, но только до адреса 255. чтобы добраться до всех данных переменную адреса объявил
Dim in_adres As Word
но после этого данные перестали читаться, хотя программа ошибок не выдает.
ЯНДЕКС Дата: 06.03.2013
доцент2 Дата: Ср, 06.03.2013, 19:31  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

два варианта проектов
Прикрепления: 555555.rar (111.1 Kb)
никмар Дата: Ср, 06.03.2013, 19:51  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 11
Репутация: 1   ±
Замечания:   ±
На сайте с 02.02.2010

Статус: Offline

Изначально было правильно-размер адреса должен быть Byte.

Все дело заключается в организации памяти 24LC08:
       The device is organized as four blocks of 256 x 8-bit  memory with a 2-wire serial interface.
и далее по DataSheet:
       The 24XX08 also has a page write capability for up to 16 bytes of data
Надо организовывать поблочную запись-чтение (смотрите DataSheet стр.7)
доцент2 Дата: Ср, 06.03.2013, 20:02  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

мне не надо записывать данные в EEPROM с помощью МК.
EEPROM запишу заранее, а потом буду только считывать с нее.
в даташит написано, что одрес обращения может быть 16-bit, а это как раз тип Word. Кроме того в справке по Протону (I2Cin) дается пример работы с 24С32, там тоже переменная адреса типа Word.
подскажите в чем разница между 24С08 и 24LC08 (первый раз взялся за EEPROM)

Сообщение отредактировал доцент2 - Ср, 06.03.2013, 20:05
anatol Дата: Ср, 06.03.2013, 22:06  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

доцент2, не там ищешь. У вас резисторы по шине (подтягивающие к "+") установлены? Внутренних порта "В" может не хватить.
Цитата (доцент2)
подскажите в чем разница между 24С08 и 24LC08
24LC08 работает при меньшем напряжении питания.
доцент2 Дата: Ср, 06.03.2013, 22:42  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

резисторы установлены.
ни как не могу обратиться к адресу EEPROM более 255.
anatol Дата: Ср, 06.03.2013, 22:51  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

С другого сайта
Код
С точки зрения процессора на шину в данном случае подвешена не одна микруха 24с08 а четыре 24с02, поэтому у первой отсутствуют две  
управляющие адресом ноги (А1 и А2). Из выше изложенного следует, чтобы  
изменить банк необходимо при
инициализации старта в адресе устройства менять два последних бита.
Тобиш Вот так:  
банк 1 адреса от 0-255 байт,    адрес b1010000
банк 2 адреса от 256-511 байт, адрес b1010001
банк 3 адреса от 512-767 байт, адрес b1010010
банк 4 адреса от 768-1024 байт, адрес b1010011
И еще для избежания траблов, при чтении одиночных байт, для меньшей  
путаницы, не стоит загоняться внутренним счетчиком, а также страничной  
записью данных, потому как длинна страниц у разных производителей и в  
разных модификациях могут различаться.
Код
Линейка 24с02..24с16 отлична по адресации от 24с32..24с256. У первой группы для адресации часть бит адреса ячейки памяти, содержится в байте  
адреса устройства, т.е. самой микросхемы.
доцент2 Дата: Чт, 07.03.2013, 11:12  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

не совсем понятно вот, что:
когда ставлю переменную адреса типа Word, и 1010000, то считывание должно быть нормальным от 0 до 255, а  считывание вообще не происходит!?
а при переменной адреса типа Byte читает и при 1010000 и при 1010011. может это глюки протеуса?
ivan_fd Дата: Чт, 07.03.2013, 11:52  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Проекты, те что Вы выше выставляли?

У Вас какой компилятор, версия?
доцент2 Дата: Чт, 07.03.2013, 19:10  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

версия компилятора 3.5.2.6
проекты немного подправил.
Прикрепления: 5507372.rar (111.5 Kb)
anatol Дата: Пт, 08.03.2013, 00:29  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Вот надо создать программу в полкилометра, чтобы разобраться с одной ошибкой.
Мы должны читать, вникать в особенности формирования шрифтов и другие глупости.
Задача сводилась к простому - размеру переменной.
Хорошо, что не работаю пока, а так был бы без ответа.
1. Размер переменной не что-то подлежащее модификации, а действительное значение. К примеру, в десятичной системе, если переменная равна 3 знака, то "1" будет записана не "1", а "001". А десять, не "10", а "010". Исходя из этого у вас in_adres = 16 бит информации в любом случае. А     in_adres    не может превышать значения Byte для адреса в 24С08. Иначе память не знает куда обращаться  
    
Адрес в 24С08 состоит из четырех массивов по 256 байт (2 килобита) и дополнительно выбирается по блокам в Control, биты b2 и b1 из команды:
I2Cin Dpin, Cpin, Control, { Address }, [ Variable {, Variable…} ]
У вас Control=$A1 ил по другому %10100001 (младший бит b0 справа)
ПО другому банк 0 = %10100001=$A1
банк 1 = %10100011=$A3
банк 2 = %10100101=$A5
банк 3 = %10100111=$A7
Я заменил "in_adres" на       "in_adres.LowByte" и заработало чтение. Т.е. из переменной Word  взял лишь младший байт.            
Код
For k=0 To 11                    ' адрес в строчке LData от 0 до 11 (12)
                    in_adres=Font+j+k
                        I2CIn PORTB.6, PORTB.5,$A1, in_adres[b].LowByte[/b], [Lcd_Data]
                        'Lcd_Data=LRead8 Font0 [Font+j+k]                    ' читаем LData по адресу (Font+j+k)    
                        FontCache[k]=Lcd_Data                    ' записываем переменные массива
                    Next k


Далее
Цифровыми вы объявили в Declare  All_Digital = On
и ниже

Код
PORTA=%00000000 ' порт на выход
PORTB=%00000001 ' порт на выход
Это вообще черт те что, так как просто записывает (не переключает) в порт в первом случае ноль, а во втором 1 в порт В.0.

Направление переключают командой  [b]TRISPORT[/b] например:
[b]TRISA[/b] = %00000001 ' назначаем AN0 (PortA.0) как вход.
и этот пин порта  сделаем аналоговым
ADCON1 = %10000000 ' установим аналоговый вход PortA.0 (к сожалению это не для 16F628A, так как у него нет АЦП, а расписывать компараторы не хочу)

Сообщение отредактировал anatol - Пт, 08.03.2013, 01:37
ЯНДЕКС Дата: 08.03.2013
доцент2 Дата: Пт, 08.03.2013, 16:12  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

спасибо за ответ и потраченное время.
все запутанно потому, что я пробовал на одном из готовых файлов и собранном железе.
просто не полностью очистил от ненужного хлама файл.
с банками EEPROM разобрался спасибо.
  • Страница 1 из 1
  • 1
Поиск: