Чт май 10, 2012 15:41:59
Чт май 10, 2012 16:49:32
Чт май 10, 2012 16:55:30
wixa писал(а):Перенёс сюда. Пользуйтесь поиском.
ploop
Чт май 10, 2012 16:58:43
Чт май 10, 2012 16:59:51
*Trigger* писал(а):Это ещё зачем?
- Код:
i=((y*10)/4)%10;
Чт май 10, 2012 19:10:38
ploop писал(а):Нет, у вас именно ноги МК давят линию в ноль. Проверяйте программу.
Чт май 10, 2012 22:20:26
Пт май 11, 2012 06:51:52
Пт май 11, 2012 07:38:35
ploop писал(а):wixa, во-первых, I²C - шина с монтажным "И", то есть на неё категорически нельзя подавать логическую единицу. Единица устанавливается на ней отпусканием шины (перевода ноги контроллера на вход) за счет подтягивающих резисторов, а вот ноль - как раз прижиманием шины к земле (перевод ноги контроллера на выход и подачей нуля на него). Иначе, скорее всего, вы спалили DS-ку или порт контроллера.
Во-вторых 0.7В нормальный логический уровень нуля.
Пт май 11, 2012 11:30:38
Пт май 11, 2012 11:36:49
Foks писал(а):Я думаю, контроллер после такого не жилец. Или всё же работает?
Пт май 11, 2012 11:39:47
Вт ноя 13, 2012 20:18:05
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);
};
}
Ср окт 26, 2016 23:08:48
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 - год
Вт ноя 01, 2016 23:10:34
Вт ноя 01, 2016 23:27:05
Ну нельзя же на столько доверять протезу, что не верить документации от производителяКто в курсе это глюк пртеуса, в дате на 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;
}
Ср мар 28, 2018 22:55:14
Чт мар 29, 2018 10:01:24
Чт мар 29, 2018 11:19:46
Чт мар 29, 2018 11:26:16