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

 
 
> USI I2C выбор частоты
John851
сообщение May 3 2010, 15:12
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



Добрый вечер,

у меня такая проблемка: mega8 и tiny2313 соединены по I2C. У меги8 интерфейс реализован на модуле TWI (Master), а у tiny2313 на USI(Slave). Оба МК работают от внешних кварцев на 8МГц.

Сделал я небольшой протокол по которому мега 8 отсылает байт tiny2313. Он принимает этот байт и решает че делать в зависимости от него: включить или выключить светодиод на одной из ног. Программа которую я зашил в мегу должна была в бесконечном цикле отправлять сначала байт включить светодиод, ждать секунду, затем отправлять выключить светодиод, потом опять ждать секунду и тд.

Проблема состоит в том что когда я все запустил, светодиод загорался и погасал в рэндомном порядке, так как практически через раз мастер пропускал ACK, слэйв пропускал или принимал с ошибками байт от мастера (все это я наблюдал на отладочных светодиодах). Вообщем мучался я мучался часа 4, все перепробовал и вот в конце решил сменить частоту шины со 100 Кгц до 400КГц. Врезультате все заработало.

Может кто объяснить почему мне помогла смена частоты? Неужели это все из за обрезанного по возможностям USI?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 17)
Duhas
сообщение May 4 2010, 01:13
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



или из-за ужасной кривости конструкции..
Go to the top of the page
 
+Quote Post
John851
сообщение May 4 2010, 11:57
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



всмысле? USI кривое или у меня монтаж кривой? smile.gif
Go to the top of the page
 
+Quote Post
Duhas
сообщение May 4 2010, 12:54
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



я про монтаж/разводку и прочее...
Go to the top of the page
 
+Quote Post
John851
сообщение May 4 2010, 13:18
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



хм ну так то у меня все собрано на макетной плате, длина шины I2C не более 2 см(2 проводка витой пары), никакой пайки нет, так что я думаю что монтаж тут нипричем

ЗЫ модуль TWI меги работает прекрасно с термодатчиком, который тоже I2C (на любой скорости)
Go to the top of the page
 
+Quote Post
skripach
сообщение May 4 2010, 14:49
Сообщение #6


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Резисторы есть? и какие?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
John851
сообщение May 4 2010, 15:08
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



есть 10ком
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 4 2010, 15:31
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(John851 @ May 4 2010, 19:08) *
есть 10ком

Может всё таки от одного кварца оба затактировать


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
John851
сообщение May 4 2010, 15:36
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



не вижу смысла тогда в создании I2C, это сейчас они у меня на расстоянии 2 см, а если мне потребуется 15 см или более метра? я же не смогу затактировать их от одного кварца. CKPOT фьюз ксати подключал/отключал разницы нет никакой на 100Кгц
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 4 2010, 15:44
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(John851 @ May 4 2010, 19:36) *
не вижу смысла тогда в создании I2C, это сейчас они у меня на расстоянии 2 см, а если мне потребуется 15 см или более метра? я же не смогу затактировать их от одного кварца.

Понятно. Пересчёт частоты сами делаете или в теле программы?
Т.е. ldi temp,SYSCLK/(2*SCL_Freq)-8;TWI Bit Rate Register - TWBR
sts TWBR,temp ;+ Частота TWI=384 Кгц
Так автоматом , только значения подставляй


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
John851
сообщение May 4 2010, 16:13
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



доверил это дело библиотечной функции, вот ее код
Код
void i2cSetBitrate(u16 bitrateKHz)
{
    u08 bitrate_div;
    // set i2c bitrate
    // SCL freq = F_CPU/(16+2*TWBR))
    #ifdef TWPS0
        // for processors with additional bitrate division (mega128)
        // SCL freq = F_CPU/(16+2*TWBR*4^TWPS)
        // set TWPS to zero
        cbi(TWSR, TWPS0);
        cbi(TWSR, TWPS1);
    #endif
    // calculate bitrate division    
    bitrate_div = ((F_CPU/1000l)/bitrateKHz);
    if(bitrate_div >= 16)
        bitrate_div = (bitrate_div-16)/2;
    outb(TWBR, bitrate_div);
}
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 4 2010, 16:25
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(John851 @ May 4 2010, 20:13) *
доверил это дело библиотечной функции, вот ее код

к сожалению тут не помогу, но по-моему у меня короче. Только наверное надо поменять в SYSCLK/(2*SCL_Freq)-8 . SYSCLK на F_CPU и SCL_Freq на bitrateKHz т.к. они у тебя наверняка описаны, но может кто-то и использовал и там всё в порядке. А так-то твои значения для 400 = 0x02 и для 100 = 0x20 Prescaler=0 Попробуй напрямую подставить


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
John851
сообщение May 4 2010, 16:27
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



да я хотел уже было эту функцию основательно проверить, но времени пока нет на проверку
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 4 2010, 16:54
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(John851 @ May 4 2010, 20:27) *
да я хотел уже было эту функцию основательно проверить, но времени пока нет на проверку

И кстати , не смотрел DS для меги8 , но у неё точно регистр TWBR расположен в области ввода-вывода?

P.S Посмотрел , там


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение May 6 2010, 00:12
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Вы хотя бы код проложили к сообщению. А то гадать "почему не работает" сложно.
Хотя в модуле мастера TWI есть один подводный камень: Перед очередной посылкой условия "старт" нужно проверять, завершилось ли формирование на шине предыдущего условия "стоп", т.е. проверять бит TWSTO на равность "0". Так как контроллер устанавливает флаг TWINT сразу после того, как на шине началось формирование условия "стоп", не дожидаясь его завершения.
Go to the top of the page
 
+Quote Post
Арк К
сообщение May 6 2010, 05:30
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363



У меня совсем уж невероятная проблема тоже связанная с частотой тактирования TWI.

Суть в следующем:
Имеется плата: мега1281, кварц 14.7456МГц, часы DS1307, консоль RS232. SCL и SDA подтянуты как положено 4.7к, TWI-мастер организован на базе чуть подправленного AVR315.
К этой плате подключена четырьмя проводками SCL,SDA,GND,+5V (10см) ещё одна маленькая платка с tiny25 (внутр. ген. 8МГц) и светодиодиком. TWI-slave на базе бортового USI и софта AVR312. При приёме байта светодиод зажигается, либо гаснет, в зависимости от содержимого этого байта.

Tiny25 работает безукоризненно на любых частотах SCL (проверял от 90 до 400 кГц).
Часы читаются и пишутся без проблем в двух случаях: когда tiny25 отключена или (!!!) когда частота SCL > 194КГц (TWBR <= 30).
Напомню, по даташиту частота тактирования для DS1307 не должна превышать 100кГц.
Если поставить 90кГц (TWBR=70), то с часов приходят некорректные данные (причём разные). При этом тинька продолжает правильно реагировать на команды.

Это, конечно, здорово, что DS1307 работает и на бОльших частотах, однако я привык не вылазить за отведённые рамки, а по сему сильно озадачен.

Исодники прилагаю:Прикрепленный файл  twi_usi_test.zip ( 15.53 килобайт ) Кол-во скачиваний: 141
Go to the top of the page
 
+Quote Post
John851
сообщение May 6 2010, 15:34
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



я конечно могу выложить исходники, но не вижу в этом смысла, так как это библиотеки с моими небольшими доработками: на меге используется библиотека i2c из AvrLib (без с!) а на тини апликэйшен ноут от атмела, соответственно Using USI as an i2c slave
Go to the top of the page
 
+Quote Post
Арк К
сообщение May 11 2010, 07:49
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363



Как обычно, никто не в состоянии здесь сказать что-либо по моей проблеме sad.gif
Поэтому всё приходится делать самому.
Короче, поставил в tiny25 фуз, отвечающий за деление тактовой частоты на 8 и всё встало на свои места. теперь работают на 90 кГц мастера и часы и тинька.
Однако, хотя формально проблема решена, осадочек остался. ПОчему USI при тактовой частоте кристалла 8МГц допускает какие-то выверты на шине (видно по осциллоскопу), а при 1МГц - нет ??? Кто-нибудь с таким сталкивался?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 04:19
Рейтинг@Mail.ru


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