roboforum.ru

Технический форум по робототехнике.

Помогите разобраться DS1302

Помогите разобраться DS1302

Raf00084 » 10 ноя 2011, 00:32

Привет всем помогите разобраться, не могу понять рабочий код или нет
Код: Выделить всёРазвернуть
void WriteDS_Sec (unsigned char sec) // При вызове функции в переменную сек пишу 135 
{
char adrDS=129; // адрес для записи секунд
char b=0;
char indexDS;
PORTA.3=1;       // 1 на ногу подключенную к ресет
delay_us(10);
   indexDS=adrDS;
   for(b=0;b<8;b++){   // тут я передаю адрес

     if(indexDS&0x80){
      PORTA.2=1;}
         
     else{
     PORTA.2=0;}         // PORTA.2 подключено в дата
     delay_us(10);
     PORTA.1=1;           // PORTA.1 подключено к CLk
     delay_us(10);
   
     PORTA.1=0;
     indexDS=indexDS<<1;}
   
    b=0;
     delay_us(20);
    indexDS=sec1;
   
    for(b=0;b<8;b++){ // тут передаю начальный счет секунд
    if(indexDS&0x80){
      PORTA.2=1;}   
    else{
     PORTA.2=0;}
     delay_us(10);
     PORTA.1=1;
 
   delay_us(10);
   
   PORTA.1=0;
   indexDS=indexDS<<1;}
delay_us(10);
PORTA.2=0;   
PORTA.3=0;   
 
}


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

Re: Помогите разобраться DS1302

RootAdmin » 10 ноя 2011, 16:42

Что-то не помню чтобы резет надо было поднимать перед началом записи.

Re: Помогите разобраться DS1302

Raf00084 » 10 ноя 2011, 23:43

Input. CE signal must be asserted high during a read or a write. This pin has an internal 40kΩ (typ) pulldown resistor to ground. Note: Previous data sheet revisions referred to CE as RST. The functionality of the pin has not changed.
Это из датшит про ресет, в изображении вырезаном из датшита видно что ету ногу поднимают перед началом записи или чтения
вроде все правильно прошил в железо тоже не работает помогите разобраться.
Код: Выделить всёРазвернуть
void ReadDS_Min (void)
{
char adrDS=131;
char b=0;
char indexDS;
PORTA.3=1;

   indexDS=adrDS;

   for(b=0;b<8;b++){

     if(indexDS&0x80){
      PORTA.2=1;}
     
     else{
     PORTA.2=0;}
   
   PORTA.1=1;
    delay_us(1);
   PORTA.1=0;
   
   indexDS=indexDS<<1;}
   
    b=0;
     delay_us(1);
   
    for(b=0;b<8;b++){

   if(PORTA.2==1){
   indexDS |= (1<<8);}
 
   else{
   indexDS &= (~(1<<8));}
   
   PORTA.1=1;
    delay_us(1);
   PORTA.1=0;
   indexDS=indexDS<<1;}
    delay_us(1);
   
PORTA.3=0;   
Rmin=indexDS; 
}

читаю из часиков вот так.

Добавлено спустя 1 час 26 минут 7 секунд:
Код: Выделить всёРазвернуть
void WriteDS_Sec (unsigned char sec) // При вызове функции в переменную сек пишу 135 
{
char adrDS=129; // адрес для записи секунд
char b=0;
char indexDS;
PORTA.3=1;       // 1 на ногу подключенную к ресет

   indexDS=adrDS;
   for(b=0;b<8;b++){   // тут я передаю адрес

     if(indexDS&0x1){
      PORTA.2=1;}
         
     else{
     PORTA.2=0;}         // PORTA.2 подключено в дата
     
     PORTA.1=1;           // PORTA.1 подключено к CLk
   
   
     PORTA.1=0;
     indexDS=indexDS>>1;}
   
    b=0;

    indexDS=sec1;
   
    for(b=0;b<8;b++){ // тут передаю начальный счет секунд
    if(indexDS&0x1){
      PORTA.2=1;}   
    else{
     PORTA.2=0;}
   
     PORTA.1=1;
   
     PORTA.1=0;
   indexDS=indexDS>>1;}

PORTA.2=0;   
PORTA.3=0;   
 
}


так ну я исправил код сейчас инициализирует и в значение секунд пишет то что я хочу но тикать не тикает, по дш написано что для старта надо записать 1 в седбмой бит секунд но тогда и значение сек будет 0??? Правильно
Вложения
Безымянный.jpg

Re: Помогите разобраться DS1302

Michael_K » 11 ноя 2011, 00:14

Что это значит "не работает"???

1. Сигналы точно такие, как надо? (есть чем посмотреть? А что в симуляторе?)
2. Адрес правильный?
3. Окей, часики не тикают, а если записать в регистр и его же прочитать, значение сохраняется?
4. Может быть кварц не очень подходящий (хотя эти часики довольно стабильно кварцы заводят, хоть и медленно).

Raf00084 писал(а):по дш написано что для старта надо записать 1 в седбмой бит секунд но тогда и значение сек будет 0??? Правильно

Наоборот! Чтобы часы пошли, нужно записать нолик. Да, секунды при этом сбросятся. Если часы уже идут, просто не записывайте туда нолик, и они не будут сбрасываться.

Re: Помогите разобраться DS1302

RootAdmin » 11 ноя 2011, 00:48

Старший бит разве значащий? Не могу исходик найти от такого чипа - игрался давно.

Re: Помогите разобраться DS1302

Raf00084 » 11 ноя 2011, 00:58

Все разобрался часы пошли с той секунды какую задаю, но вот теперь считать значение и поместить его в переменную Rmin не получается, на дисплее 00, в протеусе на осциле картинка есть но не могу понять походу что-то с задержками надо мутить,
Подскажите правильно ли я понял дш на DS что при чтении значения я
1. сначала передаю в микру адрес какой буду читать т.е мин (0х83) (таким же образом как записываю секунды)
2. после того как дерну CLK 1/0
3. потом считываю состояние I/0 ноги мк и при помощи не хитрых манипуляций записяваю его в переменную
Код: Выделить всёРазвернуть
 (if(PORTA.2==1){
   indexDS |= (1<<8);}
   else{
   indexDS &= (~(1<<8));}
   PORTA.1=1;
   delay_us(1);
   PORTA.1=0;
   indexDS=indexDS<<1;}

4. и потом значение переменной пишу в Rmin/

Правильно???

Re: Помогите разобраться DS1302

Michael_K » 11 ноя 2011, 01:07

После адреса (по спаду clk) ногу назначить на вход.
Читаь нужно не PORTA, а PINA
(чему вас только в школе учат :))

Re: Помогите разобраться DS1302

Raf00084 » 11 ноя 2011, 01:41

Вот фак так и знал что гдето мелочь, как говорится слона та я и не приметил!
ща пробую спасибо думаю это решит мою проблему.

Добавлено спустя 16 минут 7 секунд:
читаю вот так
Код: Выделить всёРазвернуть
void ReadDS_Min (void)
{
char adrDS=0x81;
char b=0;
char indexDS;

PORTA.3=1;

   indexDS=adrDS;

   for(b=0;b<8;b++){

     if(indexDS&0x1){
      PORTA.2=1;}
     
     else{
     PORTA.2=0;}
   
   PORTA.1=1;
   
   PORTA.1=0;
   
   indexDS=indexDS>>1;}
   
    b=0;
    delay_us(2);

    indexDS=0;

    DDRA=0x0A;

    for(b=0;b<8;b++){
   
   PORTA.1=1;
   delay_us(2);
   PORTA.1=0;
   
   if(PINA.2==1){
   indexDS |= (1<<8);}
 
   else{
   indexDS &= (~(1<<8));}
   
   indexDS=indexDS>>1;}

   
PORTA.3=0;
 
Rmin=indexDS;

DDRA=0x0E;
}


на дисплее 00 уже адрес секунд забил для наглядности 0x81, что я мог забыть

Добавлено спустя 15 минут 22 секунды:
в протеусе по осцилу смотрю сигналы все сходится с значением которое я задаю неужели как-то не правильно в переменную пишу??

Re: Помогите разобраться DS1302

Michael_K » 11 ноя 2011, 01:50

Не гадайте! Отлаживайте!
Может задержки кое-где воткнуть?
(Смущают честно говоря такие последовательности:
PORTA.1=1;
PORTA.1=0;
)

Re: Помогите разобраться DS1302

Raf00084 » 11 ноя 2011, 01:56

нет осциллографа, можету меня на отладке микра или кварц не рабочий поэтому и 00, скажите процедура записи в переменную правильная?
По поводу
PORTA.1=1;
PORTA.1=0;
мега прошита на внутренний 1 мгц
а часики по дш работаю до 2 мгц
так что я думаю успевают


Rambler\'s Top100 Mail.ru counter