реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> DS1338 + XMEGA
alexeyv
сообщение Jul 7 2011, 10:56
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



функцию контроля АСК проще сделать не отдельно, а в rtc_write - выдавать как результат работы функции
функцию посылки АСК проще сделать не отдельно, а в read_rtc - принимать как параметр 1= выдача АСК, 0 - выдача НАК

Маленький вопрос. Подтягивающие резисторы на линиях SCL и SDA есть?

Посмотри здесь

Оссобенно изучи пост №18.

Сообщение отредактировал alexeyv - Jul 7 2011, 11:05
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 7 2011, 11:04
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Цитата
Маленький вопрос. Подтягивающие резисторы на линиях SCL и SDA есть?

Подтяжек нет.



Цитата
Маленький вопрос. Подтягивающие резисторы на линиях SCL и SDA есть?

Подтяжек нет.

Цитата
В функции rtc_write после цикла выставления байта на шину, необходимо выставить данные=1, для того, что бы после дополнительного клока проанализировать принятый от часов бит АСК

Направление порта должно быть входом иначе не видно будет АСК. Но какой тогда смысл выставлять данные в 1?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jul 7 2011, 11:09
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Направление порта должно быть входом иначе не видно будет АСК. Но какой тогда смысл выставлять данные в 1?


В смысле необходимо переключить порт (DDR_X) как вход, но перед этим записать в PORT_X единицу - этим включаются подтягивающие резисторы на порту

посмотри пост №18

в архиве - исходники
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 7 2011, 11:21
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Цитата(alexeyv @ Jul 7 2011, 14:09) *
В смысле необходимо переключить порт (DDR_X) как вход, но перед этим записать в PORT_X единицу - этим включаются подтягивающие резисторы на порту

посмотри пост №18

в архиве - исходники


а внешние подтягивающие резисторы в схеме нужны?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jul 8 2011, 03:00
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата(Pavel_Bor @ Jul 7 2011, 16:21) *
а внешние подтягивающие резисторы в схеме нужны?


Подтягивающие резисторы обычно рекомендуют ставить.

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

Сообщение отредактировал alexeyv - Jul 8 2011, 03:00
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 8 2011, 07:23
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Я так понимаю время задержки между тактами значения не имеет. Главное чтобы оно было больше минимального.
Когда программа получает АСК, пока SCL в "1" ACK никуда не денется до тех пор пока SCL не станет "0"?

Есть шаг №2. Читаю с регистров 0. Пошли часы)

Не получается записать в регистры новые значения.
текущий программа для записи:
Код
void i2c_tx_soft(unsigned char byte)
{
  
  unsigned char count;
  RTC_DATA_DIR_SET;
  if(i2c_error_soft)
    return;
  for(count=0;count<8;count++)
    {
      if(byte&0x80)
        RTC_DATA_SET;
      else
        RTC_DATA_CLR;
      RTC_SCL_UP;
      delay_ms(5);
      RTC_SCL_DOWN;
      delay_ms(5);
      byte<<=1;
    }
  RTC_DATA_DIR_CLR;
  RTC_SCL_UP;
  delay_ms(5);
  while(in_sda());
  delay_ms(5);
  RTC_SCL_DOWN;
  delay_ms(5);
  RTC_DATA_DIR_SET;
}


Вызов ее вот отсюда
Код
void rtc_set_time(unsigned char hours, unsigned char minutes, unsigned char seconds)
{
  i2c_start_soft();
  i2c_tx_soft(DS1338_ADDR|WR);
  i2c_tx_soft(0);
  i2c_tx_soft(dec2bcd(seconds));
  i2c_tx_soft(dec2bcd(minutes));
  i2c_tx_soft(dec2bcd(hours));

  i2c_stop_soft();
}


void rtc_set_date(unsigned char date, unsigned char month, unsigned int year)
{
  i2c_start_soft();
  i2c_tx_soft(DS1338_ADDR|WR);
  i2c_tx_soft(3);
  i2c_tx_soft(dec2bcd(rtcTime.day));
  i2c_tx_soft(dec2bcd(date));
  i2c_tx_soft(dec2bcd(month));
  i2c_tx_soft(dec2bcd(year));
  i2c_stop_soft();
}


Сообщение отредактировал Pavel_Bor - Jul 8 2011, 12:11
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jul 11 2011, 04:39
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
while(in_sda());


Во время подачи клока, по одному фронту производится выставление данных передатчиком(в данном случае мастером), а по другому фронту - считывание приемником ( в данном случае слейвом)!
Ждать до бесконечности появления нуля на шине SDA (ACK) НЕЛЬЗЯ, т.к. при подаче фронта SCL слейв ОБЯЗАН выставить ACK, иначе это говорит об отсутствии устройства (слейва) на шине!

Посмотри осциллографом физическое наличие сигнала АСК на шине.

Еще вопрос - какие-либо прерывания в программе используются ?

Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 11 2011, 11:37
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



С часами уже все ок)
Значение с внешнего RTC (DS1338) передается на внутренний RTC при включении контроллера. Добавлена проверка на отключение батарейки.
Прерываний будет много но со временем. (клавиатура, АЦП, УАРТ...)

Может системой событий воспользоваться..?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jul 11 2011, 12:10
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Прерываний будет много но со временем. (клавиатура, АЦП, УАРТ...)


Тогда желательно в функциях чтения/записи I2C расставить:
1. в начале обмена - сохранение регистра статуса и глобальный запрет прерываний
2. в конце обмена - восстановление регистра статуса

Это необходимо для сохранения временных параметров доступа к шине.
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 11 2011, 13:29
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Сделаем. Спасибо

Сообщение отредактировал Pavel_Bor - Jul 11 2011, 13:29
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016