странности I2C на 16F876A
|
|
buller |
Дата: Вт, 14.01.2014, 22:32 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Добрый вечер! Решил сделать часы для дома, но возникла проблема, поэтому прошу Вашей помощи. Контроллер 16F876А никак не может успешно связаться с DS1307. Схема собрана на макетке, подтягивающие резисторы 4к7 на SDA и SCL, кварц 10 МГц, светодиод на PORTC.7. Прогрма выполняется (диод периодически мигает). При попытке передавать данные через И2cout или Busout не принимается ACK бит, соответственно не работает и чтения. Логический анализатор показывает следующее (верхний сигнал SDA, нижний SCL) (рис.1) Здесь стробирующий сигнал не имеет форму меандра, частота не равна 100кГц, продолжительность высокого уровня на SCK меньше чем позволение 4.7мкС (как того требует даташит).
Сначала я думал что проблема в часах, тогда я подключил их к Arduino и посмотрел анализатором (рис.2)
Передача идет на ура, стробирующий сигнал чистый меандр, длительность високого уровня 5мкС.
Вернемся к РІС. При попытке использовать аппаратный I2C командой Hbusout не происходит вообще ничего. В чем может скрываться причина?
|
|
|
|
shaman |
Дата: Вт, 14.01.2014, 23:07 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Доброй ночи в вашей программе я не увидел строчки где и к какому порту подключена DS1307 ( в моей программе это SDA_Pin = PORTA.0 'DS1307 SDA pin SCL_PIN =PORTA.1 'DS1307 SCL pin) . Это что первое в глаза кинулось, а во вторых где преобразования и весь остальной код ???????? Не понятно
Вот пример кода и схема , разбирайтесь. Device = 16F876 Xtal = 4 ALL_DIGITAL = True PORTB_PULLUPS = True
LCD_DTPIN = PORTB.4 LCD_RSPIN = PORTB.2 LCD_ENPIN = PORTB.3 LCD_INTERFACE = 4 LCD_LINES = 2 LCD_TYPE = 0
SDA_Pin = PORTA.0 'DS1307 SDA pin SCL_PIN =PORTA.1 'DS1307 SCL pin
Dim Temp1 As Byte Dim Temp2 As Byte Dim TempVal As Byte
Dim Secs As Byte Dim Mins As Byte Dim Hrs As Byte Dim day As Byte Dim Date As Byte Dim Month As Byte Dim Year As Byte Dim Ctrl As Byte
Dim Secs_last As Byte
Delayms 100 Cls Secs = 0 Mins = 30 Hrs = 12 Day = 1 Date = 30 Month = 11 Year = 6 Ctrl = 0
TempVal=Secs GoSub BIN_TO_BCD Secs=TempVal
TempVal=Mins GoSub BIN_TO_BCD Mins=TempVal
TempVal=Hrs GoSub BIN_TO_BCD Hrs=TempVal
TempVal=Day GoSub BIN_TO_BCD Day=TempVal
TempVal=Date GoSub BIN_TO_BCD Date=TempVal
TempVal=Month GoSub BIN_TO_BCD Month=TempVal
TempVal=Year GoSub BIN_TO_BCD Year=TempVal
BStart Busout 11010000, 0, [Secs, Mins, Hrs, day, Date, Month, Year, Ctrl] BStop Delayms 20
Main: BStart BusIn 11010001, 0, [Secs, Mins, Hrs, day, Date, Month, Year, Ctrl]
BStop TempVal=Secs GoSub BCD_TO_BIN Secs=TempVal
TempVal=Mins GoSub BCD_TO_BIN Mins=TempVal
TempVal=Hrs GoSub BCD_TO_BIN Hrs=TempVal
TempVal=Date GoSub BCD_TO_BIN Date=TempVal
TempVal=Month GoSub BCD_TO_BIN Month=TempVal
TempVal=Year GoSub BCD_TO_BIN Year=TempVal If Secs - Secs_last = 0 Then Goto Main Print At 1,1,"Time: ",Dec2 Hrs, ":", Dec2 Mins,":", Dec2 Secs Print At 2,1,"Date: ", Dec2 Date, "-", Dec2 Month, "-", Dec2 Year Secs_last = Secs Goto Main
BCD_TO_BIN: Temp1 = $0F & TempVal Temp1 = DIG Temp1, 0 Temp2 = TempVal >> 4 Temp2 = DIG Temp2, 0 TempVal = Temp2 * 10 + Temp1 Return
BIN_TO_BCD: Temp1 = Dig TempVal, 0 Temp2 = Dig TempVal, 1 Temp2 = Temp2 << 4 TempVal = Temp1 ^ Temp2 Return
Сообщение отредактировал
shaman - Вт, 14.01.2014, 23:21
|
|
|
|
buller |
Дата: Ср, 15.01.2014, 16:48 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Цитата shaman ( ) Доброй ночи в вашей программе я не увидел строчки где и к какому порту подключена DS1307 ( в моей программе это SDA_Pin = PORTA.0 'DS1307 SDA pin SCL_PIN =PORTA.1 'DS1307 SCL pin) . Это что первое в глаза кинулось, а во вторых где преобразования и весь остальной код ???????? Не понятно Спасибо за желание помочь, но вы определенно не заметили что в программе используется Hbusout а не Busout, поэтому для него используются аппаратные ножки контроллера которые не нужно объявлять.И зачим писать остаток программы если даже для данного примера араратний I2C почему-то не отправляет ниодногоодного байта?
Вариант с софтверным I2Cout и Busout также не коректно работет, по той причине что как видно из рис 1 в моем первом посте не совсем корректное выполнение требований к протоколу.
|
|
|
|
mikhail09p |
Дата: Ср, 15.01.2014, 21:36 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Вот сделал маме большие часы. Разбирайтесь. DS1307 + PIC16F628 http://yadi.sk/d/IZrrHC_4G8Wvc
|
|
|
|
MiXaS |
Дата: Чт, 16.01.2014, 18:56 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата buller ( ) не принимается ACK бит
у меня была подоная проблема, я решил ей очень просто, я не проверял эти данные, т.е. просто в наглую делал запрос на чтение, а потом команда чтения. И все работает. Правда я не использовал хардваровский модуль. Ну можно попробовать
|
|
|
|