А вот условие с делением на 4 порадовало
А вот условие с делением на 4 порадовало
Спасибо. Просто не был уверен что вопрос именно по DS1307, так как без неё в панельке, всё тоже самоеwixa писал(а): Перенёс сюда. Пользуйтесь поиском.
ploop
Это я так проверял делиться год на 4 или нет*Trigger* писал(а):Это ещё зачем?Код: Выделить всё
i=((y*10)/4)%10;
А можете объяснить как это?ploop писал(а):Нет, у вас именно ноги МК давят линию в ноль. Проверяйте программу.
Понял. Спасибо.... Причина выяснена. Перепутал GND и AVCC при разводке. Получилось что на AVCC подавался 0, а на GND - +5В через резистор 110 Ом...Поэтому вся правая сторона МК вела себя непонятным образом.ploop писал(а):wixa, во-первых, I²C - шина с монтажным "И", то есть на неё категорически нельзя подавать логическую единицу. Единица устанавливается на ней отпусканием шины (перевода ноги контроллера на вход) за счет подтягивающих резисторов, а вот ноль - как раз прижиманием шины к земле (перевод ноги контроллера на выход и подачей нуля на него). Иначе, скорее всего, вы спалили DS-ку или порт контроллера.
Во-вторых 0.7В нормальный логический уровень нуля.
Вы знаете, он вроде как заработал, выполнение кода дошло до отражение заставки на LCD... но на этом и зависла.... Лостал МК, хотел прочитать EEPROM чтобы понять на каком этапе она зависла, но вот тут уже МК отказался нормально читаться.... ошибка сигнатуры, считался бред как по фьюзам так и по флеш и EEPROM , и главное с каждым новым считыванием, показания меняются.....Foks писал(а):Я думаю, контроллер после такого не жилец. Или всё же работает?
Danko писал(а):Нет это обычный счетчик от 1 до 7. То что выставишь то и будет считать.
Я в своих часах его вообще не использую, а вычисляю.
Формула есть на Википедии.
Кусок кода из моих часов (Си CVAVR):Код: Выделить всё
// в данной версии данные хранятся не в двоичной, а в двоично-десятичной системе unsigned char myhour, mymin, mysec, // текушее время mydate, mymonth, myyear, // текущий календарь myday; // день недели // -------------------- вычислить день недели по дате -------------------------------------- void date2day(void) { unsigned int y, m; y = bcd2bin(myyear); m = bcd2bin(mymonth); if (m > 2) { m -= 2; } else { m += 10; y--; } myday = (unsigned char)((bcd2bin(mydate) + y + (y>>2) + ((31 * m) / 12)) % 7); if (myday == 0) myday = 7; }//-----------------------------------------------------------------------------------------
Код: Выделить всё
/*****************************************************
CodeWizardAVR V2.04.4a Advanced
Chip type : ATmega8
AVR Core Clock frequency: 4,000000 MHz
*****************************************************/
#include <mega8.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#asm
.equ __ds1302_port=0x15 ;PORTC
.equ __ds1302_io=5
.equ __ds1302_sclk=4
.equ __ds1302_rst=3
#endasm
#include <ds1302.h>
unsigned char hour,min,sek; //часы, минуты, секунды
unsigned char day,month,year; //часы, минуты, секунды
unsigned char myday; // день недели
// -------------------- вычислить день недели по дате --------------------------------------
void date2day(void) {
unsigned int y, m;
y = bcd2bin(year);
m = bcd2bin(month);
if (m > 2) { m -= 2; }
else { m += 10; y--; }
myday = (unsigned char)((bcd2bin(day) + y + (y>>2) + ((31 * m) / 12)) % 7);
if (myday == 0) myday = 7;
}//-
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
// DS1302 Real Time Clock initialization
// Trickle charger: Off
rtc_init(0,0,0);
lcd_init(16);
while (1)
{
rtc_get_time(&hour,&min,&sek); //считать время
rtc_get_date(&day,&month,&year); //считать дату
lcd_gotoxy(0,0);
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
lcd_putchar(':');
lcd_putchar(min/10+0x30);
lcd_putchar(min%10+0x30);
lcd_putchar('.');
lcd_putchar(sek/10+0x30);
lcd_putchar(sek%10+0x30);
lcd_gotoxy(0,1);
lcd_putchar(day/10+0x30);
lcd_putchar(day%10+0x30);
lcd_putchar('.');
lcd_putchar(month/10+0x30);
lcd_putchar(month%10+0x30);
lcd_putchar('.');
lcd_putsf("20");
lcd_putchar((year/10)%10+0x30);
lcd_putchar(year%10+0x30);
lcd_putchar(' ');
lcd_putchar(myday%10+0x30);
};
}
Простите, что никрофилю. Как вообще может такое быть от 0 до 7 это 8 дней. Число 7 какому дню недели соответствует?O-LED писал(а):Danko Ты не поверишь, но по твоей вине, до вчерашнего дня, считал что в 1307 нет "дня недели".![]()
а чем хуже формула которую раньше применял?
// формула для вычисления дня недели по дате (ru.wikipedia.org)
// a = (14 - месяц) / 12
// y = год - a
// m = месяц + 12 * a - 2
//ДеньНедели = (7000 + (день + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) ОСТАТОК 7
Вот еще одна формула вычисления дня недели.
dayOfWeek = (year+(int)(year4)+ mounth + day) % 7;
где - dayOfWeek - число от нуля до 7, соответсвует дню недели
(0 - вс,1-пн, ...)
year - год
Ну нельзя же на столько доверять протезу, что не верить документации от производителяКто в курсе это глюк пртеуса, в дате на 1307 день недели 1-7
Код: Выделить всё
unsigned char day_for_date(unsigned char d, unsigned char m, unsigned char y){
const unsigned char arr_month[] ={6,2,2,5,0,3,5,1,4,6,2,4};
unsigned char ret;
ret=d+(y%12 + y/12 + (y%12)/4)+arr_month[m-1];
if(!(y%4) && (m<3)) ret-=1;
ret%=7;
if(ret==0) ret=7;
return ret;
}