Перейти к содержанию
    

Подскажите где искать проблему(tiny26 i2c)

Простая схемка: мега16+ds1307+tiny26 соединены по i2c. Тинка через провод ~3метра длиной.

В меге i2c реализовано из либы avrlib, а в тинке используется небезызвестная либа usitwislave.

В общем когда тинка отключена от scl/sda то все ок, часики читаются, как только подключаю тинку - все виснет.

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

 

Или может вообще по другому сделать, задача связать основной контроллер с внешними блоками, провода не длиннее 3метров.

на 485 переходить не хочу ибо удорожит схему, кто что подскажет?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На 3м городить RS485 и действительно нет смысла, можно попробовать RS232.

 

Но все же лучше разобраться с i2c, тем более он разжеван уже вдоль и поперек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите где рыть )))

 

1. Проверить наличие резисторов-подтяжек на обоих линиях шины. 4.7К должно хватить.

2. Одолжить или купить осциллограф, или просто собрать UniLogic (в крайнем случае)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подтяжки стоят

 

Нарисовал в протеусе, протестил...

Про тинку протеус пишет что logic contention(s) detected on net SCL, а SDA уходит в 0(синей точкой горит), на этом все и останавливается

библиотечку usitwislave все буржуи пользуют, никаких косяков, что можно еще проверить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

logic contention(s) detected on net SCL, а SDA уходит в 0(синей точкой горит), на этом все и останавливается

Похоже на обычное срабатывание механизма защиты от потери данных. Микросхема, которая не способна больше принимать данные, опускает SCL в ноль, тем самым препятствуя дальнейшей передаче данных мастером шины. Обработав пришедшие данные, эта микросхема отпускает SCL, и обмен возобновляется. У вас, похоже, МК принимает байт данных, место у него в приемном буфере (регистре) заканчивается, вот он и опускает SCL. И не отпускает никогда, поскольку ваша программа (обработчик прерывания) не вычитывает буфер или просто не вызывается ...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нарисовал в протеусе, протестил...

В том же в Proteus'е есть i2c-тестер, разберитесь с его работой, подключите к линиям и посмотрите какие данные идут и в каком месте "затык" происходит.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот файлы, протеус 7.7

slave скомпилирован для тинки26, но в протеусе ее нет, пробовал компилировать и для 261 и для 2313 результат тот же

в master используются либы из avrlib, их я естественно не приаттачил

i2c.rar

Изменено пользователем AlexTech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем нашел какой то кусок кода который заработал в протеусе при частоте тинки только 8мгц, при этом программных задержек нет, крутить нечего

теперь беда в том, что в железе тинка не заводится от внутреннего генератора на 8мгц, даже на 2 дурит, работает только на 1

это с камнем у меня косяк или можно как то побороть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем нашел какой то кусок кода который заработал в протеусе при частоте тинки только 8мгц, при этом программных задержек нет, крутить нечего

теперь беда в том, что в железе тинка не заводится от внутреннего генератора на 8мгц, даже на 2 дурит, работает только на 1

это с камнем у меня косяк или можно как то побороть?

Чисто случайно про FUSE-биты не забыли при программировании чипа?

Проблем с внутренним генератором быть не должно.

 

PS. Вечером гляну Ваш архив, пока времени нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не наю ))

шью из студии:

SPI enable

IntRCost, Freq 8mhz

startup 64ms + 6ck(причем в списке два таких пункта, выбираю первый)

no bod

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прогресс моих мучений дошел до того, что я устойчиво отправляю и принимаю 1 первый байт, не более

хотя код отправки выглядит так:

messageBuf[0] = (targetAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT);

messageBuf[1] = 0x41;

messageBuf[2] = 0x43;

messageBuf[3] = 0x10;

messageBuf[4] = 0x02;

TWI_Start_Transceiver_With_Data( messageBuf, 5 );

Соответственно как отловить, слейв ack не отправляет после приема байта или мастер его не видит?

Код либы просмотрел, из того что понял вроде все честно, как проверять не пойму (((

Изменено пользователем AlexTech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Соответственно как отловить, слейв ack не отправляет после приема байта или мастер его не видит?
Напоминаю, что интерфейс I2C - синхронный. Если нет осциллографа, то сделайте частоту тактирования SCL, скажем, 1Гц. И посмотрите состояния шины тестером или парой светодиодов.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как проверять не пойму (((

 

Unilogic соберите, еще раз. Там работы на пару часов. Зато получится цифровой мини-осциллограф, подключаемый к LPT - порту. А еще можно не использовать шут знает чьи и шут знает как работающие библиотеки там, где без них можно обойтись, а взять аппноты от Атмела, даташит, самому разобраться и все сделать за пару дней. Вы хоть будете понимать, что вообще делаете ...

P.S. Лично я стараюсь никогда не использовать в своих проектах библиотек и прочих фрагментов, если не понимаю, как они работают ...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Угу, согласен с аппнотами

На мастере работает AVR315 - TWI Master Implementation

На слейве AVR312: Using the USI Module as an I2C slave

Ну и че мне с аппнотов если они написаны в 2004г и вполне вероятно на свежих камнях работают не совсем корректно.

С кодом разобрался в меру своих возможностей, все вроде правильно, только не работает ))))

 

LPT уменя нету, но это так... к слову

 

А еще я не понимаю почему _delay_ms(3000) дает задержку меньше секунды :/

Изменено пользователем AlexTech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще я не понимаю почему _delay_ms(3000) дает задержку меньше секунды :/

 

А это потому, что у вас, скорее всего, Fuses неправильно запрограммированы.

P.S. Если вы занимаетесь электроникой, без приборов все равно не обойтись. Нет осциллографа, нет LPT ... Без приборов и элементарных измерений говорить вообще не о чем ...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...