Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Проблема с часами на Atmega32 и DS1307(отстают)

Вс сен 01, 2013 22:21:43

TO Vov123: Да батарейка при выключенном питании 3.2В. Новую брал.

TO Eugene.Negrobov: Согласен сам подумывал делать проверку по иницилизации. Думаю придется.

Re: Проблема с часами на Atmega32 и DS1307(отстают)

Пн сен 02, 2013 13:19:01

Сюда перенёс.
kapitaneo писал(а):Хм только заметил, что в коде инициализация прописана rtc_init(3,1,0).

Эммм... А чего там инициализировать? Питание подал — часы пошли. Единственный вопрос, в 12-ти или 24-х часовом формате.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн сен 02, 2013 20:36:01

в даташите сказано, что напряжение батареи доллжно быть в диапазоне 2.0 ... 3.5 В и микруха доступна при напряжении Vcc=1.25 * VBAT. то есть теоретически, если VBAT=2 В, то я смогу работать с микрухой при 2,5 вольт? у меня питание схемы 2.8-3.7 вольт, вот боюсь, что микруха не захочет работать( кто что думает и запускал ли дс1307 при 3.3 вольтах?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вт сен 03, 2013 09:41:06

kapitaneo, что - же на самом деле имеем. Отстают? или иницилизация портит время?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн окт 14, 2013 00:37:45

Парни помогите. Собрал девайс на DS1307 и он раз а то и 2 раза в сутки виснет. Вместо секунд показывает трёхзначное число и всё. Пока не перезапустишь. От чего такое может быть? Питание отличное , батарейка новая. Кварцы менял , микрухи менял. Схема классическая. Единственное ,что так это 7 нога DS1307 используется с частотой 1 гц и это идёт на МК. Как только часы виснут , виснет и всё устройство. Я уже замахался.

Я читал где то, что нужно какой то код обнуляющий 1 раз в минуту. Только я не знаю какой. Кто знает напишите плиз.

Re: Проблема с часами на Atmega32 и DS1307(отстают)

Пн окт 14, 2013 09:21:01

Gudd-Head писал(а):Эммм... А чего там инициализировать? Питание подал — часы пошли. Единственный вопрос, в 12-ти или 24-х часовом формате.
А ничего, что в даташите жирным выделено:
Please note that the initial power-on state of all registers is not defined. Therefore, it is important to
enable the oscillator (CH bit = 0) during initial configuration.
состояние ВСЕХ регистров по включению НЕ ОПРЕДЕЛЕНО. Необходимо, по крайней мере, выключить CH (остановку часов), не говорю уже про то, что в регистрах времени и даты мусор будет.
greentm писал(а):Собрал девайс на DS1307 и он раз а то и 2 раза в сутки виснет...
Исчерпывающий вопрос ;)

Re: Проблема с часами на Atmega32 и DS1307(отстают)

Вт окт 15, 2013 14:43:15

a_skr писал(а):А ничего, что в даташите жирным выделено

Значит, DS1337 в этом плане выгодно отличается от DS1307, там просто
Note: Unless otherwise specified, the state of the registers is not defined when power is first applied or VCC falls below the VOSC.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сб ноя 16, 2013 12:22:22

Согласен с Eugene.Negrobov - инициализация сбивает секунды, если генератор тикает. Соответственно делаем ее только если генератор не запущен. Двадцать устройств работало без этой приписочки в коде, т.е. инициализация не сбивала секунды, на двадцать первом (новая партия микрух 1307) - оказалось что инициализация сбивает секунды, если генератор уже работает...

Решил проблему так:
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
{
unsigned char ss=rtc_read(0x00);

if((ss&0x80)==0x80)
{
// Инициализация сбивает время, поэтому делаем ее только если генератор стоит!!!
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
twi_start();
twi_write(0xd0);
twi_write(7);
twi_write(rs);
twi_stop();
//---
rtc_write(0x00,ss&~0x80); // если генератор стоиn - запускаем его
}

}

DS1307 не работает

Пн ноя 25, 2013 21:55:56

Доброго вам времени суток! Возникла проблема с часами на DS1307. Библиотека, которую я использую рабочая, делал часы с термометром другу, у него всё работает. Но у меня не работает... Плата несколько раз чистилась щёткой и ацетоном.. В какой-то прекрасный момент всё заработало, но после перепрошивки МК (пока-что прошивка в разработке) всё потухло( В чём может быть проблема?

Вот часть кода
Код:
    while(RB1)
    {
        lcd_goto(0x41);
        showtemp();
        __delay_ms(50);
        if(command == 0x36) { i = ReadHour()+1; if(i>23) i = 0; SetHour(i); SetSeconds(0); command = 255; }
        if(command == 0x32) { i = ReadMin()+1; if(i>59) i = 0; SetMin(i); SetSeconds(0); command = 255;  }
        showtime();
        __delay_ms(50);
    }
Вот библиотека
Код:
#include <htc.h>

#define _XTAL_FREQ 4000000



#define SCL1 TRISB3
#define SDA1 TRISB4
#define SCL1_IN RB3
#define SDA1_IN RB4

void i2c_delay (void);


void i2c_start(void);

void i2c_stop (void);

bit i2c_tx(unsigned char d);

unsigned char i2c_rx(unsigned char ack);
unsigned char BCDconv (unsigned char source);
unsigned char DCBconv (unsigned char source);
void SetMin(unsigned char minutes);
unsigned char ReadMin();
void SetHour(unsigned char hours);
unsigned char ReadHour();
void SetSeconds(unsigned char seconds);
unsigned char ReadSeconds();

Это был Header
Код:
#include <htc.h>
#include "softi2c.h"

void i2c_delay (void) //Задержка speed/18
{
__delay_us(5);
}

void i2c_start(void)  //Старт передачи
{
SCL1 = 1;
SDA1 = 1;
i2c_delay();
SDA1 = 0;
i2c_delay();
SCL1 = 0;
}

void i2c_stop (void)
{
i2c_delay();
SDA1 = 0;
SCL1 = 0;
i2c_delay();
SCL1 = 1;
i2c_delay();
SDA1 = 1;

}

bit i2c_tx(unsigned char d)
{
char x;
static bit b;
   for (x=0; x<8; x++) {
       i2c_delay();
       if (d&0x80) SDA1 = 1;
       else SDA1 = 0;
       i2c_delay();
       SCL1 = 1;
       d <<= 1;
       i2c_delay();
       SCL1 = 0;
   }
i2c_delay();
i2c_delay();
SDA1 = 1;
SCL1 = 1;
i2c_delay();

b = SDA1_IN;
SCL1 = 0;
return b;

}

unsigned char i2c_rx(unsigned char ack)
{
unsigned char x,d=0;
    SDA1 = 1;
    for (x=0; x<8;x++) {
                        d <<= 1;
                               do {
                                   i2c_delay();
                                   SCL1 = 1;
                                   } while (SCL1_IN==0);
                        i2c_delay();
                        if (SDA1_IN) d |= 1;
                        SCL1 = 0;
    }
    i2c_delay();
    if (ack) SDA1 = 0;
                   else SDA1 = 1;
    SCL1 = 1;
    i2c_delay();
    SCL1 = 0;
   
    return d; 

}


unsigned char BCDconv (unsigned char source) {
  unsigned char temp_min=0;
  unsigned char temp_maj=0;
   temp_min = source&15;
   temp_maj = source >> 4;
   //printf("\r\n minor - %x", temp_min);
   //printf("\r\n major - %x", temp_maj);
   temp_maj *= 10;
   //printf("\r\n major - %x", temp_maj);
 
   return temp_maj+temp_min;
}

unsigned char DCBconv (unsigned char source) {
 unsigned char temp_min=0;
 unsigned char temp_maj=0;
 temp_maj = source/10 ;
 temp_min = source - temp_maj*10;
 temp_maj <<= 4;

 return temp_maj+temp_min;

}

void SetMin(unsigned char minutes) {        //записываем значение в минуты
     i2c_start();           
    i2c_tx(0b11010000);
    i2c_tx(0x01);
    i2c_tx(DCBconv(minutes));
    i2c_stop();
}

unsigned char ReadMin() {
    unsigned char clockreturn1 = 0;
    i2c_start();            //читаем значение минут
    i2c_tx(0b11010000);
    i2c_tx(0x01);
    i2c_start();
    i2c_tx(0b11010001);
    clockreturn1 = i2c_rx(0);
    i2c_stop();

    return BCDconv(clockreturn1);
}

void SetHour(unsigned char hours) {        //записываем значение в часы
     i2c_start();           
    i2c_tx(0b11010000);
    i2c_tx(0x02);
    i2c_tx(DCBconv(hours));
    i2c_stop();
}

unsigned char ReadHour() {
    unsigned char clockreturn2 = 0;
    unsigned char clockreturn22 = 0;
    i2c_start();            //читаем значение часов
    i2c_tx(0b11010000);
    i2c_tx(0x02);
    i2c_start();
    i2c_tx(0b11010001);
    clockreturn2 = i2c_rx(0);
    i2c_stop();
    /*
    temp2 = temp&0b00001111;
    temp /= 10;
    temp = temp >> 4;
    temp = temp*10 + temp2;*/
   
    return BCDconv(clockreturn2);
}

void SetSeconds(unsigned char seconds) {        //записываем значение в секунды
    i2c_start();           
    i2c_tx(0b11010000);
    i2c_tx(0x00);
    i2c_tx(DCBconv(seconds) & 0b01111111);
    i2c_stop();
}

unsigned char ReadSeconds() {
    unsigned char clockreturn = 0;
    i2c_start();            //читаем значение минут
    i2c_tx(0b11010000);
    i2c_tx(0x00);
    i2c_start();
    i2c_tx(0b11010001);
    clockreturn = i2c_rx(0);
    i2c_stop();

    return BCDconv(clockreturn);
}
Это был Source файл

Фрагмент кода, который должен запускать генератор часов
Код:
    i = ReadSeconds();
    if(i>60) i = 0;
    SetSeconds(i & 0b01111111);
    i = 0;
Фрагменты кода для вывода времени на экран
Код:
void showtime(void)
{
    unsigned char sec;
    unsigned char min;
    unsigned char hur;
    lcd_goto(0);
    hur = ReadHour();
    lcd_showno2(hur);
    lcd_putch(':');
    lcd_showno2(min);
    min = ReadMin();
    lcd_putch(':');
    sec = ReadSeconds();
    lcd_showno2(sec);
}
Помогите, пожалуйста( В протеусе всё работает безупречно..
И ещё. Постоянно, на железе, от часов в сегменте часов, минут и секунд получается не число, не ноли, а A5h.. Т.е. в дисплее (HD44780) показывает @A

Вот часть кода, которая показывает число на индикатор

Код:
void lcd_showno2(unsigned char var)
{
    if((var/10)>0)
    {
        unsigned char tmp = var;
        lcd_putch(0x30 + (var/10));
        while(tmp>=10) tmp = tmp-10;
        lcd_putch(0x30 + tmp);
       
    }
    else
    {
        lcd_putch(0x30);
        lcd_putch(0x30 + var);
    }
}

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт мар 14, 2014 16:46:05

Кто-нибудь пробовал использовать микросхему без кварца в качестве энергонезависимой памяти?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт мар 14, 2014 16:55:01

Отлично работала в проекте счетчика суммарного количества копий копира в копи-центрах. (По каждому клиенту раздельно А4/А4R/А3 с возможностью "вложенного клиента" + общая сумма за весь период эксплуатации по каждому формату и автокалибровка индивидуальной скорости протяжки листа по данному аппарату). Но вот с кварцем или нет не помню, надо архив покопать...
:)
Кварца таки стояла однако...
cntlcd2003.pdf
(31.11 KiB) Скачиваний: 320

:cry:

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн мар 17, 2014 10:43:57

ks0 писал(а):в качестве энергонезависимой памяти?

Что-то я не нашёл упоминания о энергоНЕзависимой памяти.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн мар 17, 2014 11:19:56

Имеется ввиду использование области ОЗУ (батарейная энергонезависимка) с работой без циклов ожидания выполнения процесса записи в EEPROM как у "обычной" I2C EEPROMки. Некоторая хитрость для регистров накопителей с непрерывным многократным обращением к ячейкам.
:)

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн мар 17, 2014 11:54:01

Коли микра работает с I²С на скоростях до 400 кГц, у неё наверняка есть встроенный генератор. Не верю я в ФАПЧ от 32-х кГц.
Хотя в ДШ про это ни слова :(

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн мар 17, 2014 12:32:58

Дык зачем эксперементировать - возможно и часики на будущее сгодятся.
Кроме того 1307 не совсем I2C по протоколу побайтового доступа к ячейкам. В принципе, в былые времена вполне успешно работало, а дорабатывать до абсолюта как всегда "дело не дошло"
8)

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн мар 17, 2014 22:08:11

Gudd-Head писал(а):Коли микра работает с I²С на скоростях до 400 кГц, у неё наверняка есть встроенный генератор.
транзистор и на бОльших частотах работает, генератора в нем нет) ... шутка)
I2C синхронный протокол, синхра идет от мастера, а DS1307 - слейв онли) В ней нет генератора.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вт мар 18, 2014 09:00:36

Нельзя утверждать то, о чем абсолютно точной информации нету... :cry:
Даже "чистый" транзистор или диод как структура полупроводниковая ноне только у П4 узреть можно (или у Совковых до 85-го года выпуска). Чего там сейчас понапихано - ... :facepalm: Для пользователя только гарантированный даташит. Все другое - и спецтесты и дополнительная скрытая начинка (да и в зависимости от партии выпуска "дифференциация штанов" имеется) нам практически недоступно, да в большинстве случаев и не требуется.
:beer:

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вт мар 18, 2014 09:59:56

ibiza11 писал(а):I2C синхронный протокол, синхра идет от мастера, а DS1307 - слейв онли) В ней нет генератора.

Следовательно, без часового кварца будет работать как внешняя ОЗУ. Так?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вт мар 18, 2014 14:49:27

Опять неправильный вывод.
Следовательно без часового кварца I2C будет работать.
Исходя из функциональной схемы часов, можно сделать вывод, что кварцевый резонатор используется встроенным генератором, который в свою очередь, используется для формирования секундных импульсов для блока RTC и еще имеет программируемый выход ипульсов с частотами 1Hz/4.096kHz/8.192kHz/32.768kHz.
Исходя из даташита невозможно ясно понять, будет ли работать DS1307 без кварца в качестве быстрой внешней ОЗУ. Я думаю, что будет. Но лучше будет, если кто-нибудь из заинтересованных это проверит.

К чему я все это пишу: к тому, что нет никакой логической связи между высокой частотой I2C и наличием внутреннего генератора.

Еще мысль: поскольку в модуле приема из памяти есть только регистр адреса (нет промежуточного буфера для хранения данных), а принимать данные по I2C все же куда-то надо, то I2C использует ОЗУ напрямую. Следовательно модуль I2C совместно с модулем ОЗУ должны работать синхронно, а это говорит о том, что ОЗУ тактируется от I2C.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вт мар 18, 2014 16:56:22

Казалось бы, без кварца работать как ОЗУ микросхема должна уметь.
Но по факту, у меня, например, почему-то не выходило вычитать или изменить данные при выпаянном кварце.
Ответить