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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » запись / чтение ds1307


запись / чтение ds1307

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

1

Подскажите как записать и считать день недели в ds1307

0

2

День недели по адресу 03h, сразу за часами.  Три младших бита.

0

3

Здесь более подробно.

Отредактировано max (2011-09-16 19:11:45)

+1

4

Спасибо за помощь, разобрался.

0

5

При попытке записать в секунды 0 происходит инкремент часов и минут на 1.
Ничего не понимаю...
Часы и минуты устанавливаются правильно.

Код:
'Обнуление секунд
Seco = Makebcd(0)
 I2cstart
 I2cwbyte Ds1307w
 I2cwbyte 0
 I2cwbyte Seco
 I2cstop

Может быть у кого-то подобное было?

0

6

Разобрался. Дребезг...

0

7

Собрал часы на DS1307, тикают.
После выключения питания идут ещё 6 секунд и останавливаются. Ещё секунд через 30 без питания сбрасываются.
Батарейку менял, на других часах без проблем работают и та, и другая. Параллельно микросхеме часов стоит 24С512, она пока не задействована. Адресные входы на массу, SCL и SDA параллельно с часами.
Сопротивления на 4,7к на питание присутствуют. Единственно, что ещё есть - светодиод на выходе часов на индикацию 1Гц. Определить не могу, где собака порылась. Выпаять 24С512 очень трудно конструктивно, если вариантов не будет, придётся снимать... Может кто-то сталкивался с подобным?

0

8

http://s3.uploads.ru/t/vL6c9.gif

0

9

Извините за беспокойство, вопрос решён. :blush:
При замере напряжения на 3 ноге дотрагивался щупом, и всегда показывало верно.
Оказалась микро трещина на проводнике за этой ножкой, а проводник шёл под корпусом...

0

10

Кстати о часах. Намного удобнее использовать в своих конструкциях часы со встроенным кварцем. Они намного более стабильны. Например DS3232.
Мало того, в некоторых есть еще и EEPROM. Например в DS32B35 2К, а в DS32С35 целых 8К. Многие отметят, что их цена великовата, но считаю, что удобство важнее.

0

11

Бьюсь половину вечера с часами и наверное уже туплю. Может кто-то со свежей светлой головой поможет?

Часы на восьмой меге + DS1307, мега тактируется от встроенного RC-генератора на 8МГц. Применена динамическая индикация на TIMER2. DS1307 висит на следующих пинах:

Config Sda = Portc.4
Config Scl = Portc.5

Пины подтянуты через резисторы 10к к плюсу.

Значения времени считываются в главном цикле:

Код:
Do

I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seconds , Ack
I2crbyte Mins , Ack
I2crbyte Hours , Nack
I2cstop

Mins = Makedec(mins)
Hours = Makedec(hours)

Далее всё это разбирается по цифрам, преобразуется
через знакогенератор и хранится в переменной.
Прерывание на TIMER2 отображает эту переменную в динамике.

Waitms 250

Loop

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

Что делал:

менял DS1307
менял часовой кварц
менял программный i2c на аппаратный (при этом меняется мусор)
запрещал прерывания перед опросом DS1307
ставил чтение из DS1307 на прерывание

не помогло :) чего-то недогоняю. в чём может быть проблема?

ps: В протеусе всё работает корректно

Отредактировано beginer (2016-12-13 18:41:53)

0

12

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

Config Sda = Portc.4
Config Scl = Portc.5

Пины подтянуты через резисторы 10к к плюсу.

попробуй поставить на подтяжку 4к7.

0

13

Уже пробовал, никакой разницы.

Пробовал ещё перевесить динамическую индикацию на два других таймера - то же самое.

А i2c корректно работает со встроенным RC-генератором МК?

Отредактировано beginer (2016-12-13 19:29:21)

0

14

i2c всё равно на RC МК, это тактируемая шина, на неё может влиять только кривые фронты и помехи

0

15

beginer
Библиотеку $lib "ds1307clock.lib" подключали?

0

16

Подключил вместо динамической индикации проводками полноценный символьный дисплей - на нём всё чётко. Очевидно, что динамическая индикация сильно гадит в питание (там мощные индикаторы с ключами), что и приводит к искажениям. И вроде бы предусмотрительно развязал питание дросселем с конденсаторами, но, видать, не хватило.

Отредактировано beginer (2016-12-13 21:54:45)

0

17

Ещё может быть от настроек: $hwstack, $swstack, $framesize.

0

18

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

Подключил вместо динамической индикации проводками полноценный символьный дисплей - на нём всё чётко.

Смотрите обработчик прерывания динамической индикации, в Вашем случае - TIMER2

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

Очевидно, что динамическая индикация сильно гадит в питание (там мощные индикаторы с ключами), что и приводит к искажениям.

Очевидность этого, стремится к нулю.


Если есть желание найти причину, покажите весь исходник, т.е., как есть на самом деле. И симуляцию не забудьте.

Отредактировано sasha_1973 (2016-12-14 06:12:18)

0

19

Переделал питание - проблема исчезла.

0

20

приветствую, у меня тоже проблемка с  часами 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

'===============================================================================
'                     Н А С Т Р О Й К А     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
'  Ucsr0a.1 = 1       '$Baud = Baud * 2

'---------------  Обработчики прерываний USART_0  ------------------------------
On Urxc Usart_0_input_data Nosave                           ' Переход на подпрограмму обработки прерывания после окончания приёма данных по USART
On Udre Usart_0_output_data Nosave                          ' Переход на подпрограмму обработки прерывания после опустошения буфера передачи данных по USART
On Utxc Usart_0_finish_output Nosave                        ' Переход на подпрограмму обработки прерывания после окончания передачи данных по USART
'-----------------  Используемые переменные USART_0  ---------------------------
Dim Usart_0_flag_resived_usart As Byte                      ' Флаг сигнализирующий о том, что идёт приём по USART_0
Dim Usart_0_flag_data_input As Byte                         ' Флаг сигнализирующий о том, что приняты ноые данные по USART_0
Dim Usart_0_flag_transmitted As Byte                        ' Флаг сигнализирующий о том, что идёт передача по USART_0
Dim Usart_0_count_transmitter As Byte                       ' Считаем количество переданных символов по USART_0
Dim Usart_0_count_received_symbols As Byte                  ' Считаем количество принятых символов
Dim Usart_0_input_buffer_str As String * Usart_0_const_size_buffer
Dim Usart_0_output_buffer_str As String * Usart_0_const_size_buffer       ' Строковый буфер приёма USART_0
Dim Usart_0_temp_rxd_str As String * Usart_0_const_size_buffer

'===============================================================================
'           И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================
'            Подпрограмма   если 1 - ждём окончания передачи, иначе идём дальше, передача закончится автоматически
'                |    |             |   |    |                         |   |     |
Declare Sub Print_usart_0(byval Copy_str_usart_0 As String , Byval Copy_byte_usart_0 As Byte)
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
Declare Sub Modbus_exec()
Declare Sub Send_to_master()                                'прерывание по передаче UART
Dim Modc As Byte , Modt As Byte , Modw As Word , Cnt_print As Bit


'  Ucsr3a.1 = 1       '$Baud = Baud * 2

''---------------  Обработчики прерываний USART_3  ------------------------------
'On Urxc3 Usart_3_input_data Nosave                          ' Переход на подпрограмму обработки прерывания после окончания приёма данных по USART
'On Udre3 Usart_3_output_data Nosave                         ' Переход на подпрограмму обработки прерывания после опустошения буфера передачи данных по USART
On Utxc3 Usart_3_finish_output                              ' Переход на подпрограмму обработки прерывания после окончания передачи данных по USART
'
''-----------------  Используемые переменные USART_3  ---------------------------
Dim Usart_3_flag_resived_usart As Byte                      ' Флаг сигнализирующий о том, что идёт приём по USART_3
Dim Usart_3_flag_data_input As Byte                         ' Флаг сигнализирующий о том, что приняты ноые данные по USART_3
Dim Usart_3_flag_transmitted As Byte                        ' Флаг сигнализирующий о том, что идёт передача по USART_3
Dim Usart_3_count_transmitter As Byte                       ' Считаем количество переданных символов по USART_3
Dim Usart_3_count_received_symbols As Byte                  ' Считаем количество принятых символов по USART_3
Dim Usart_3_input_buffer_str As String * Usart_3_const_size_buffer
Dim Usart_3_output_buffer_str As String * Usart_3_const_size_buffer       ' Строковый буфер приёма USART_3
Dim Usart_3_temp_rxd_str As String * Usart_3_const_size_buffer
Declare Sub Print_usart_3(byval Copy_str_usart_3 As String , Byval Copy_byte_usart_3 As Byte)



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 Snd_byte As Byte

'===============================================================================
          '  Разрешаем работу необходимых прерываний
'===============================================================================

Enable Urxc                                                 ' Разрешаем прерывания по приёму USART0
Enable Urxc3                                                ' Разрешаем прерывания по приёму USART3



Config Scl = Portd.0                                        ' I2c Scl
Config Sda = Portd.1                                        ' I2c Sda
'Config I2cdelay = 1                                         ' Задержка I2c 10 - 100кгц , 5 - 200кгц , 2 - 500кгц , 1 - 1мгц " - для стабильной работы чем длиннее провода тем меньше частота"
Config Twi = 100000
I2cinit
'===============================================================================
'             И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================


Config Portb.2 = Output                                     '==МОРГАЛКА 1
Config Portb.3 = Output                                     '==МОРГАЛКА 2
Led_1 Alias Portb.2
Led_2 Alias Portb.3



Const Timer1pre = 3035                                      ' константа для таймера1  на 2 сек
Dim Last_часы As Byte

Dim Last_год As Byte
Dim Last_месяц As Byte
Dim Last_минуты As Byte
Dim Last_секунды As Byte
Dim Last_день_недели As Byte
Dim Last_число_месяца As Byte

Dim Flagerror As Byte

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 = &H90                   ' Значение константы для старта секундных импульсов

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





'===============================================================================
'                 Конфигурация внешней EEPROM 24LCxxx
'===============================================================================
Const Lc24xxx_запись = &HA0                                 ' Адрес чтения EEPROM
Const Lc24xxx_чтение = &HA1                                 ' Адрес записи EEPROM

Const Адресов_для_записи = 8191                             ' Смотреть документацию
Const Количество_байт_на_страницу = 32                      ' Может быть 8, 16, 32, 64 и т.д. смотреть документацию
Const Const_для_стирания_eeprom = 0                         ' Значение используемое для записи в EEPROM при полном стирании





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


'Для симуляции в Протеусе всегда "0"
'If Tmreset = 0 Then
'Запускаем часы


Waitms 100



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

 'Если часы стояли, запускаем
 '!Внимание!
 'Для симуляции в Протеусе всегда "0"
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

0

21

так, добавил в код строку
$lib "I2C_TWI.LBX" 
и о чудо! 165 165 пропало!  теперь , через раз, появляются  131 131 131... o.O

0

22

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

так, добавил в код строку
$lib "I2C_TWI.LBX"


Включает аппаратную реализацию шины i2c, по умолчанию, т.е., без подключения библиотеки, реализация программная.

165  в железе  -  признак помех на шине, неприличных пульсаций питания или плохонькой Ds1307, отказался от применения в пользу Ds3231Z (SO-16) или Ds3231M (SO-8)

Иногда помогала ёмкость (1...4,7мкф), параллельно батарейке, при смене питания у Ds1307 срывает крышу !

У Вас довольно большая частота i2c  "Config I2cdelay = 1", попробуйте понизить = 10; = 15; = 20

Ds1307 скорее всего китайская, так что ....

Отредактировано sasha_1973 (2017-01-11 06:43:39)

0

23

о! спасибо! добавил емкость  0.1 мкф параллельно батарейки и 10 перезапусков и ни одного глюка
у меня схема  просто оригинальная , может потому и глючила))
http://se.uploads.ru/t/g1I4T.png

У Вас довольно большая частота i2c  "Config I2cdelay = 1", попробуйте понизить = 10; = 15; = 20


у меня  Config I2cdelay = 1 закомментирована,  я использую Config twi = 100000

Отредактировано Penumbra (2017-01-11 12:43:33)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » запись / чтение ds1307