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

 
 
> 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 - 14)
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

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

 


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


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