Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Проблема с RTC PCF8563.


Проблема с RTC PCF8563.

Сообщений 1 страница 20 из 20

1

Здравствуйте все. Попалась мне в руки микросхема часов реального времени PCF8563. И сразу же захотелось сделать часики. Почитал Datasheet. Все вроде понятно. Набросал код, проверил в Протеусе, все работает. Спаял, и тут начались глюки. Точнее один глюк. Часы просто показывают секунды, минуты, часы. При значении секунд от 00 до 39 - все нормально. На 40-ой секунде к часам прибавляется 40. Было 12, становиться 52. И так до 59-ой секунды. При значении 00 опять показывает правильно. Установка часов, минут, сброс секунд работает правильно. Код простой. В главном цикле считываю значения из RTC, и на индикатор.

КОД
Код:
Do
Gosub Read_time
 Set Clock_flag
Waitms 100
If Ust = 0 Then Gosub Set_booton
Loop
'*******************************************************************************
'работа с  PCF8563
Read_time:                       ' чтение

  I2cstart
  I2cwbyte &HA2
  I2cwbyte &H02

  I2cstart
  I2cwbyte &HA3
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Nack

  I2cstop
Secundi = Makedec(_sec) : Minuti = Makedec(_min) : Chasi = Makedec(_hour)
Return

Write_time:                            ' запись
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte &HA2
  I2cwbyte &H02
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop

Return

Пробовал программно, при включении, отключать все, кроме часов. Не помогло, глюк остался.

вот так
Код:
  I2cstart
  I2cwbyte &HA2
  I2cwbyte &H02

    I2cstart
  I2cwbyte &HA2
  I2cwbyte &H00
  I2cwbyte &H00       '   00H тест выключен, СТОП выключен. Обычный режим работы. Сброс при включении питания выключен.
  I2cwbyte &H00       '   01H  все прерывания отключены
  I2cwbyte &H00       '   02H  секунды
  I2cwbyte &H00       '   03H  минуты
  I2cwbyte &H00       '   04H  часы
  I2cwbyte &H00       '   05H  день
  I2cwbyte &H00       '   06H  день недели
  I2cwbyte &H00       '   07H  месяц
  I2cwbyte &H00       '   08H  год
  I2cwbyte &H80       '   09H  минуты будильника
  I2cwbyte &H80       '   0AH  часы будильника
  I2cwbyte &H80       '   0BH  день будильника
  I2cwbyte &H80       '   0CH  день недели будильника
  I2cwbyte &H00       '   0DH  бит регистра частоты CLKOUT
  I2cwbyte &H03       '   0EH  биты регистра таймера
  I2cwbyte &H00       '   0FH  загруженные значения таймера
  I2cstop

Вышел из положения вот так

Код:
Do
Gosub Read_time
 If Chasi > 24 Then Chasi = Chasi - 40
 Set Clock_flag
Waitms 100
If Ust = 0 Then Gosub Set_booton
Loop 

Часы показывают правильно, но глюк то остался. Подскажите, что я сделал не так.

0

2

Andrusha написал(а):

Подскажите, что я сделал не так.

Зачем она тебе?    :D  Выкинь эту микросхему и будет тебе счастье.     :flag:

0

3

Есть у нас такая поговорка: Викинути жалко, а їсти гидко. А если серьезно, в машину часики. Все готово, осталось в корпус воткнуть.

0

4

В машину?  :crazyfun:
А в магнитоле или в навигатору часов чтОле нет???  :D
Пипец... :rofl:

0

5

Я тему создал, не для того, чтобы обсуждать, что делать с МОИМИ микросхемами, и что ставить в МОЮ машину. С этим я разберусь как-нибудь сам. Я собрал устройство, которое работает не так как должно. Предоставил код, попросил помощи у людей, которые, наверняка, работали с этой микросхемой. Но откликнулся только ТРОЛЛЬ. Или такой вопрос тоже относится к попрошайничеству? Прав bulat943, пора уходить отсюда.

0

6

Судя из датащита на этот чип, страница 9, пункт 8.4.1:

VL_seconds
actual seconds coded in BCD format, see Table 9

Если всё упростить, то данные хранятся в 4 битном формате.
Старшее значение секунд находится в битах: Bit 6, Bit 5, Bit 4.
Младшее соответственно в: Bit 3, Bit 2, Bit 1, Bit 0.
Старшие значения имеют 3 бита потому, что секунды могут принимать только макс. число 5, оно занимает максимум 3 бита, они тем самым решили "сэкономить" место в чипе и не стали брать полноценные 4 бита. Оставшийся бит 7 используют под какую-то гарантию точности времени (с этим я не разбирался, как бы у вас проблема в другом).
Из этого следует, что надо считать значения регистра "address 02h", дальше надо разложить на значение на 4 бита с учетом выкидывание ненужной информации, пример:

Код:
Dim In_sec as Byte
Dim Out_h_sec as Byte
Dim Out_l_sec as Byte

Reset In_sec.7 ' удаляем лишнюю информацию из счета
Out_l_sec = In_sec And &B00001111
Out_h_sec = In_sec
Shift Out_h_sec, Right, 4

In_sec - входные данные секунд из чипа PCF8563.
Out_h_sec - выходной результат старшего разряда секунд.
Out_l_sec - выходной результат младшего разряда секунд.

Т.е. Out_h_sec/Out_l_sec надо просто вывести подряд.
Если хотите всё склеить в один байт, то придется преобразовывать 4 битный формат в 8.

Отредактировано RDW (2018-12-17 12:36:45)

0

7

Все правильно, седьмой бит секунд отвечает за контроль питания. Если питание низкое, то бит выставляется, сигнализируя о том, что считываемые данные могут быть не точными. Но секунды у меня показывают правильно, минуты показывают правильно. Проблема с часами. Это байт 04H. Разве они как то взаимосвязаны? Байт секунд 02H.

0

8

Вы писали это:

Andrusha написал(а):

При значении секунд от 00 до 39 - все нормально. На 40-ой секунде к часам прибавляется 40.

Я показал почему так.
Про ваш "глюк" описание непонятное.

С часами проблем не вижу, логика такая же, только биты старшего разряда чуть по другому обрабатываются (address 04h): 5 to 4 и 3 to 0.

0

9

Постараюсь описать поподробнее. Выставляю кнопками время, часы, потом минуты. Нажимаю на кнопку UST, секунды сбрасываются в 0, время записывается в микросхему часов. На индикаторе правильные показания, те что устанавливал. Секунды начинают счет от нуля. На 40-ой секунде к значению часов прибавляется 40. Было 8, показывает 48. Было 20, показывает 60. Секунды продолжают счет дальше, минуты тоже показывают правильно. Такие показания до 59-ой секунды. При переключении секунд на 00, минуты увеличиваются на единицу, часы начинают снова показывать правильно. Как и должно быть. И так снова до 40-ой секунды. Сейчас пробовал читать с адреса 03H, то есть только минуты и часы. Проблема осталась.

0

10

Про часы в даташите только это
http://s5.uploads.ru/t/9IG80.jpg

0

11

Могу предположить, что у вас конфликт переменных, ибо в Баскоме есть свой обработчик времени, возможно оно как-то с ним пересекается.
Чтобы понять правильно ли у вас работает чип, можно попробовать код ссылкой от сюда. Там предлагают взять гтовый пример из баскома, который устанавливается вместе с программой: Clock.bas. Он якобы работает с этим чипом. Если этот вариант проверить не поможет, то сделайте для эксперимента простой пример/код вывода сразу реального времени (без всяких там установок/кнопок). Если всё будет - ок, значит проблема в коде.

+1

12

RDW
Спасибо за помощь. У меня ломаная версия 2.0.8.1. Полез смотреть примеры, а папки SAMPLES вообще нет. Пришлось ставить 2.0.7.1. Нашел пример, разбираюсь.

0

13

Мне кажется, что г. под ником NMi начал слишком хаметь. Не пора ли администраторам обратить на это внимание. Толку от него 0, а флуда воз и маленькая тележка.

+2

14

Andrusha написал(а):

Полез смотреть примеры, а папки SAMPLES вообще нет.

В папке с документами нет папки "MCS Electronics"?

0

15

Ух ты, сколько там примеров. Просто папкой документы я никогда не пользуюсь, не привык. Вот и не додумался туда залезть. Спасибо.

0

16

bulat943
спасибо, попробую.

0

17

bulat943 написал(а):

_min  = _min  And &B01111111
Minuti = Makedec(_sec)

Тут точно нет ошибки ?
Может, лучше Makedec(_min) ;)

0

18

Nord написал(а):

Тут точно нет ошибки ?
Может, лучше Makedec(_min)

ошибка,удалил

+1

19

bulat943 написал(а):

ошибка,удалил

Не, ну оно понятно, что у вас сейчас все кипит... ;)
Только не надо быть таким категоричным... ;)
Другие-то форумчане к вам нормально относятся. ;)

0

20

Да, все получилось. Спасибо bulat943, спасибо RDW. Сделал с часами так, как вы предлагали с секундами. И все заработало.

Код:
_hour  = _hour  And &B00111111 : chasi Makedec(_hour)

Считал только пять первых бит, которые отвечают за часы.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Проблема с RTC PCF8563.