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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
странности I2C на 16F876A
buller Дата: Вт, 14.01.2014, 22:32  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 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 не происходит вообще ничего. В чем может скрываться причина?
Прикрепления: I2C.rar (94.8 Kb)
ЯНДЕКС Дата: 14.01.2014
shaman Дата: Вт, 14.01.2014, 23:07  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 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
Прикрепления: 4274070.gif (76.2 Kb)

Сообщение отредактировал shaman - Вт, 14.01.2014, 23:21
buller Дата: Ср, 15.01.2014, 16:48  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Вот сделал маме большие часы.
Разбирайтесь.
DS1307 + PIC16F628
http://yadi.sk/d/IZrrHC_4G8Wvc
MiXaS Дата: Чт, 16.01.2014, 18:56  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата buller ()
не принимается ACK бит


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