24C08+Pic
|
|
доцент2 |
Дата: Ср, 06.03.2013, 16:47 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 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 но после этого данные перестали читаться, хотя программа ошибок не выдает.
|
|
|
|
доцент2 |
Дата: Ср, 06.03.2013, 19:31 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
два варианта проектов
|
|
|
|
никмар |
Дата: Ср, 06.03.2013, 19:51 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
11
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
доцент2, не там ищешь. У вас резисторы по шине (подтягивающие к "+") установлены? Внутренних порта "В" может не хватить. Цитата (доцент2) подскажите в чем разница между 24С08 и 24LC08 24LC08 работает при меньшем напряжении питания.
|
|
|
|
доцент2 |
Дата: Ср, 06.03.2013, 22:42 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
резисторы установлены. ни как не могу обратиться к адресу EEPROM более 255.
|
|
|
|
anatol |
Дата: Ср, 06.03.2013, 22:51 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
не совсем понятно вот, что: когда ставлю переменную адреса типа Word, и 1010000, то считывание должно быть нормальным от 0 до 255, а считывание вообще не происходит!? а при переменной адреса типа Byte читает и при 1010000 и при 1010011. может это глюки протеуса?
|
|
|
|
ivan_fd |
Дата: Чт, 07.03.2013, 11:52 | Сообщение # 9 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Проекты, те что Вы выше выставляли?
У Вас какой компилятор, версия?
|
|
|
|
доцент2 |
Дата: Чт, 07.03.2013, 19:10 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
версия компилятора 3.5.2.6 проекты немного подправил.
|
|
|
|
anatol |
Дата: Пт, 08.03.2013, 00:29 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 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
|
|
|
|
доцент2 |
Дата: Пт, 08.03.2013, 16:12 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
спасибо за ответ и потраченное время. все запутанно потому, что я пробовал на одном из готовых файлов и собранном железе. просто не полностью очистил от ненужного хлама файл. с банками EEPROM разобрался спасибо.
|
|
|
|