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

 
 
19 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> Проблема с TWI
James D.
сообщение Nov 11 2005, 19:24
Сообщение #61


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Дело привычки. На асме пишется легко, и код меньше, чем на Си. У меня м32 уже заполнена на 3/4, а еще надо кое-что сделать, да вот застопорило на TWI. Прямо беда. Какой вариант решения не выберу - как в глухую стену упираюсь!
Кстати, не посоветуете ли, где можно скачать книгу или что-нибудь про обучение программированию на С именно для AVR контроллеров - желательно, конечно, на русском. А то книга, которую я нашел, куда-то не туда уводит. Конечно, азы я оттуда, наверное, почерпну, а вот дальше...
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 14 2005, 13:10
Сообщение #62


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Вопрос.
Каждый раз, при необходимости что-либо передать, мастер м32 производит установку скорости:

ldi temp,$00 ;Установка скорости передачи= 100 kHz
out TWSR,temp
ldi temp,12
out TWBR,temp


это надо делать каждый раз, или только один - при инициализации контроллера?

Далее.
После передачи команды "START", мастер получает код $08, дальше идет загрузка адреса слэйв м16:

ldi temp,$04 ;Загрузка адреса слэйв м16 + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp


после этого идет цикл ожидания:

wait2r: in temp,TWCR ;Ожидаем ответа от слэйв м16
sbrs temp,TWINT
rjmp wait2r


и все на этом зацикливается. Как тут быть?

И еще непонятно: когда надо передавать "START", а когда "Повторный START", и чем они отличаются?
Напомню: мастер на шине один, он обращается в произвольном порядке к двум подчиненным.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 14 2005, 14:11
Сообщение #63


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Получается так, что передача с мастера м32 на слэйв м32 проходит только если мастер задает "Повторный START".
А на слэйв м16 можно давать "START", эта операция проходит нормально.
По-моему я запутался окончательно... wacko.gif

P.S. Должен ли мастером, после каждого сеанса связи, выдаваться сигнал "STOP"?
Касаемо, конечно же, рассматриваемой ситуации.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2005, 08:17
Сообщение #64


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(James D. @ Nov 14 2005, 16:11) *
... Должен ли мастером, после каждого сеанса связи, выдаваться сигнал "STOP"?
Касаемо, конечно же, рассматриваемой ситуации.

Должен касаемо любой ситуации, но ждать окончания выполнения этой операции не нужно (зависнет пожизнено)!!!
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 16 2005, 15:40
Сообщение #65


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



При передаче с мастера м32 на слэйв м32 я поубирал команды STOP у обоих МК - работает, как ни в чем не бывало!
А с м16 полный ступор. И со STOP'ом и без оного...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2005, 16:51
Сообщение #66


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(James D. @ Nov 16 2005, 17:40) *
При передаче с мастера м32 на слэйв м32 я поубирал команды STOP у обоих МК - работает, как ни в чем не бывало!
А с м16 полный ступор. И со STOP'ом и без оного...

Трюкачеством можно заниматься сколько угодно.
И в некоторых случаях это даже срабатывает.
Но если хочется, чтобы работало ПРАВИЛЬНО и ВСЕГДА, то желательно в точности соблюсти требования спецификации на интерфейс, особенности его реализации на конкретном МК и, в конце концов, определиться - чего же мы хотим получить в результате (может мы хотим того, чего нельзя хотеть?).
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 16 2005, 19:32
Сообщение #67


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Я хочу, очень хочу, чтобы все работало ПРАВИЛЬНО и ВСЕГДА!
Вы мне лучше скажите, требования спецификации на интерфейс для разных МК отличаются?
А насчет того, что "может мы хотим того, чего нельзя хотеть?" - я хочу переслать данные с м32 на м16, и они таки пересылаются, но, если перед этим не передавать данные на другую м32.
Все подробно описано в этой теме.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 17 2005, 07:51
Сообщение #68


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(James D. @ Nov 16 2005, 21:32) *
...требования спецификации на интерфейс для разных МК отличаются?

Нет, не отличаются.
Цитата
...я хочу переслать данные с м32 на м16, и они таки пересылаются, но, если перед этим не передавать данные на другую м32...

У меня была похожая ситуация пока я не стал обрабатывать все Status Codes касающиеся режимов Slave Receiver и Slave Transmitter а также приводить интерфейс в исходное состояние (буферы, указатели ...) по приёму STOP или repeated START, а также отслеживать состояния ошибок.
Ещё надо следить кто и когда должен выставлять ACK.

И ещё вдобавок. Поскольку интерфейс синхронный, то он может работать на предельно низких скоростях вплоть до дёргания ножек руками и слежения что и когда происходит.

PS: у меня с TWI работают mega128, mega32, mega16, mega8 (программный модуль один и тот же, основа которого взята из описания).
Go to the top of the page
 
+Quote Post
_artem_
сообщение Nov 17 2005, 10:30
Сообщение #69


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Может вам интересно будет - послал мeйл Атмелу насчет TWI slave polled mode. Сначала ответили примером из AN который на сайте . После этого обьяснил им что хочу polled а не interrupted ,
ответили что не рекомендуем, а если хочешь разрабатывай сам. Ну а я им - обьясните почему не рекомендуете.

Вот жду ответ на этот вопрос . Надеюсь они будут честно настолько чтобы признать ошибку в дизайне микрухи.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 17 2005, 21:33
Сообщение #70


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



IgorKossak, я был бы вам безмерно благодарен, если бы вы привели здесь пример программок приема-передачи, желательно на асме, потому как на С я ничего не пойму... Только начал изучать, поэтому пока я в С ни бум-бум.
Как правильно приводить интерфейс в исходное состояние (буферы, указатели ...) по приёму STOP или repeated START, а также отслеживать состояния ошибок? И ACK, с этим тоже непонятки.
Но у меня бывает, что зацикливается здесь:

wait2r: in temp,TWCR ;Ожидаем ответа от слэйв м16
sbrs temp,TWINT
rjmp wait2r


и мастер, и слэйв могут зациклится на этом этапе. Как тут отследить состояние ошибок?
И еще. TWI у меня работает не по своим прерываниям: прога мастера м32 находится в обработчике прерыв. по переполнению таймера, а слэйв м16 вообще не в обработчике прерывания, а в состоянии постоянного ожидания - зациклено и все. Т.е. принял данные, поместил их в регистры, и ждет нового вызова. Хотя тут, наверное, можно и по прерыванию TWI сделать - знать бы как!

Артем, мне тоже было бы интересно узнать их ответ, но вряд ли он будет. Сомневаюсь я. Называется - ломайте головы сами.

P.S. Что-то давненько beer_warrior не заглядывает. Жалко, так хорошо сидели... smile.gif

Сообщение отредактировал James D. - Nov 17 2005, 21:34
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 18 2005, 09:00
Сообщение #71


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Уважаемый James D., с ассемблером я сталкиваюсь только когра просматриваю листинги.
Пишу я на EC++, да ещё и в контексте операционной системы, да ещё и только по прерываниям, так что мои тексты Вам врядли помогут.
Тем не менее, если Вам удастся выдавать байты от мастера в слейв пошагово с анализом байта состояния слейва, то Вы и сами сможете найти ошибку.
Рекомендую протестировать сначала всю связку в простейшем случае, когда больше ничего другого система не делает.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 18 2005, 19:41
Сообщение #72


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



У меня на всех трех МК (м16 и два м32) стоят кварцы по 4 MHz.
Фузы прошиты так, как показано ниже:

Fuse Bit(s):
CKSEL0=1
CKSEL1=1
CKSEL2=1
CKSEL3=1
SUT0=1
SUT1=1
BODEN=0
BODLEVEL=0
BOOTRST=1
BOOTSZ0=1
BOOTSZ1=1
EESAVE=1
CKOPT=0
JTAGEN=1
OCDEN=1

правильно ли это? Может надо прошить для 4 MHz?
Неиспользуемые пины всех МК надо ли настраивать на вывод, и устанавливать в "0"? Или подтягивать внутренними резисторами к +5V? Типа, чтобы не болтались в воздухе? Надо ли как-то настраивать пины, которые использует TWI (PC0, PC1)?
Может быть, после всего этого заработает, наконец, TWI?
Сейчас у меня нет доступа к МК, чтобы проверить, поэтому и спрашиваю.

P.S. Еще такой вопрос. Каждый сеанс связи мастера со слэйвом надо заканчивать просто подавая команду STOP? Надо ли обнулять бит TWEN?
А передачу на другой МК надо начинать со START или Повторный START? Мастер на шине один.
Установку скорости передачи (она одна для обоих слэйвов) надо производить каждый раз при начале передачи, или можно ее установить один раз при включении МК?
В режиме слэйв-приемник, адрес приемника (TWAR) устанавливать также - один раз при включении МК?

Сообщение отредактировал James D. - Nov 18 2005, 21:20
Go to the top of the page
 
+Quote Post
bbg
сообщение Nov 20 2005, 09:56
Сообщение #73


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-06-04
Пользователь №: 179



Цитата(_artem_ @ Nov 17 2005, 13:30) *
Может вам интересно будет - послал мeйл Атмелу насчет TWI slave polled mode. Сначала ответили примером из AN который на сайте . После этого обьяснил им что хочу polled а не interrupted ,
ответили что не рекомендуем, а если хочешь разрабатывай сам. Ну а я им - обьясните почему не рекомендуете.

Вот жду ответ на этот вопрос . Надеюсь они будут честно настолько чтобы признать ошибку в дизайне микрухи.


Кстати, господа, у Атмелей в аппнотах 311 и 315 БААЛЬШОЙ баг, то исть их ISR в ряде случаев не
ресетит TWINT в обработчике прерывания, что не есть гуд, ибо в даташите сказано прямо и честно,
пока выставлен TWINT, SCL шины лежит в нуле, что вообще-то, корректно. Но если вы пользуете
атмелевский код (даа, тот, который с прерываниями) и на дай Бог попали на кэйс с незарешеченным
TWINT, то можете долго любоваться шиной с заваленным SCL. Требую линчевать писавшего код
под эти аппноты индуса (не читал даташит, сцуко)! А с дизайном микрухи все ОК (это я про TWI),
разве что соображения про минвэлью в TWBR.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 13:32
Сообщение #74


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Сделал простейший случай, когда больше ничего другого система не делает.
Никаких прерываний, передача идет после инициализации стека и портов.
Мастер м32 должен передать на слэйв м32, после, сразу же, на слэйв м16. После этого все программы принудительно зависают.
Так вот, что получилось.

Мастер сначала передает на слэйв м32 - передача проходит нормально. На слэйв м16 передачи нет.
Делал так:
1. на слэйв м32 мастер подает "START" (код $08), на слэйв м16 - "START" (код $08); при передаче на слэйв м16 зацикливается на этапе загрузки адреса м16 и ожидания уст. TWINT в "1";
2. на слэйв м32 мастер подает "START" (код $08), на слэйв м16 - "Повторный START" (код $10); при передаче на слэйв м16 зацикливается на этапе проверки соответствия кода $10 (нет соответствия);
3. на слэйв м32 мастер подает "Повторный START" (код $10), на слэйв м16 - "Повторный START" (код $10); при передаче на слэйв м16 зацикливается на этапе проверки соответствия кода $10 (нет соответствия);
4. на слэйв м32 мастер подает "Повторный START" (код $10), на слэйв м16 - "START" (код $08); при передаче на слэйв м16 зацикливается на этапе загрузки адреса м16 и ожидания уст. TWINT в "1".

Теперь наоборот: мастер сначала передает на слэйв м16, потом на слэйв м32.
Делал так:
1. на слэйв м16 мастер подает "START" (код $08), на слэйв м32 - "START" (код $08); нет передачи на слэйв м16 - зацикливается на этапе проверки соответствия кода $18 (нет соответствия);
2. на слэйв м16 мастер подает "START" (код $08), на слэйв м32 - "Повторный START" (код $10); нет передачи на слэйв м16 - зацикливается на этапе проверки соответствия кода $18 (нет соответствия);
3. на слэйв м16 мастер подает "Повторный START" (код $10), на слэйв м32 - "Повторный START" (код $10); есть передача на слэйв м16; при передаче на слэйв м32 зацикливается на этапе проверки соответствия кода $10 (нет соответствия);
4. на слэйв м16 мастер подает "Повторный START" (код $10), на слэйв м32 - "START" (код $08); есть передача на слэйв м16; при передаче на слэйв м32 зацикливается на этапе загрузки адреса м32 и ожидания уст. TWINT в "1".

То есть, если передается на один МК, то на второй уже не идет. При любых вариантах.

Может быть кто-нибудь наконец сжалится надо мной, и поделится правильным кодом на асме приема-передачи??? Как это все надо делать ПРАВИЛЬНО?

Помогите! F1! HELP!! SOS!!!
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 14:24
Сообщение #75


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



James D.
ну за что ж Вы так шиты не любите. Я делал с полным анализом состояния регистра TWSR и выполнял все рекомендации согласно каждому состоянию - работает без глюков при такте 1мгц. По ссылке перевод шита меги128 . Удачи

http://gaw.ru/html.cgi/txt/doc/micros/avr/arh128/18_6.htm
Go to the top of the page
 
+Quote Post

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

 


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


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