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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

*Trigger* писал(а):Надо глянуть, что в библиотеке.

Код: Выделить всё

/*
  CodeVisionAVR C Compiler
  (C) 1998-2007 Pavel Haiduc, HP InfoTech S.R.L.

  BCD conversion functions
*/

#pragma asm_function+

unsigned char bcd2bin(unsigned char n)
{
#asm
    ld   r30,y
    swap r30
    andi r30,0xf
    mov  r26,r30
    lsl  r26
    lsl  r26
    add  r30,r26
    lsl  r30
    ld   r26,y+
    andi r26,0xf
    add  r30,r26
    ret
#endasm
}

unsigned char bin2bcd(unsigned char n)
{
#asm
    ld   r26,y+
    clr  r30
bin2bcd0:
    subi r26,10
    brmi bin2bcd1
    subi r30,-16
    rjmp bin2bcd0
bin2bcd1:
    subi r26,-10
    add  r30,r26
    ret
#endasm
}

#pragma asm_function-
«И всё-таки она вертится!»
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

Я в асме полный 0.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
crazzian
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 10, 2012 07:11:04

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

Сообщение crazzian »

Проблема.
Перевел DS на TWI частота 10,4кГц. Иногда индикация останавливается, на кнопки не реагирует. То ли контроллер виснет, то ли шина. После сброса(выключения питания) все работает.
У кого-нибудь было что-то подобное?

Волосатый писал(а):Возможно и виснет шина. Просмотрел код с приведенной ссылки, там везде где ждем установки бита готовности шины, там стоит тупой while что не есть хорошо. Если этот бит не будет установлен, программа так и будет там висеть. Но. Замирание индикации (правильно я вас понял, что на динамике начинает гореть только один индикатор?) можно объяснить только тем что этот while у вас висит в прерывании, и прерывание индикации по таймеру не срабатывает. Как этого избежать, добавить во все while цикл for со счетчиком и по совпадению делать оператор brake, что выкинет из последнего while. Но потом скорее всего придется переинициализировать шину.


Скорее всего шина виснет т.к. индикация просто останавливается т.е. значения не меняются. Значит динамика отрабатывает.
А как можно исправить чтобы не через WHILE при работе с шиной?
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

Чтобы восстановить работу шины, можно со стороны мастера отключить аппаратную TWI, затем программно подрыгать с не большой скоростью (импульсов 8 можно и больше), тактовой ножкой шины, Пере инициализируем шину запускаем опрос по новой. Для контроля за работой шины можно использовать обработчик прерывания таймера.
crazzian писал(а):А как можно исправить чтобы не через WHILE при работе с шиной?

Разбираться с событиями на шине в обработчике прерывания TWI.

Код: Выделить всё

void IRQ_TWI(void){
   switch(TWSR){      // Стадия работы TWI.
      case 0x40:      // Адрес прошел. Пришла квитанция.
                case ...  и тд

Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

crazzian писал(а):А как можно исправить чтобы не через WHILE при работе с шиной?

Нужно ждать ответа не в цикле, а писать что то типа такого. Также как вариант удобно использовать сторожевой таймер если зависоны не частые, то зброс почти не заметен.
«И всё-таки она вертится!»
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

Это по науке. В свое время для быстроты запуска, т.к. по науке лень было разбиратся, я запилил стандартные функции из даташита вот с такими изменениями.
В теле каждого

Код: Выделить всё

while (!(TWCR & (1<<TWINT)))
прописать эту конструкцию и определить переменную к

Код: Выделить всё

        k++;
        if (k==1000)
            return;
И в теле где получаем данные с микрушки сделать проверку на получаемые данные типа такого

Код: Выделить всё

if (tmp==0xff){
   twi_stop();
   return 0; }
После этого можно сразу запускать новую передачу.
Такая же проблема у меня возникала в симуляторе когда я делал свои первые часы. Эти доработки позволили от зависаний избавится. Но вам же я советую сразу сделать как надо и применить систему кодов состояний со ссылки выше постом.
Опыт приходит сразу после того, как он был нужен...
dreamernf
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт мар 29, 2012 13:07:27

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

Сообщение dreamernf »

Народ хелп. Собираю девайс для авто, типа Бортового компа. Делал работу поэтапно, сначала один блок, потом второй и тд. Дошел до подключения часов на DS1307. Сделал платку отдельную, развел как надо, учитывая землю под кварцем. Подключил к аппаратному TWI. Написал прогу и понеслась. Часы запускались, то остонавливались, на дисплее (HD44780) выдалавалсь фигня вместо нужных цифр...Начал думал. Переделал прогу - толку 0, заменил кварц (думал перегрел при пайке), еще раз все пропаял, промыл от флюса - толку 0. Заменил тактирующий кварц МК, сам МК - опять тоже самое. Достал осциллограф - сигналы (SDA, SCL) шли. Потом меня осенило, пошел с макеткой в машину и там запитал от 12 В и о чудо!!! все заработало как надо. Вот теперь думаю - что за источник помех у меня дома, что от них шина i2c сходит с ума и как с этим бороться?
всем заранее спасибо за советы

UP:
проблема не исчезла... перепробовал 3 блока питания (два адаптера + блок от компа) Везде глюки. Глюки исчезают если питать устройство в ванной (хотя там работает, но стоит девайс переместить на полметра - сраз глючит) стабильно работает вне квартиры. Т.е. в машине например. Дома из источников сильных могут быть - кабель и электроплита им подключенная (на момент тестов плита была выключена, роутер с вайфаем (включен всегда). Народ, подскажите как можно осциллографом посмотреть, какие искажения могут быть на шине i2c.

Жду мыслей и идей что делать(

З.Ы. тему создавал ранее
viewtopic.php?f=20&t=79390
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

Выводы шины (SDA, SCL) подтянуты к + питания через резисторы 5-10к? Может скорость шины высокая. Там ни схемы ни исходного кода.
dreamernf
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт мар 29, 2012 13:07:27

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

Сообщение dreamernf »

phanis писал(а):Выводы шины (SDA, SCL) подтянуты к + питания через резисторы 5-10к? Может скорость шины высокая. Там ни схемы ни исходного кода.

схема стандартная, подтяжки SDA, SCL через 4.7 к на +5 в. Паралльельно питанию кондер 0.1 мкф. Скорость шины 100 КГц.Код могу выложить, ведь в машине и частично в квартире часы работают исправно
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

кондер 0.1 мкф,
не мало. Вроде уже как вам советовали с питанием поработать
Pika4u писал(а):Хм, а если попробовать поставить перед LM кондер этак на 4000 мкФ и после KM-на 100нФ?

pyzhman писал(а):Для начала тыкнуть осциллом на шину питания +5в. Порой там такое творится!

Что там в итоге с питанием, прямая или не очень?
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Давайте посмотрим код.
«И всё-таки она вертится!»
crazzian
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 10, 2012 07:11:04

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

Сообщение crazzian »

Apparatchik писал(а):Нужно ждать ответа не в цикле, а писать что то типа такого. Также как вариант удобно использовать сторожевой таймер если зависоны не частые, то зброс почти не заметен.

Пожалуй ограничусь WDT, а то переделывать код из статьи пока желания нет. Разбираться нужно, тяжко это непрограммистам.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

обясните пожалуйста ПРОСТЫМ языком: чем програмный I2C отличается от аппаратного TWI ?
Tell Me The Truth
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

программном i2c ты пишешь "...выставить на ноге 5, лог."1"..." подразумевая например бит передаваемых данных или тактовый импульс, таким образом передавая данные согласно протоколу.
в аппартном i2c(почти TWI, но не совсем) ты просто записываешь регистр данных, которые нужно отправить и даешь команду "старт", аппаратный i2c уже сам дергает ножками после команды. тебе можно занять контроллер чем-то другим.
Ставим плюсы: )
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

ibiza11 писал(а):(почти TWI, но не совсем)

а можно вот сдесь чуток разяснить поглубже ?
раньше, для себя, я понимал так, что аппаратный должен как-бы работать "независимо" от основной проги......, ведь на то он и аппаратный, а потом я заметил что и в одном и во втором случае мы подключаем библиотеки где есть сишные файлы, а это уже как-бы выходит за рамки моего понимания.
уж очень хочется нащупать разницу :))
Tell Me The Truth
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

а можно вот сдесь чуток разяснить поглубже ?
это уже вопрос "чем отличается TWI от i2c?" тут в даташит AVR и стандарт i2c Вас отсылаю.
я заметил что и в одном и во втором случае мы подключаем библиотеки где есть сишные файлы
Странный вопрос. А что мешает аппаратному модулю работать "независимо" от основной проги, в случае подключения Сишных файлов?)))) Сам факт подключения файлов мешает?))))) Вы хоть посмотрели, что в этих файлах?))))
Никто не мешает ничего не подключать и писать все ручками в одном файле. Просто в этом всем потом будет сложно разобраться.
Основной алгоритм нужно писать по возможности платформонезависимым, а все платформозависимое выносить в отдельные файлы.
Написали Вы к примеру реализацию очень сложного протокола информационного обмена верхнего уровня, используя при этом функции:
void send_byte(byte);
uint8_t get_byte();
использующие программный ногодрыг, притворяющийся i2c (программный i2c)
Этой программе неважно, как эти функции реализованы, функции описаны в другом файле.
Так вот, если изменятся исходные условия задачи, например нужно реализовать не программный i2c, а аппаратный. В этом случае просто подключаются другие одноименные функции для работы с аппаратным i2c (или любым другим протоколом: SPI, UART, и т.д....), а не переписывается вся программа.
Ставим плюсы: )
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

ibiza11 писал(а):Странный вопрос.
да почему же он странный, вполне логичный.
в моем понимании аппаратный это как, например, реализован таймер Т0 в Atmege8
мы же там не подключаем никаких сишных файлов......, мы просто его конфигурируем и все....., вуаля....., он идет в свободное плавание....., тикает он сам посебе, не задействовав при этом никаой програмной части для своей работы, а прога крутится сама по себе....., дает он нам только прерывания
ibiza11 писал(а):Вы хоть посмотрели, что в этих файлах?))))

разного рода ф-ции: старт, стоп и тому подобное
вот для меня и непонятка как это аппаратный может использовать програмный код, когда он должен быть жостко реализован на железе(транзисторы и т.п.)
надеюсь ясно изложился ?
Tell Me The Truth
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

:facepalm: файлы, это только средство. Сами же говорите, таймер нужно конфигурировать, так же нужно конфигурировать любой аппаратный модуль. Просто функции конфигурации вынесены в отдельный файл.
А то что при работе с таймером Атмега не подключется сишный файл - не правило. Посмотрите библиотеки STM или LPC, увидите там файл с функциями для работы с таймером.
вот для меня и непонятка как это аппаратный может использовать програмный код, когда он должен быть жостко реализован на железе
Вы думаете в аппартном модуле сидят маленькие гномики-телепаты, которые определяют что именно в данный момент нужно сделать?
протокол i2c содержит кучу состояний в которых может находится приемо/передатчик, что подразумевает под собой кучу команд, которые понимает модуль
    старт
    ACK
    повторный старт
    стоп
.... да что я рассказываю.
Если Вы читали бы даташит на модуль TWI AVR, таких вопросов не возникало бы.
Очередной халявщик.
надеюсь ясно изложился ?
Не хамите.
Ставим плюсы: )
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

FreshMan писал(а):в моем понимании аппаратный это как, например, реализован таймер Т0 в Atmege8
мы же там не подключаем никаких сишных файлов......, мы просто его конфигурируем и все.....,

А кто мешает эту самую конфигурацию написать в другом файле и подключить его? это раз, сконфигурирова его раз и больше нетрогать, это разве что в часах, а вот если например яркость регулировать или обороты двигателя - постоянно нужно менять значение регистра совпадения, выходит мы всеже вмешиваемся, но таймер не перестает быть аппаратным!
«И всё-таки она вертится!»
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Apparatchik писал(а): но таймер не перестает быть аппаратным!
но ведь таймер не юзает всякие сишные файлы, он не использует функции типа старт, стоп....., мы его рас сконфигурировали и он ПАШЕТ :))
Tell Me The Truth
Ответить

Вернуться в «Периферия»