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

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт май 10, 2012 15:41:59

В данном случае скобки не нужны, операции разного приоритета, и всякий хоть мало-мальски вменяемый компилятор это знает.

А вот условие с делением на 4 порадовало ;) Хм, кстати, в своих часах забыл о високосных годах с кратностью 400.

Помогите разобраться DS1307 + подтягивающие резисторы Atmega

Чт май 10, 2012 16:49:32

Вообщем не очень вдаваясь в подробности, так как их очень много:) опишу лишь проблему...

Вот часть схемки :
Безымянный.JPG
(134.5 KiB) Скачиваний: 461


Меряю напряжение в обведенных местах, получаю +0.7V, меряю осцилографом на развертке по времени 0.1uS, ровная линия на 0.7V... Как так может получится???

Если от МК идёт 0, то напряжение должно быть 0В, если +5В, то напряжение +5 V, если убрать МК , то напряжение +5V от подтягивающих регистров, если бы с МК шел ШИМ, то я бы наверное увидел на такой развёртке его (если уменьшаю развёртку (увеличиваю время) сигна всё равно ровный).

Может ли это означать, что 28 и 27 ножки в высокоимпедансном состоянии HI-Z ???

Или может быть что-то другое???



Перенёс сюда. Пользуйтесь поиском.
ploop

Re: Помогите разобраться DS1307 + подтягивающие резисторы At

Чт май 10, 2012 16:55:30

wixa писал(а):Перенёс сюда. Пользуйтесь поиском.
ploop


Спасибо. Просто не был уверен что вопрос именно по DS1307, так как без неё в панельке, всё тоже самое :) а она рабочая точно, так как доставал её, делал на Arduino часы , и всё работало.... МК тоже вроде живой..... но конкретно живучесть этих ног в связи с DS -кой, утверждать не могу, так как нет опыта чтобы сделать часы на AVR atmega 88 именно на этих пинах на макетке :(

Самое интересное, что в Протеусе всё работает.....

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт май 10, 2012 16:58:43

Нет, у вас именно ноги МК давят линию в ноль. Проверяйте программу.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт май 10, 2012 16:59:51

*Trigger* писал(а):Это ещё зачем?
Код:
i=((y*10)/4)%10;


Это я так проверял делиться год на 4 или нет
Тока я в коде забыл дописать строчку
y=year;
но ваша версия мне больше понравилась и поэтому использую ее

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт май 10, 2012 19:10:38

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*):
IMAG002.JPG
(34.77 KiB) Скачиваний: 664




P.S. (Проблема в коде может быть, так как код изначально написан для Atmega 8, но я его перепелил под 88 ) Вот тут всё расписывал, как пилял, может гдето что-то не правильно ... (я новичек)) Буду очень благодарен за помощь, а то уже скоро волосы буду рвать на голове :)

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт май 10, 2012 22:20:26

Да ёжкин кот, Вы серьезно, или прикалываетесь? 0.7 в - нормальный уровень нуля, читайте даташит. Если этого не хватит - изучайте характеристики МОП-транзистора, и принципы построения КМОП логики.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Пт май 11, 2012 06:51:52

wixa, во-первых, I²C - шина с монтажным "И", то есть на неё категорически нельзя подавать логическую единицу. Единица устанавливается на ней отпусканием шины (перевода ноги контроллера на вход) за счет подтягивающих резисторов, а вот ноль - как раз прижиманием шины к земле (перевод ноги контроллера на выход и подачей нуля на него). Иначе, скорее всего, вы спалили DS-ку или порт контроллера.

Во-вторых 0.7В нормальный логический уровень нуля.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Пт май 11, 2012 07:38:35

ploop писал(а):wixa, во-первых, I²C - шина с монтажным "И", то есть на неё категорически нельзя подавать логическую единицу. Единица устанавливается на ней отпусканием шины (перевода ноги контроллера на вход) за счет подтягивающих резисторов, а вот ноль - как раз прижиманием шины к земле (перевод ноги контроллера на выход и подачей нуля на него). Иначе, скорее всего, вы спалили DS-ку или порт контроллера.

Во-вторых 0.7В нормальный логический уровень нуля.


Понял. Спасибо.... Причина выяснена. Перепутал GND и AVCC при разводке. Получилось что на AVCC подавался 0, а на GND - +5В через резистор 110 Ом...Поэтому вся правая сторона МК вела себя непонятным образом.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Пт май 11, 2012 11:30:38

Я думаю, контроллер после такого не жилец. Или всё же работает? :roll:

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Пт май 11, 2012 11:36:49

Foks писал(а):Я думаю, контроллер после такого не жилец. Или всё же работает? :roll:


Вы знаете, он вроде как заработал, выполнение кода дошло до отражение заставки на LCD... но на этом и зависла.... Лостал МК, хотел прочитать EEPROM чтобы понять на каком этапе она зависла, но вот тут уже МК отказался нормально читаться.... ошибка сигнатуры, считался бред как по фьюзам так и по флеш и EEPROM , и главное с каждым новым считыванием, показания меняются.....

Самое интересное, что пока я обнаруживал эту проблему, МК считывался и писался на УРА, а вот после исправление проблемы, умер.... Как то странно....

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Пт май 11, 2012 11:39:47

От переполюсовки питания (даже AVCC) открываются pn-переходы (фактически паразитные диоды в микросхеме), которые в нормальном режиме всегда закрыты. То есть, нехилую часть периферии Вы вероятнее всего сожгли, а ядро осталось живым.

Попробуйте оторвать AVCC и оставить в воздухе (там скорее всего пробило всё нафиг), возможно что-то еще будет работать.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вт ноя 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;
}//----------

У меня компилятор ругается на 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 KiB) Скачиваний: 406

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Ср окт 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 - год


Простите, что никрофилю. Как вообще может такое быть от 0 до 7 это 8 дней. Число 7 какому дню недели соответствует? :)
Просто у меня практический вопрос. Набросал часики на 1307, но зараза, после 7 дня недели у меня идет 0. Правда это в Протеусе. В железе пока не сделал.
Кто в курсе это глюк пртеуса, в дате на 1307 день недели 1-7

Добавлено after 8 hours 22 minutes 44 seconds:
Вобщем это глюк протеуса, в железе все ок.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вт ноя 01, 2016 23:10:34

Вот мой кусок на баскоме. Может кому пригодится...

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 "понедел." , "вторник " , "среда " , "четверг " , "пятница " , "суббота " , "воскр. "

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вт ноя 01, 2016 23:27:05

Кто в курсе это глюк пртеуса, в дате на 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;
}
Функция принимает дату в виде 3-х переменных - день, месяц, год. И возвращает день недели в виде числа от 1 до 7.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Ср мар 28, 2018 22:55:14

DS1307+CVAVR3.22+Proteus8
чтобы не заморачиваться кодом решил использовать день недели из самой 1307 (естественно записав в нее правильные время, дату и день недели.
При переходе на новые сутки счетчик автоматом прибавляет к week_day единицу и при опросе таймера показания выводятся на экранчик.
если установить "6" (суббота) то следующее значение будет "7" т.е. воскресенье... а потом следующее "0" ...задумался )))
это у кого глюки?
ps пробовал считать и вскр = 1, результат тот же - после 7-го дня начинается с ноля

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт мар 29, 2018 10:01:24

По документации у ВСЕХ разновидностей стоит 1-7...
Однако на практике... бывают ошибки при считывании/обработке - в суть не вникал - но вероятнее всего дефект программы обработки данных в МК.
:dont_know:

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт мар 29, 2018 11:19:46

может и дефект
принудительно записывал в week_day и 10 и 15, при переходе на новый день добросовестно увеличивает протеус на единичку. и только если было 7 то сбрасывается до 0

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Чт мар 29, 2018 11:26:16

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