Вс сен 01, 2013 22:21:43
Пн сен 02, 2013 13:19:01
kapitaneo писал(а):Хм только заметил, что в коде инициализация прописана rtc_init(3,1,0).
Пн сен 02, 2013 20:36:01
Вт сен 03, 2013 09:41:06
Пн окт 14, 2013 00:37:45
Пн окт 14, 2013 09:21:01
А ничего, что в даташите жирным выделено:Gudd-Head писал(а):Эммм... А чего там инициализировать? Питание подал — часы пошли. Единственный вопрос, в 12-ти или 24-х часовом формате.
состояние ВСЕХ регистров по включению НЕ ОПРЕДЕЛЕНО. Необходимо, по крайней мере, выключить CH (остановку часов), не говорю уже про то, что в регистрах времени и даты мусор будет.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.
Исчерпывающий вопросgreentm писал(а):Собрал девайс на DS1307 и он раз а то и 2 раза в сутки виснет...
Вт окт 15, 2013 14:43:15
a_skr писал(а):А ничего, что в даташите жирным выделено
Note: Unless otherwise specified, the state of the registers is not defined when power is first applied or VCC falls below the VOSC.
Сб ноя 16, 2013 12:22:22
Пн ноя 25, 2013 21:55:56
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();
#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);
}
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);
}
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);
}
}
Пт мар 14, 2014 16:46:05
Пт мар 14, 2014 16:55:01
Пн мар 17, 2014 10:43:57
ks0 писал(а):в качестве энергонезависимой памяти?
Пн мар 17, 2014 11:19:56
Пн мар 17, 2014 11:54:01
Пн мар 17, 2014 12:32:58
Пн мар 17, 2014 22:08:11
транзистор и на бОльших частотах работает, генератора в нем нет) ... шутка)Gudd-Head писал(а):Коли микра работает с I²С на скоростях до 400 кГц, у неё наверняка есть встроенный генератор.
Вт мар 18, 2014 09:00:36
Вт мар 18, 2014 09:59:56
ibiza11 писал(а):I2C синхронный протокол, синхра идет от мастера, а DS1307 - слейв онли) В ней нет генератора.
Вт мар 18, 2014 14:49:27
Вт мар 18, 2014 16:56:22