Перейти к содержанию

Atmega2560 и снова DS1307


b00blik

Рекомендуемые сообщения

приветствую, у меня тоже проблемка с  часами ds1307
на одной шине i2c висят часы и 24LC64 , подтяжка 4,7к на +5 есть на SCL и SDA но  SQW/OUT  некуда не подключена, батарейка есть
в протеусе все работает замечательно
при сборке на плате часы работают через раз

включаю: часы идут,  24LC64  - читается
выключаю питание и через 2-3 сек включаю
24LC64  - читается всегда , а вот часы либо читаются нормально и работают пока я не отключу питание , либо начинают выдавать 165 165 165... и все, помогает только перезапуск по питанию

вот кусок кода

$map
$regfile = "m2560def.dat"
$crystal = 8000000
$hwstack = 128
$swstack = 128
$framesize = 128
$lib "I2C_TWI.LBX"
$lib "modbus.lbx"


'===============================================================================
'                     Н А С Т Р О Й К А     I2C
'===============================================================================

Config Scl = Portd.0                                        ' I2c Scl
Config Sda = Portd.1                                        ' I2c Sda
Config Twi = 100000
I2cinit
'===============================================================================
'                     Н А С Т Р О Й К А     USART_0
'===============================================================================
Const Usart_0_const_baud = 9600                             ' Скорость трансляции USART_0
Const Usart_0_const_size_buffer = 32                        ' Размер буферов приёма и передачи, USART_0
Config Com1 = Usart_0_const_baud, Synchrone = 0, Parity = None, Stopbits = 1, Databits = 8, Clockpol = 0
Config Serialin = Buffered, Size = 32, Bytematch = All


On Utxc Usart_0_finish_output                               ' Переход на подпрограмму обработки прерывания после окончания передачи данных по USART

Dim Usart_0_flag_data_input As Byte                         ' Флаг сигнализирующий о том, что приняты ноые данные по USART_0
Config Portd.4 = Output
Enable_rx Alias Portd.4                                     'разрешение на прием в двух проводке
Enable_rx = 0

'===============================================================================
'                     Н А С Т Р О Й К А     USART_3
'===============================================================================
Const Usart_3_const_baud = 9600                             ' Скорость трансляции USART_3
Const Usart_3_const_size_buffer = 32                        ' Размер буферов приёма и передачи, USART_3
Config Com4 = Usart_3_const_baud, Synchrone = 0, Parity = None, Stopbits = 1, Databits = 8, Clockpol = 0
Config Serialin3 = Buffered, Size = 32, Bytematch = All

Open "Com4:" For Binary As #3
Dim Load_timer As Byte
Load_timer = &H6C
Config Timer0 = Timer, Prescale = 256                       'организация задержки отключения разрешения передачи, при передаче на порт 485             '4000000 0,065536 сек (15,25878906 в 1 секунду)          8000000  0,032768 30,51757813
Load Timer0, Load_timer
On Timer0 Modbus_timers
Config Timer2 = Timer, Prescale = 256                       'организация задержки отключения разрешения передачи, при передаче на порт COM             '4000000 0,065536 сек (15,25878906 в 1 секунду)          8000000  0,032768 30,51757813
Load Timer2, Load_timer
On Timer2 Com_timers

'======----------------------------------- Watchdog
Dim Wdbit As Byte
Dim Bwd As Byte
Bwd = Peek(0)                                               ' read the wd flag
If Bwd.wdrf = 1 Then                                        ' there was a WD overflow
    Wdbit = 1                                                'store the flag
End If


Config Watchdog = 2048
Stop Watchdog

Config Portj.0 = Input
Config Portj.1 = Output
Output_rx1 Alias Portj.0
Output_tx1 Alias Portj.1
Dim N_byte As Byte
Set Output_rx1


Dim Год As Byte
Dim Часы As Byte
Dim Месяц As Byte
Dim Минуты As Byte
Dim Секунды As Byte
Dim День_недели As Byte
Dim Число_месяца As Byte
'Dim Флаг_опросить_ds1307 As Byte

Const Запись_ds1307 = &HD0                                  ' Адрес записи в ОЗУ Ds1307
Const Чтение_ds1307 = &HD1                                  ' Адрес чтения из ОЗУ Ds1307

Const Const_год = 6                                         ' Регистр год Ds1307
Const Const_часы = 2                                        ' Регистр часы Ds1307
Const Const_месяц = 5                                       ' Регистр месяц Ds1307
Const Const_минуты = 1                                      ' Регистр минуты Ds1307
Const Const_секунды = 0                                     ' Регистр секунды Ds1307
Const Const_день_недели = 3                                 ' Регистр день_недели Ds1307
Const Const_число_месяца = 4                                ' Регистр число_месяца Ds1307

Const Const_настройка_ds1307 = 7                            ' Регистр для настройки Ds1307
Const Const_stop_часы = &B10000000                          ' Значение константы для остановки часов
Const Const_start_часы = &B00000000                         ' Значение константы для запуска часов
Const Const_разрешение_sout_ds1307 = &H0                    '$H90 Значение константы для старта секундных импульсов

Dim Табло_адрес As Byte

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

Declare Sub Запись_i2c(byval Адрес_чипа_запись As Byte , Byval Регистр_чипа As Byte , Byval Записываемая_переменная As Byte)
Declare Sub Чтение_i2c(byval Адрес_чипа_чтение As Byte , Byval Адрес_чипа_запись As Byte , Byval Регистр_чипа As Byte , Считанная_переменная As Byte)

Запись_i2c Запись_ds1307, Const_настройка_ds1307, Const_разрешение_sout_ds1307

Sendtime = 0

'Секунды = Read_ds1307(const_секунды)
I2cstart
I2cwbyte &HD0
I2cwbyte &H0
I2cstart
I2cwbyte &HD1
I2crbyte Секунды, Ack
I2crbyte Минуты, Ack
I2crbyte Часы, Ack
I2crbyte День_недели, Ack
I2crbyte Число_месяца, Ack
I2crbyte Месяц, Ack
I2crbyte Год, Nack
I2cstop


'Читаем данные нулевого регистра Ds1307, если 7 бит равен 1, значит часы стоят

'Если часы стояли, запускаем
If Секунды.7 = 1 Then
    'Запускаем часы
    Запись_i2c Запись_ds1307, Const_настройка_ds1307, Const_разрешение_sout_ds1307
    
    Секунды = 10
    Минуты = 10
    Часы = 10
    День_недели = 1
    Число_месяца = 1
    Месяц = 1
    Год = 17
    Год = Makebcd(Год)                                       ' Год
    Часы = Makebcd(часы)                                     ' Часы
    Месяц = Makebcd(Месяц)                                   ' Месяц
    Минуты = Makebcd(Минуты)                                 ' Минуты
    Секунды = Makebcd(Секунды)                               ' Секунды
    День_недели = Makebcd(День_недели)                       ' День недели
    Число_месяца = Makebcd(число_месяца)                     ' Число
    
    Call Запись_i2c(Запись_ds1307, Const_год, Год)
    Call Запись_i2c(Запись_ds1307, Const_часы, Часы)
    Call Запись_i2c(Запись_ds1307, Const_месяц, Месяц)
    Call Запись_i2c(Запись_ds1307, Const_минуты, Минуты)
    Call Запись_i2c(Запись_ds1307, Const_секунды, Секунды)
    Call Запись_i2c(Запись_ds1307, Const_день_недели, День_недели)
    Call Запись_i2c(Запись_ds1307, Const_число_месяца, Число_месяца)
    
End If
Flagerror = 0

Waitms 100


Set Led_1
For I = 1 To 48
    Call Read_lc24xxxпок(I)
Next



..



'===============================================================================
Sub Запись_i2c(ByVal Адрес_чипа_запись As Byte, ByVal Регистр_чипа As Byte, ByVal Записываемая_переменная As Byte)
    '-------------------------------------------------------------------------------
    I2cstart                                                 ' Подготовка к работа шины I2c
    I2cwbyte Адрес_чипа_запись                               ' Адресное обращение к используемому чипу i2c, для записи
    I2cwbyte Регистр_чипа                                    ' Адрес регистра, в который будет производиться запись
    I2cwbyte Записываемая_переменная                         ' Записываемая переменная
    I2cstop                                                  ' Освобождаем шину I2c
    '-------------------------------------------------------------------------------
    Waitms 10
End Sub
'===============================================================================

 

g1I4T.png

Изменено пользователем b00blik
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...