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

DS1307 используя аппаратный I2C

Сб янв 02, 2010 03:24:30

Насколько понял, все рассмотреные на этом сайте примеры используют програмно-реализованный I2C интерфейс. Меня интересует решение,использующее аппаратные средства микроконтроллера.
Хотелось бы увидеть готовые примеры для CodeVisionAVR. Использую mega32

Сб янв 02, 2010 10:01:17

Не все.

Просто аппаратный I2C (правильно называть TWI) не работает в Протеусе, а каждому хочется увидеть, что он планирует собирать, и по сему от TWI уходят.

Да и длина кода в обоих случаях примерно одинакова.

Сб янв 02, 2010 14:35:36

Danko писал(а):Не все.

какой конкретно пример?

Danko писал(а):Просто аппаратный I2C (правильно называть TWI) не работает в Протеусе, а каждому хочется увидеть, что он планирует собирать, и по сему от TWI уходят.

складывается впечатление, что Протеус для многих- самоцель.

Danko писал(а):Да и длина кода в обоих случаях примерно одинакова.

на длинну фиолетово. Есть более значимые ресурсы, как то- время исполнения- это раз. На время исполнения програмного I2C отключаются прерывания, потом сиди,гадай,какое,когда и в какой последовательности пришло на время отключения-вот и потеряли данные.

еще раз- пожалуйста,примеры, если таковые имеются )

Сб янв 02, 2010 16:17:22

Могу предложить на АСМе.

Сб янв 02, 2010 19:11:19

Merzavec писал(а):На время исполнения програмного I2C отключаются прерывания

Зачем? Это синхронный интерфейс, задержки в нем вполне допустимы.
Программный I2C часто используется из за свободы выбора пинов контроллера. Для удобства разводки платы например.

Re: DS1307 используя аппаратный I2C

Вт июн 29, 2010 00:59:16

Merzavec писал(а):Насколько понял, все рассмотреные на этом сайте примеры используют програмно-реализованный I2C интерфейс. Меня интересует решение,использующее аппаратные средства микроконтроллера.
Хотелось бы увидеть готовые примеры для CodeVisionAVR. Использую mega32

Если нашли примеры то поделитесь. Хочу на апаратный I2C DS1307 повесить.

Re: DS1307 используя аппаратный I2C

Вт июн 29, 2010 16:47:57

Рабочая библиотека. Работает и в железе и в Протеусе.

Я ранее писал, что в Протеусе аппаратный TWI не работает.

Совершенно верно. Не работает в Протеусе v7.6SP4, а Протуесе v7.7SP2 работает.
Вложения
ds1307_twi.zip
проверено в WinAVR, в CVAVR, в железе (мега8), в Протеусе 7.7SP2
(1.15 KiB) Скачиваний: 998
Последний раз редактировалось Danko Ср июн 30, 2010 16:09:12, всего редактировалось 2 раз(а).

Re: DS1307 используя аппаратный I2C

Вт июн 29, 2010 21:15:03

Danko писал(а):Рабочая библиотека. Работает и в железе и в Протеусе.

Я ранее писал, что в Протеусе аппаратный TWI не работает.

Совершенно верно. Не работает в Протеусе v7.6SP4, а Протуесе v7.7SP2 работает.

Расскажите плиз в кратце как ею пользоваться для mega16.

Re: DS1307 используя аппаратный I2C

Ср июн 30, 2010 09:11:23

Нужен живой пример пожалуйста:
Код:
unsigned char myhour, mymin, mysec;    // текушее время в двоично-десятичном исчислении
unsigned char mydate, mymonth, myyear; // текущий календарь в двоично-десятичном исчислении

rtc_get_time(&myhour, &mymin, &mysec); //  читаем из DS-ки время
rtc_get_date(&mydate, &mymonth, &myyear); //  читаем из DS-ки календарь

rtc_set_time(myhour, mymin, mysec); //  пишем в DS-ку время
rtc_set_date(mydate, mymonth, myyear); // пишем в DS-ку календарь
не забудьте что в DS1307 не двоичный, а двоично-десятичный счетчик

если нужно записать что-то в память DS1307 то
Код:
rtc_write(АДРЕС, ДАННЫЕ);

если прочесть то
Код:
tmp = rtc_read(АДРЕС);

в принципе и все. Как инициализировать в мега16 TWI я думаю разберетесь сами.

Re: DS1307 используя аппаратный I2C

Ср июн 30, 2010 15:31:43

Danko писал(а):Нужен живой пример пожалуйста:

A остальные функции из библиотеки: twi_start, twi_stop, twi_write, twi_read, rtc_init мне не нужны? Извините за назойливость :oops: я ещо только учусь. Сегодня вечером буду пробовать.

Re: DS1307 используя аппаратный I2C

Ср июн 30, 2010 16:02:44

twi_start, twi_stop, twi_write, twi_read - нет.

А если более точно то да т.е. они нужны, но только Вы напрямую к ним обращаться не будете.

rtc_init - да. Функция инициализации DS1307.

В сети есть даташник на DS1307 на русском. Почитайте про биты rs, sqwe, out.

Если 7 ножка DS1307 у Вас не используется то инициализация будет выглядеть так:
Код:
rtc_init(0, 0, 0);

Re: DS1307 используя аппаратный I2C

Ср июн 30, 2010 20:15:00

Danko писал(а):twi_start, twi_stop, twi_write, twi_read - нет.

А если более точно то да т.е. они нужны, но только Вы напрямую к ним обращаться не будете.

rtc_init - да. Функция инициализации DS1307.

В сети есть даташник на DS1307 на русском. Почитайте про биты rs, sqwe, out.

Если 7 ножка DS1307 у Вас не используется то инициализация будет выглядеть так:
Код:
rtc_init(0, 0, 0);

Начитался даташитов - с этим вроде понятно. Непонятно как по даной формуле посчитать частоту SCL http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh128/18_3.htm частоту брать в герцах? значение регистров брать в десятичной системе исчисления я так понимаю? Частоту нужно выставить точно 100кГц?

Re: DS1307 используя аппаратный I2C

Чт июл 01, 2010 20:08:18

Apparatchik, у Вас два пути: правильный и простой.

правильный это выставить значения TWI-регистров по формуле из даташника,

а простой: в кодегенераторе CVAVR выставить галочки и получить готовый код.

Выбирать Вам.

Re: DS1307 используя аппаратный I2C

Чт июл 01, 2010 21:00:55

Вот я хочу правильный, тоесть хочу разобратся как считать по формуле см. пост выше. Пока выставил как в вашом примере на мега8 - в протеусе работает.

Функцией rtc_get_time время у меня получается читать, а могу ли я прочитать например только минуты так: min=rtc_read(0x01)? Что-то не выходит, ведь если теперь min сдвинуть вправо на 4 то получим десятки минут, а если убрать первые четыре бита то еденицы минут.

Re: DS1307 используя аппаратный I2C

Чт июл 01, 2010 21:37:51

Apparatchik писал(а):Функцией rtc_get_time время у меня получается читать, а могу ли я прочитать например только минуты так: min=rtc_read(0x01)? Что-то не выходит, ведь если теперь min сдвинуть вправо на 4 то получим десятки минут, а если убрать первые четыре бита то еденицы минут.

Всё получилось!!! Остаётся вопрос про формулу.

P.S. Можно ли обращатся к отдельным битам например регистра минут и как?

Re: DS1307 используя аппаратный I2C

Вт июл 06, 2010 18:07:00

Могу я как-то мешать ходу часов? Иногда ход секунд замирает на 2-3 секунды и идёт дальше (это на реальном железе). Если бы контроллер тормозил, то при следуйщем опросе время бы виравнивалось, а оно так и отстаёт на время замирания значит тормозит RTC.
Выноваты помехи или частота или что-то другое?

Re: DS1307 используя аппаратный I2C

Вт июл 06, 2010 18:26:40

скорее всего глючит сама DS1307.

Если есть возможность то проверь на другой МС.

У меня из 10 приобретенных DS1307 одна глючная попалась. Работает работает а потом не с того ни с сего часы начинают перескакивать, могут досчитать до 50 и более часов при этом минуты идут минута в минуту

Apparatchik писал(а):Можно ли обращаться к отдельным битам например регистра минут и как?
информация считывается побайтно. Считал байт и делай с ним что хочешь.

Re: DS1307 используя аппаратный I2C

Вт июл 06, 2010 18:39:09

Danko писал(а):скорее всего глючит сама DS1307.

Если есть возможность то проверь на другой МС.

Блин а я её впаял намертво :(

Re: DS1307 используя аппаратный I2C

Чт июл 08, 2010 00:54:10

А вот это зря, у меня ещё со времён "спектрумов" чёткая привычка все микрухи ставить на панельки...

Re: DS1307 используя аппаратный I2C

Чт июл 08, 2010 05:44:22

Библиотека работы с TWI на WinAVR
Вложения
i2c.rar
(6.45 KiB) Скачиваний: 592
Ответить