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

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

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

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


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


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

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

1

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

КОД

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

вот так

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

Код:
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

21

Делал по такой программе, проблемы не заметил

Код:
' *****************************************************************************
' * Title         : Real Time Clock PCF8583
' * Author        : www.avrprojects.net
' * Program code  : BASCOM AVR
' * Hardware req. : Real Time Clock PCF8583
' * Description   : This program shows how to use the PCF8583 I2C clock device
' *                 the PCF8583 is a PHILIPS device. The time can be set and read
' *                 with a terminal emulator. Set baud rate at 9600.
' *****************************************************************************
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600

Dim Temp As Byte , I As Byte , Tm(5) As Byte , Answer As String * 1
Dim Second As Byte , Minute As Byte , Hour As Byte , Day As Byte , Month As Byte , Year As Byte

Config Sda = Portc.1
Config Scl = Portc.0

Declare Sub Settime()
Declare Sub Gettime()

Print "Real Time Clock PCF8583"
Call Gettime

Input "Set Time (y/n)" , Answer

If Answer = "y" Then Call Settime()

Do
Call Gettime()
Wait 1
Loop

Sub Settime()
Input "Set Seconds: " , Second
Input "Set Minutes: " , Minute
Input "Set Hour: " , Hour
Input "Set Day: " , Day
Input "Set Month:" , Month
Input "Set Year: " , Year

    Tm(1) = Makebcd(second)                                 'seconds
    Tm(2) = Makebcd(minute)                                 'minutes
    Tm(3) = Makebcd(hour)                                   'hours
    Tm(4) = Makebcd(day)                                    'days
    Tm(5) = Makebcd(month)                                  'months

    I2cstart                                                'generate start
    I2cwbyte &HA0                                           'write address
    I2cwbyte 0                                              'select control register
    I2cwbyte 8                                              'set year and day bit for masking
    I2cstart                                                'repeated start
    I2cwbyte &HA0                                           'write mode
    I2cwbyte 2                                              'select seconds Register
    For I = 1 To 5
      I2cwbyte Tm(i)
    Next                                                    'write time
    I2cstop
End Sub Settime()

Sub Gettime()
   For I = 1 To 5
       Temp = I + 1
       I2cstart
       I2cwbyte &HA0                                        'write addres of PCF8583
       I2cwbyte Temp                                        'select register
       I2cstart                                             'repeated start
       I2cwbyte &HA1                                        'write address for reading info
       I2crbyte Tm(i) , Nack                                'read data
    Next
I2cstop

Print Hex(tm(4)) ; "-" ; Hex(tm(5)) ; "-20" ; Year ; " " ; Hex(tm(3)) ; ":" ; Hex(tm(2)) ; ":" ; Hex(tm(1))
End Sub Gettime()

+1


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