roboforum.ru

Технический форум по робототехнике.
Текущее время: 01 мар 2025, 19:56

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Помогите разобраться DS1302
СообщениеДобавлено: 10 ноя 2011, 00:32 
Не в сети
Аватара пользователя

Зарегистрирован: 19 янв 2009, 16:18
Сообщения: 50
Откуда: Хренсбург
Привет всем помогите разобраться, не могу понять рабочий код или нет
Код:
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
СообщениеДобавлено: 10 ноя 2011, 16:42 
Не в сети

Зарегистрирован: 07 авг 2010, 21:29
Сообщения: 1725
Откуда: КМВ
прог. языки: C
ФИО: Андрей
Что-то не помню чтобы резет надо было поднимать перед началом записи.

_________________
Дым, идущий из всех устройств в помещении предвещает появление электрика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться DS1302
СообщениеДобавлено: 10 ноя 2011, 23:43 
Не в сети
Аватара пользователя

Зарегистрирован: 19 янв 2009, 16:18
Сообщения: 50
Откуда: Хренсбург
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
Безымянный.jpg [ 76 КиБ | Просмотров: 2819 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться DS1302
СообщениеДобавлено: 11 ноя 2011, 00:14 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
Что это значит "не работает"???

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться DS1302
СообщениеДобавлено: 11 ноя 2011, 00:48 
Не в сети

Зарегистрирован: 07 авг 2010, 21:29
Сообщения: 1725
Откуда: КМВ
прог. языки: C
ФИО: Андрей
Старший бит разве значащий? Не могу исходик найти от такого чипа - игрался давно.

_________________
Дым, идущий из всех устройств в помещении предвещает появление электрика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться DS1302
СообщениеДобавлено: 11 ноя 2011, 00:58 
Не в сети
Аватара пользователя

Зарегистрирован: 19 янв 2009, 16:18
Сообщения: 50
Откуда: Хренсбург
Все разобрался часы пошли с той секунды какую задаю, но вот теперь считать значение и поместить его в переменную 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
СообщениеДобавлено: 11 ноя 2011, 01:07 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
После адреса (по спаду clk) ногу назначить на вход.
Читаь нужно не PORTA, а PINA
(чему вас только в школе учат :))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться DS1302
СообщениеДобавлено: 11 ноя 2011, 01:41 
Не в сети
Аватара пользователя

Зарегистрирован: 19 янв 2009, 16:18
Сообщения: 50
Откуда: Хренсбург
Вот фак так и знал что гдето мелочь, как говорится слона та я и не приметил!
ща пробую спасибо думаю это решит мою проблему.

Добавлено спустя 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
СообщениеДобавлено: 11 ноя 2011, 01:50 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться DS1302
СообщениеДобавлено: 11 ноя 2011, 01:56 
Не в сети
Аватара пользователя

Зарегистрирован: 19 янв 2009, 16:18
Сообщения: 50
Откуда: Хренсбург
нет осциллографа, можету меня на отладке микра или кварц не рабочий поэтому и 00, скажите процедура записи в переменную правильная?
По поводу
PORTA.1=1;
PORTA.1=0;
мега прошита на внутренний 1 мгц
а часики по дш работаю до 2 мгц
так что я думаю успевают


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO