А вот условие с делением на 4 порадовало
#Часы реального времени DS1307 от Dallas Semiconductor#
-
Foks
- Поставщик валерьянки для Кота
- Сообщения: 2108
- Зарегистрирован: Пт авг 29, 2008 16:28:19
- Откуда: Киев
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
В данном случае скобки не нужны, операции разного приоритета, и всякий хоть мало-мальски вменяемый компилятор это знает.
А вот условие с делением на 4 порадовало
Хм, кстати, в своих часах забыл о високосных годах с кратностью 400.
А вот условие с делением на 4 порадовало
Giggity giggity goo!
Помогите разобраться DS1307 + подтягивающие резисторы Atmega
Вообщем не очень вдаваясь в подробности, так как их очень много:) опишу лишь проблему...
Вот часть схемки :
Меряю напряжение в обведенных местах, получаю +0.7V, меряю осцилографом на развертке по времени 0.1uS, ровная линия на 0.7V... Как так может получится???
Если от МК идёт 0, то напряжение должно быть 0В, если +5В, то напряжение +5 V, если убрать МК , то напряжение +5V от подтягивающих регистров, если бы с МК шел ШИМ, то я бы наверное увидел на такой развёртке его (если уменьшаю развёртку (увеличиваю время) сигна всё равно ровный).
Может ли это означать, что 28 и 27 ножки в высокоимпедансном состоянии HI-Z ???
Или может быть что-то другое???
Перенёс сюда. Пользуйтесь поиском.
ploop
Вот часть схемки :
Меряю напряжение в обведенных местах, получаю +0.7V, меряю осцилографом на развертке по времени 0.1uS, ровная линия на 0.7V... Как так может получится???
Если от МК идёт 0, то напряжение должно быть 0В, если +5В, то напряжение +5 V, если убрать МК , то напряжение +5V от подтягивающих регистров, если бы с МК шел ШИМ, то я бы наверное увидел на такой развёртке его (если уменьшаю развёртку (увеличиваю время) сигна всё равно ровный).
Может ли это означать, что 28 и 27 ножки в высокоимпедансном состоянии HI-Z ???
Или может быть что-то другое???
Перенёс сюда. Пользуйтесь поиском.
ploop
Кот заболел Ринотрахиитом
(тот что на фото)
Re: Помогите разобраться DS1307 + подтягивающие резисторы At
wixa писал(а):Перенёс сюда. Пользуйтесь поиском.
ploop
Спасибо. Просто не был уверен что вопрос именно по DS1307, так как без неё в панельке, всё тоже самое
Самое интересное, что в Протеусе всё работает.....
Кот заболел Ринотрахиитом
(тот что на фото)
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Нет, у вас именно ноги МК давят линию в ноль. Проверяйте программу.
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Это я так проверял делиться год на 4 или нет
Тока я в коде забыл дописать строчку
y=year;
но ваша версия мне больше понравилась и поэтому использую ее
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
ploop писал(а):Нет, у вас именно ноги МК давят линию в ноль. Проверяйте программу.
А можете объяснить как это?
Просто я проверял так :
1.Вытащил МК и DS
2.Подаю общее питание на подтягивающе резисторы
3.Даю сначала + 5 В там где должна быть ножка мк, меряю, там где должна быть ножка DS, получаю +5 В.
4.Даю 0 там где должна быть ножка мк, получаю на ножке DS 0
5. Не даю на мк нечего, на ds получаю +5В.
1.Так как же мк давит на 0,7В ??? (Если бы это был, ШИМ, то на оссцилографе я должен же видеть сигнал не в виде прямой на развёртке по времени 0.1us . Частота МК от внутренего генератора 8Мгц.)
2.И почему тогда в протеусе работает? (такое может быть?)
3*.Сунул МК в плату, убрал DS, "-" (щуп) бросаю на +5В(питание DS) "+"(щуп) на ножки мк, и получаю прямую на -5В.... О чем это говорит?
4*. Если на макетке включаю без подтяга, то на ножке 28 получаю вот такое (щупы подключены аналогично пункту 3*):
P.S. (Проблема в коде может быть, так как код изначально написан для Atmega 8, но я его перепелил под 88 ) Вот тут всё расписывал, как пилял, может гдето что-то не правильно ... (я новичек)) Буду очень благодарен за помощь, а то уже скоро волосы буду рвать на голове
Кот заболел Ринотрахиитом
(тот что на фото)
-
Foks
- Поставщик валерьянки для Кота
- Сообщения: 2108
- Зарегистрирован: Пт авг 29, 2008 16:28:19
- Откуда: Киев
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Да ёжкин кот, Вы серьезно, или прикалываетесь? 0.7 в - нормальный уровень нуля, читайте даташит. Если этого не хватит - изучайте характеристики МОП-транзистора, и принципы построения КМОП логики.
Giggity giggity goo!
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
wixa, во-первых, I²C - шина с монтажным "И", то есть на неё категорически нельзя подавать логическую единицу. Единица устанавливается на ней отпусканием шины (перевода ноги контроллера на вход) за счет подтягивающих резисторов, а вот ноль - как раз прижиманием шины к земле (перевод ноги контроллера на выход и подачей нуля на него). Иначе, скорее всего, вы спалили DS-ку или порт контроллера.
Во-вторых 0.7В нормальный логический уровень нуля.
Во-вторых 0.7В нормальный логический уровень нуля.
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
ploop писал(а):wixa, во-первых, I²C - шина с монтажным "И", то есть на неё категорически нельзя подавать логическую единицу. Единица устанавливается на ней отпусканием шины (перевода ноги контроллера на вход) за счет подтягивающих резисторов, а вот ноль - как раз прижиманием шины к земле (перевод ноги контроллера на выход и подачей нуля на него). Иначе, скорее всего, вы спалили DS-ку или порт контроллера.
Во-вторых 0.7В нормальный логический уровень нуля.
Понял. Спасибо.... Причина выяснена. Перепутал GND и AVCC при разводке. Получилось что на AVCC подавался 0, а на GND - +5В через резистор 110 Ом...Поэтому вся правая сторона МК вела себя непонятным образом.
Кот заболел Ринотрахиитом
(тот что на фото)
-
Foks
- Поставщик валерьянки для Кота
- Сообщения: 2108
- Зарегистрирован: Пт авг 29, 2008 16:28:19
- Откуда: Киев
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Я думаю, контроллер после такого не жилец. Или всё же работает? 
Giggity giggity goo!
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Foks писал(а):Я думаю, контроллер после такого не жилец. Или всё же работает?
Вы знаете, он вроде как заработал, выполнение кода дошло до отражение заставки на LCD... но на этом и зависла.... Лостал МК, хотел прочитать EEPROM чтобы понять на каком этапе она зависла, но вот тут уже МК отказался нормально читаться.... ошибка сигнатуры, считался бред как по фьюзам так и по флеш и EEPROM , и главное с каждым новым считыванием, показания меняются.....
Самое интересное, что пока я обнаруживал эту проблему, МК считывался и писался на УРА, а вот после исправление проблемы, умер.... Как то странно....
Кот заболел Ринотрахиитом
(тот что на фото)
-
Foks
- Поставщик валерьянки для Кота
- Сообщения: 2108
- Зарегистрирован: Пт авг 29, 2008 16:28:19
- Откуда: Киев
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
От переполюсовки питания (даже AVCC) открываются pn-переходы (фактически паразитные диоды в микросхеме), которые в нормальном режиме всегда закрыты. То есть, нехилую часть периферии Вы вероятнее всего сожгли, а ядро осталось живым.
Попробуйте оторвать AVCC и оставить в воздухе (там скорее всего пробило всё нафиг), возможно что-то еще будет работать.
Попробуйте оторвать AVCC и оставить в воздухе (там скорее всего пробило всё нафиг), возможно что-то еще будет работать.
Giggity giggity goo!
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Здравствуйте подскажите как всетаки вычисляется этот день недели...
У меня компилятор ругается на undefined symbol 'bcd2bin' , как нужно его правильно прописать?
Мой код
Архив с проектом и протеусом приложил к сообщению...
Спойлер
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;
}//----------
У меня компилятор ругается на undefined symbol 'bcd2bin' , как нужно его правильно прописать?
Мой код
Спойлер
Код: Выделить всё
/*****************************************************
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);
};
}
Архив с проектом и протеусом приложил к сообщению...
- Вложения
-
- DS1302 Real Time.rar
- (75.71 КБ) 456 скачиваний
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
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 - год
Простите, что никрофилю. Как вообще может такое быть от 0 до 7 это 8 дней. Число 7 какому дню недели соответствует?
Просто у меня практический вопрос. Набросал часики на 1307, но зараза, после 7 дня недели у меня идет 0. Правда это в Протеусе. В железе пока не сделал.
Кто в курсе это глюк пртеуса, в дате на 1307 день недели 1-7
Добавлено after 8 hours 22 minutes 44 seconds:
Вобщем это глюк протеуса, в железе все ок.
- Microtech
- Поставщик валерьянки для Кота
- Сообщения: 2052
- Зарегистрирован: Вт ноя 03, 2009 21:02:38
- Откуда: Москва
- Контактная информация:
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Вот мой кусок на баскоме. Может кому пригодится...
Getden: ' возвращает название дня недели в переменной text. год может быть нулевым
Gosub Ds1307
Chislo = Makedec(chislo)
Mes = Makedec(mes)
Year = Makedec(year)
'вычисление дня недели по году дате и месяцу
If Mes <= 2 Then : Year = Year - 1 : Chislo = Chislo + 3 : End If
M1 = Chislo + Year
M2 = Year / 4
M1 = M1 + M2
M2 = Year / 100
M1 = M1 - M2
M2 = Year / 400
M1 = M1 + M2
M2 = 31 * Mes
M2 = M2 + 10
M2 = M2 / 12
M1 = M1 + M2
M2 = M1 Mod 7
Denned = M2 '
Text = Lookupstr(denned , Tabl1) 'номер дня недели
Return
Tabl1:
Data "понедел." , "вторник " , "среда " , "четверг " , "пятница " , "суббота " , "воскр. "
Getden: ' возвращает название дня недели в переменной text. год может быть нулевым
Gosub Ds1307
Chislo = Makedec(chislo)
Mes = Makedec(mes)
Year = Makedec(year)
'вычисление дня недели по году дате и месяцу
If Mes <= 2 Then : Year = Year - 1 : Chislo = Chislo + 3 : End If
M1 = Chislo + Year
M2 = Year / 4
M1 = M1 + M2
M2 = Year / 100
M1 = M1 - M2
M2 = Year / 400
M1 = M1 + M2
M2 = 31 * Mes
M2 = M2 + 10
M2 = M2 / 12
M1 = M1 + M2
M2 = M1 Mod 7
Denned = M2 '
Text = Lookupstr(denned , Tabl1) 'номер дня недели
Return
Tabl1:
Data "понедел." , "вторник " , "среда " , "четверг " , "пятница " , "суббота " , "воскр. "
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
Ну нельзя же на столько доверять протезу, что не верить документации от производителяКто в курсе это глюк пртеуса, в дате на 1307 день недели 1-7
Добавлено after 8 minutes 1 second:
А вот вычисление дня недели на Си :
Код: Выделить всё
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;
}
- Dr.Seldom
- Первый раз сказал Мяу!
- Сообщения: 35
- Зарегистрирован: Ср окт 21, 2009 11:10:53
- Откуда: Минск
- Контактная информация:
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
DS1307+CVAVR3.22+Proteus8
чтобы не заморачиваться кодом решил использовать день недели из самой 1307 (естественно записав в нее правильные время, дату и день недели.
При переходе на новые сутки счетчик автоматом прибавляет к week_day единицу и при опросе таймера показания выводятся на экранчик.
если установить "6" (суббота) то следующее значение будет "7" т.е. воскресенье... а потом следующее "0" ...задумался )))
это у кого глюки?
ps пробовал считать и вскр = 1, результат тот же - после 7-го дня начинается с ноля
чтобы не заморачиваться кодом решил использовать день недели из самой 1307 (естественно записав в нее правильные время, дату и день недели.
При переходе на новые сутки счетчик автоматом прибавляет к week_day единицу и при опросе таймера показания выводятся на экранчик.
если установить "6" (суббота) то следующее значение будет "7" т.е. воскресенье... а потом следующее "0" ...задумался )))
это у кого глюки?
ps пробовал считать и вскр = 1, результат тот же - после 7-го дня начинается с ноля
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
По документации у ВСЕХ разновидностей стоит 1-7...
Однако на практике... бывают ошибки при считывании/обработке - в суть не вникал - но вероятнее всего дефект программы обработки данных в МК.

Однако на практике... бывают ошибки при считывании/обработке - в суть не вникал - но вероятнее всего дефект программы обработки данных в МК.

- Dr.Seldom
- Первый раз сказал Мяу!
- Сообщения: 35
- Зарегистрирован: Ср окт 21, 2009 11:10:53
- Откуда: Минск
- Контактная информация:
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
может и дефект
принудительно записывал в week_day и 10 и 15, при переходе на новый день добросовестно увеличивает протеус на единичку. и только если было 7 то сбрасывается до 0
принудительно записывал в week_day и 10 и 15, при переходе на новый день добросовестно увеличивает протеус на единичку. и только если было 7 то сбрасывается до 0
Re: #Часы реального времени DS1307 от Dallas Semiconductor#
У меня иногда "кульбиты с датой" выскакивают...
Причем при повторном включении уже нормальные показания - где-то недочет в программе, а смотреть влом - поздно заметил (прожка под ассемблером да поднавороченная).

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