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

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

Вт ноя 15, 2011 20:06:02

*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-

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

Чт ноя 17, 2011 21:03:48

Я в асме полный 0.

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

Вт окт 23, 2012 11:14:24

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

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


Скорее всего шина виснет т.к. индикация просто останавливается т.е. значения не меняются. Значит динамика отрабатывает.
А как можно исправить чтобы не через WHILE при работе с шиной?

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

Вт окт 23, 2012 12:26:55

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

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

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

Вт окт 23, 2012 17:22:30

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

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

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

Вт окт 23, 2012 23:40:53

Это по науке. В свое время для быстроты запуска, т.к. по науке лень было разбиратся, я запилил стандартные функции из даташита вот с такими изменениями.
В теле каждого
Код:
while (!(TWCR & (1<<TWINT)))
прописать эту конструкцию и определить переменную к
Код:
        k++;
        if (k==1000)
            return;
И в теле где получаем данные с микрушки сделать проверку на получаемые данные типа такого
Код:
if (tmp==0xff){
   twi_stop();
   return 0; }
После этого можно сразу запускать новую передачу.
Такая же проблема у меня возникала в симуляторе когда я делал свои первые часы. Эти доработки позволили от зависаний избавится. Но вам же я советую сразу сделать как надо и применить систему кодов состояний со ссылки выше постом.

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

Ср окт 24, 2012 08:03:44

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

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

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

З.Ы. тему создавал ранее
viewtopic.php?f=20&t=79390

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

Ср окт 24, 2012 12:27:21

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

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

Ср окт 24, 2012 15:22:59

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

схема стандартная, подтяжки SDA, SCL через 4.7 к на +5 в. Паралльельно питанию кондер 0.1 мкф. Скорость шины 100 КГц.Код могу выложить, ведь в машине и частично в квартире часы работают исправно

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

Ср окт 24, 2012 17:53:10

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

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

Что там в итоге с питанием, прямая или не очень?

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

Ср окт 24, 2012 17:55:11

Давайте посмотрим код.

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

Чт окт 25, 2012 07:47:47

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

Пожалуй ограничусь WDT, а то переделывать код из статьи пока желания нет. Разбираться нужно, тяжко это непрограммистам.

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

Вт дек 04, 2012 21:01:24

обясните пожалуйста ПРОСТЫМ языком: чем програмный I2C отличается от аппаратного TWI ?

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

Вт дек 04, 2012 21:19:57

программном i2c ты пишешь "...выставить на ноге 5, лог."1"..." подразумевая например бит передаваемых данных или тактовый импульс, таким образом передавая данные согласно протоколу.
в аппартном i2c(почти TWI, но не совсем) ты просто записываешь регистр данных, которые нужно отправить и даешь команду "старт", аппаратный i2c уже сам дергает ножками после команды. тебе можно занять контроллер чем-то другим.

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

Вт дек 04, 2012 21:32:26

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

а можно вот сдесь чуток разяснить поглубже ?
раньше, для себя, я понимал так, что аппаратный должен как-бы работать "независимо" от основной проги......, ведь на то он и аппаратный, а потом я заметил что и в одном и во втором случае мы подключаем библиотеки где есть сишные файлы, а это уже как-бы выходит за рамки моего понимания.
уж очень хочется нащупать разницу :))

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

Вт дек 04, 2012 22:26:26

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

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

Вт дек 04, 2012 22:44:17

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

разного рода ф-ции: старт, стоп и тому подобное
вот для меня и непонятка как это аппаратный может использовать програмный код, когда он должен быть жостко реализован на железе(транзисторы и т.п.)
надеюсь ясно изложился ?

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

Вт дек 04, 2012 23:29:25

:facepalm: файлы, это только средство. Сами же говорите, таймер нужно конфигурировать, так же нужно конфигурировать любой аппаратный модуль. Просто функции конфигурации вынесены в отдельный файл.
А то что при работе с таймером Атмега не подключется сишный файл - не правило. Посмотрите библиотеки STM или LPC, увидите там файл с функциями для работы с таймером.
вот для меня и непонятка как это аппаратный может использовать програмный код, когда он должен быть жостко реализован на железе
Вы думаете в аппартном модуле сидят маленькие гномики-телепаты, которые определяют что именно в данный момент нужно сделать?
протокол i2c содержит кучу состояний в которых может находится приемо/передатчик, что подразумевает под собой кучу команд, которые понимает модуль
    старт

    ACK

    повторный старт

    стоп
.... да что я рассказываю.
Если Вы читали бы даташит на модуль TWI AVR, таких вопросов не возникало бы.
Очередной халявщик.
надеюсь ясно изложился ?
Не хамите.

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

Ср дек 05, 2012 20:07:15

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

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

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

Ср дек 05, 2012 20:14:47

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