Проблема с конвертацией результата от ds1307
|
|
tesla88 |
Дата: Пн, 12.01.2015, 13:08 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
Всем привет, собрал я себе часы на pic16f876a - 74hc595 и ds1307, железо всё проверил всё работает, возникла проблема с конвертацией значений из ds1307 на индикаторы, пытаюсь вывести секунды на два первых индикатора а выводится набор произвольных чисел, привожу пример кода и саму плату, товарищи направьте на путь истинный
|
|
|
|
tesla88 |
Дата: Пн, 12.01.2015, 14:20 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
поправил немного код , в протеусе заработало,но в железе показания секунд скачут до третьего разряда и всё время разные, хотя когда просто отображаю переменную на индикаторах все правильно , похоже обмен данными с DS1307 происходит криво, хотя схема собрана по мануалам... Device 16F876A
'-------------------------------- -----Предустановки--------------------------------------------- Xtal 4 Declare All_Digital = 1 Declare PortB_Pullups = OFF 'Выключить подтягивающие резисторы на PORTB Declare CCP1_Pin PORTC.2 'Вывод для HPWM модуля CCP1 Declare CCP2_Pin PORTC.1 'Вывод для HPWM модуля CCP2 '-------------------------------------Настройки портов---------------------------------------------- TRISA = %00000000 TRISB = %00001111 TRISC = %00000001 PORTB = %00000000 PORTC = %00000000 '-----------------------------------Конфигурация переменных----------------------------------------- Symbol DS PORTC.5 'Вход данных для сдвигового регистра Symbol SH_CP PORTC.7 'Вход тактовых импульсов для сдвигового регистра Symbol ST_CP PORTC.6 'Защелка сдвигового регистра Dim Value As Byte 'Переменная для преобразования табличной конвертации Dim n As Byte 'Переменная для выделения из числа цифры разряда Dim i As Word 'Переменная организации счетчика цифр Dim j As Word 'Переменная организации счетчика задержки
Symbol setup = PORTB.1 Symbol up = PORTB.2 Symbol down = PORTB.3 Symbol enter = PORTB.4 rtc_read CON %11010001 ' Адрес часов для чтения rtc_write con %11010000 ' Адрес часов для записи
Dim hr As Byte ' часы в формате DS1307 Dim hr1 As Byte ' часы в десятичном формате
Dim yr1 As Byte Dim d_hi As Byte Dim d_lo As Byte Dim tmp As Byte Dim tmp1 As Byte
Dim x As Byte Dim y As Byte x = 127
HPWM 1, 255 , 1000 'Сгенерировать ШИМ сигнал для засветки индикатора
in: HBStart HBusOut rtc_write, $07, [%00010000] HBStop
'-------------------------------------Главная программа--------------------------------------------- Start: For y = 0 To 9999 For j = 0 To 30
GoSub read_time GoSub Ind DelayMS 100 Next Next GoTo Start '---------------------------------Подпрограмма индикации-------------------------------------------- Ind: n = hr1 Dig 0: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]n = hr1 Dig 1: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]n = hr1 Dig 2: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]n = hr1 Dig 3: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]'n = hr1.0: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]'n = hr1.1: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]'n = hr1.2: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]'n = hr1.3: GoSub Convert: SHOut DS, SH_CP, MsbFirst, [Value]PulsOut ST_CP, 10
Return '----------------------------Подпрограмма табличной конвертации------------------------------------- Convert: Value = LookUp n, [192,249,164,176,153,146,130,248,128,144,156] ' Для схемы индикаторов с ОА 'Value = LookUpL n, [63,6,91,79,102,109,125,7,127,111] ' Для схемы индикаторов с ОК
Return read_time: HBStart HBusIn RTC_read, $00, DelayMS 1 HBStop tmp = hr GoSub fix_bcd_in hr1 = tmp Return
fix_bcd_in: tmp1 = tmp & 15 tmp = tmp >> 4 tmp = tmp1 + 10 * tmp Return
|
|
|
|
mikhail09p |
Дата: Пн, 12.01.2015, 14:36 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Я так делал: Read_time:'----- чтение ------------------------------------------------ BStart BusIn $D0, $00, [Sec,Mins,Hr]',Day,Date,Mon,Yr] BStop Tmp = Sec GoSub Fix_bcd_in Sec1 = Tmp Tmp = Mins GoSub Fix_bcd_in Mins1 = Tmp Tmp = Hr GoSub Fix_bcd_in Hr1 = Tmp 'Tmp = Date 'GoSub Fix_bcd_in 'Date1 = Tmp 'Tmp = Mon 'GoSub Fix_bcd_in 'Mon1 = Tmp 'Tmp = Yr 'GoSub Fix_bcd_in 'Yr1 = Tmp Return
Write_time:'---------запись---------------------------------------------- Tmp = Sec1 GoSub Fix_bcd_out Sec = Tmp Tmp = Mins1 GoSub Fix_bcd_out Mins = Tmp Tmp = Hr1 GoSub Fix_bcd_out Hr = Tmp 'Tmp = Date1 'GoSub Fix_bcd_out 'Date = Tmp 'Tmp = Mon1 'GoSub Fix_bcd_out 'Mon = Tmp 'Tmp = Yr1 'GoSub Fix_bcd_out 'Yr = Tmp 'Sec = 0 BStart BusOut $D1, 0, [Sec,Mins,Hr]',Day,Date,Mon,Yr] BStop Return
Fix_bcd_in:'-------------------------------------------------------------------- Tmp1 = Tmp & 15 Tmp = Tmp >> 4 Tmp = Tmp1 + 10 * Tmp Return
Fix_bcd_out:'------------------------------------------------------------------- Tmp1 = Tmp / $A Tmp = Tmp - (Tmp1 * $A) Tmp = Tmp + (Tmp1 << 4) Return
|
|
|
|
MiXaS |
Дата: Пн, 12.01.2015, 14:44 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
tesla88, скорее всего шумит питание. У меня было подобное. Тем более я так понял ВЫ используете шим аппаратный. Для начала повесьте кондеры на 74hc595 и ds1307, не менее 100 мкф(чтоб на верняка). И сам пик надо закондерить.
|
|
|
|
tesla88 |
Дата: Пн, 12.01.2015, 14:47 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
СЕЙЧАС ПОПРОБУЮ , СПАСИБО
|
|
|
|
tesla88 |
Дата: Вт, 13.01.2015, 19:35 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
В общем попробовал поставить кондёры, отключил шим, поменял микруху с кварцем, результатов это не дало, снял видео и фото работы часов, осциллограф у меня слабый , на sda особо не посмотришь данные, а вот синро импульсы видно , и в сравнении с протеусом заметна разница, перед девятью импульсами синхронизации идет более продолжительный первый импульс после просадки scl на фото все видно, при эмуляции в протеусе этого импульса нет, я в тупике :bash:
Сообщение отредактировал
tesla88 - Вт, 13.01.2015, 19:36
|
|
|
|
ivan_fd |
Дата: Вт, 13.01.2015, 21:03 | Сообщение # 7 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Где видео?
Схема включения(реальная!!), последняя программа, которую шьете.???
|
|
|
|
tesla88 |
Дата: Ср, 14.01.2015, 00:59 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
видео не грузится, схема такая же, прога тоже , разница с протеусом только в подтяжке sda и scl, в плате они подтянуты к общему плюсу а не батарейке
|
|
|
|
MiXaS |
Дата: Ср, 14.01.2015, 09:28 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
tesla88, вопрос: А зачем Вы так часто опрашиваете ds1307? Он же обновляется 1 в секунду. Ребята, объясните мне пожалуйста, почему когда пишу код под ds1307 как положено со всеми Bstart.. Bstop.. (все как в даташите) у меня не опрашивается, либо некорректно работает. Как только прописываю одно строку для опроса BusIn $D1,$00,[DS1307[0],DS1307[1],DS1307[2],DS1307[3],DS1307[4],DS1307[5],DS1307[6],DS1307[7]] все работает нормально? Память опрашиваю как и положено со всеми причендалами:
Код BStart BusOut %10101110 BusOut H_ad_e BusOut L_AD_E BReStart BusOut %10101111 For loop = 0 To 7 array [loop] = BusIn If loop = 7 Then BStop : Else : BusAck : DelayMS 1 Next
и все работает, я разные микрухи использовал и все равно работает нормально, только с одной строчкой
tesla88, может и Вам попробовать:
Код read_time:
HBusIn RTC_read, $00, [hr] tmp = hr GoSub fix_bcd_in hr1 = tmp Return
Прошу простить, за необразованность
|
|
|
|
ivan_fd |
Дата: Ср, 14.01.2015, 12:52 | Сообщение # 10 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
tesla88, Вы можете выложить архив с последними Вашими изменениями??? Что бы не комбинировать самому.
MiXaS, если посмотреть дебагером, то видно, что команда BusIn посылает команду start stop и все , что нужно. Наверное перед ней и не нужно посылать Star . Тут все претензии к компилятору.
|
|
|
|
MiXaS |
Дата: Ср, 14.01.2015, 15:11 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
ivan_fd, спасибо! у меня нет вопросов к компилятору. Работает и ладно. Но информация ценная, спасибо
|
|
|
|
tesla88 |
Дата: Ср, 14.01.2015, 17:35 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
MiXaS скорость опроса высокая для полного контроля и удобства просмотра осциллограм. Вот последняя версия программы , и попутно несколько вопросов - почему в протеусе подтяжка sda и scl идёт от батарейки? как правильно конфигуривовать линию sda ( trisc.4 = 0 или 1), и если попробовать программный метод реализации i2c, то как правильно его реализовать ? Кстати дорогие коллеги подскажите какой осциллограф можно взять , чтобы нормально можно было с интерфейсами работать ( дабы видеть и анализировать пачки байтов в разных протоколах)?
Сообщение отредактировал
tesla88 - Ср, 14.01.2015, 17:41
|
|
|
|
ivan_fd |
Дата: Чт, 15.01.2015, 12:21 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Посмотрел я Ваш проект. Немного подправил код и файл Протеуса.Цитата tesla88 ( ![Ссылка на цитируемый текст](http://s8.ucoz.net/img/fr/ic/12/lastpost.gif) ) почему в протеусе подтяжка sda и scl идёт от батарейки? Как Вы поставили так и стоит. Но я думаю, что лучше ставить не от батарейки.
Код я сделал с программным протоколом, потому, что они почему то в Протоне отличаются по признакам START Ask NotAsk.... Да и на сайте Протона пишут, что DS1307 не работает с HBUS.
Цитата tesla88 ( ![Ссылка на цитируемый текст](http://s8.ucoz.net/img/fr/ic/12/lastpost.gif) ) дабы видеть и анализировать пачки байтов в разных протоколах Для этой цели лучше взять анализатор.
Сообщение отредактировал
ivan_fd - Чт, 15.01.2015, 12:23
|
|
|
|
tesla88 |
Дата: Чт, 15.01.2015, 17:02 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
Огромное спасибо ivan_fd, все заработало, я и подумать не мог что такое может быть, хотя c командой hbusout микруха всё же поняла что надо включить тактовые импульсы на выход , даже их частота выставлялась, а вот чтение с микрухи на данной команде я так и не смог организовать,( теперь понятно почему))) ученье свет!!! Буду дальше программу писать). А не подскажите какой анализатор лучше взять, а то я их начал искать и целое множество представилось взору , подумываю взять вот это чудо Logic16 USB saleae16 100 М. в общем буду пробовать! Добавлено (15.01.2015, 17:02) --------------------------------------------- Ребята подскажите как из переменной типа Float выделить целое значение и записать его в переменную типа byte? не могу найти эту команду.
Сообщение отредактировал
tesla88 - Чт, 15.01.2015, 14:03
|
|
|
|
AndrF |
Дата: Чт, 15.01.2015, 19:07 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
145
Замечания:
±
На сайте с 03.02.2012
Статус:
Offline
|
Цитата tesla88 ( ![Ссылка на цитируемый текст](http://s8.ucoz.net/img/fr/ic/12/lastpost.gif) ) Кстати дорогие коллеги подскажите какой осциллограф можно взять , чтобы нормально можно было с интерфейсами работать ( дабы видеть и анализировать пачки байтов в разных протоколах)? Что-то типа этого. Есть и на другие частоты/деньги.
|
|
|
|