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

 
 
19 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Проблема с TWI
James D.
сообщение Nov 4 2005, 17:14
Сообщение #1


Местный
***

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



Соединил 3 МК по TWI - Master передает данные на Slave 1, потом на Slave 2 (поочередно, друг за другом). Два из них общаются нормально (односторонняя передача от Master к Slave 1), а как только нужно передать от Master к Slave 2, один раз передача проходит и все зависает. Судя по всему, после этого не получается передать данные на Slave 1.
В конце каждой передачи Master осуществляет условие STOP
STOP: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp,
а Slave 1/2, после приема переданных байт, просто переходят к дальнейшему выполнению основной программы, т.е. никаких стоповых функций нет. Должны ли они как-то обрабатывать функцию STOP?

Можно ли в режиме "slave приемник" узнать какой адрес передал "master передатчик", т.е. к кому в данный момент он обращается? Появляется ли этот адрес в TWDR?

Как правильно обратиться к конкретному "slave приемнику", чтобы второй "slave приемник" на вызов не реагировал?
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 5 2005, 15:37
Сообщение #2


Местный
***

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



Попробовал отключать от линии приемник, к которому сейчас нет обращения:
ldi temp,(0<<TWEA)
out TWCR,temp
Все равно где-то вся эта лабуда зависает!
У меня Мастер-передатчик - mega32, первый приемник - тоже mega32, второй приемник - mega16.
Выяснил вот что: когда мастер пытается обращаться ко второму приемнику, после посылки сигнала START, они оба зацикливаются:
wait1: in temp,TWCR
sbrs temp,TWINT
rjmp wait1
дальше этого цикла ожидания у них дело не идет. То ли мастер не может START передать, то приемник не может его получить.
В чем же тут проблема?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 6 2005, 08:18
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Была у меня такая ситуация. Но я забыл поставить на линии резисторы на +5В. У Вас они стоят? По сколько КОм?
И если можно, выложите код, относящийся к TWI.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 6 2005, 08:43
Сообщение #4


Местный
***

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



Резисторы по 4.7кОм стоят на каждой линии (соединяют с +5В).
Привожу пример моих прог приема-передачи.
Передатчик - mega32, приемник - mega16. Передатчик зависает на этапе передачи адреса + W, а приемник зацикливается в цикле wait1n:
Как это все настроить?


Эта прога находится в передатчике:

;*******************************************************************
;Программа передачи байта от мастера подчиненному:

To_SR: ldi temp,$00 ;Установка скорости передачи=22727 Hz
out TWSR,temp
ldi temp,$14
out TWBR,temp

Pusk_Sr: ldi temp,(1<<TWINT)|(1<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

wait1r: in temp,TWCR ;Ожидаем ответ от SR-контроллера
sbrs temp,TWINT
rjmp wait1r

in temp,TWSR
andi temp,$F8
cpi temp,$08 ;Проверка подтверждения приема от SR (START)
brne Pusk_Sr

SLA_Wr: ldi temp,$04 ;Загрузка адреса SR-контроллера + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp

wait2r: in temp,TWCR ;Ожидаем ответ от SR-контроллера
sbrs temp,TWINT
rjmp wait2r

in temp,TWSR
andi temp,$F8
cpi temp,$18
brne SLA_Wr ;Переход, если ответ от SR неверный

;Начинаем передавать данные:

DATA_r: out TWDR,Byte ;Отправка байта данных
rcall Writer

rjmp STOP_r ;Передача данных завершена

;*******************************************************************
Writer: ldi temp,(1<<TWINT)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp

wait3r: in temp,TWCR ;Ожидаем ответ от SR-контроллера
sbrs temp,TWINT
rjmp wait3r

in temp,TWSR
andi temp,$F8
cpi temp,$28
brne Writer ;Переход, если ответ от SR неверный

ret
;*******************************************************************
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

STOP_r: ldi temp,(1<<TWINT)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp

;*******************************************************************



А эта прога находится в приемнике:

;*******************************************************************
;Программа приема байта от мастера:

From_MT: ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp

TWINT_n: ldi temp,(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp

wait1n: in temp,TWCR ;Ожидаем вызова от MT-контроллера
sbrs temp,TWINT
rjmp wait1n

in temp,TWSR
andi temp,$F8
cpi temp,$60 ;Проверка принятого адреса от MT
brne TWINT_n

;Прием данных:

Pr_data: rcall TW_NT_n ;Прием байта
in Byte,TWDR

rjmp STOP_n

;*******************************************************************
TW_NT_n: ldi temp,(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp

wait2n: in temp,TWCR ;Ожидаем ответа от MT-контроллера
sbrs temp,TWINT
rjmp wait2n

in temp,TWSR
andi temp,$F8
cpi temp,$80
brne TW_NT_n ;Переход, если данные от MT не получены

ret

;*******************************************************************
;Все данные приняты - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

STOP_n: ldi temp,(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp

wait4: in temp,TWCR ;Ожидаем ответа от MT-контроллера
sbrs temp,TWINT
rjmp wait4

in temp,TWSR
andi temp,$F8
cpi temp,$A0
brne STOP_n ;Переход, если STOP от MT не получен

;*******************************************************************
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 6 2005, 10:41
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата
SLA_Wr: ldi temp,$04 ;Загрузка адреса SR-контроллера + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp

Не нужно при передачи байта посылать условие старт, нужно заменить строку на эту:
ldi temp,(1<<TWINT)|(1<<TWEN)
это по программе в передатчике, по приемнику - не знаю.
Но советую зайти на www.atmel.com и скачать примеры (application notes), там есть несколько довольно неплохих документов. Я по ним разбирал работу модуля TWI. Кстати где-то ниже должна быть моя ветка "Проблемы TWI".


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 6 2005, 12:44
Сообщение #6


Местный
***

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



Да примеры-то эти я уже давно все скачал и просмотрел. Но примеры там на Си, а я его не знаю...
Строку заменил, то же самое: передатчик зависает на этапе передачи адреса + W, а приемник зацикливается в цикле wait1n:
Контроллеры соединены двухжильным проводом, и находятся на расстоянии ~15см. Уже не знаю на что и грешить.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 6 2005, 14:16
Сообщение #7


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата
Pusk_Sr: ldi temp,(1<<TWINT)|(1<<TWSTA)|(0<<TWSTO)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"


Вы устанавливаете биты "старт" и "стоп" одновременно! так делать нелья, условие старт подается так;
Pusk_Sr: ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

Потом, условие стоп!
Цитата
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

STOP_r: ldi temp,(1<<TWINT)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp


Оно (условие) не отличается от условия "СТАРТ" выше.
условие "стоп" передается так
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

STOP_r: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp

Я думаю, что еще есть ошибки! В общем весь текст программы практически не верный. Нужно искать примеры в интернете на асме.

Могу посоветовать:
www.avrfreaks.net

В даташите на МК с аппаратным TWI есть вся необходимая информация. Там же есть примеры на асме, как передавать данные по этой шине. Удачи.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 6 2005, 15:11
Сообщение #8


Местный
***

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



Так в даташите как раз есть такая фраза:
"Для разрешения работы TWI необходимо записать лог. 1 в TWEN. Для разрешения подтверждения собственно подчиненного адреса или адреса общего вызова записывается 1 в TWEA. Битам TWSTA и TWSTO необходимо присвоить нулевое значение." Я же это не придумал.

Заходил на www.avrfreaks.net, по TWI нашел только программную реализацию всей этой лабуды, а на кой, спрашивается тогда, разработчики делали аппаратный TWI?

В энный раз просмотрел свою прогу, изменил указанные места:
STOP_r: ldi temp,(1<<TWINT)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp, и т.д. все равно приемник не признает передаваемый адрес.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 6 2005, 16:29
Сообщение #9


Местный
***

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



Выяснилось следующее: если передавать с mega32 на mega32 - TWI работает нормально, с mega16 на mega32 - тоже, а с mega32 на mega16 - не работает.
Может тут какие-то тонкости есть?
AVR089 просмотрел, там ничего подходящего к моей ситуации нет: прерывания я не использую, спящий режим тоже.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 7 2005, 00:12
Сообщение #10


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата
STOP_r: ldi temp,(1<<TWINT)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)


Так нельзя сбрасывать бит TWSTA. В левой части всегда должна быть 1, т.к. она сдвигается на определенное количество разрядов. Для бита TWINT=7, еденица сдвинется на 7 разрядов влево (операция <<) и в 7 разряде будет лог. 1.

Для сброса бита можно воспользоваться инструкцией cbi.
В общем нужно разобраться с самим ассемблером. И еще в форуме тяжело объяснять такие вещи. Если хотите, можно пообщаться в аське.
Мой ICQ UIN 339085018. Я там обычно с 3-00 до 13-00 по Московскому времени. Обращайтесь!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
rmo
сообщение Nov 7 2005, 03:24
Сообщение #11


Участник
*

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



В VMLAB в папке AVR_demo есть рабочий проект TWI на асме.
Удобно то, что на осциллографе можно просмотреть все сигналы.
Советую посмотреть.
Удачи.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 7 2005, 05:32
Сообщение #12


Местный
***

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



Вы понимаете, я обнуление (например, 0<<TWSTA и пр.) везде повыкидывал, оставил только те биты, которые надо установить в 1.
Программа работает, но передача осуществляется только с mega32 на mega32 или с mega16 на mega32. А с mega32 на mega16 - не работает.
Вот в чем проблема. А программа работоспособная, на все сто.
Может там fuse биты у МК настраивать надо?

To rmo:
У меня, к сожалению, нет программы VMLAB, я был бы вам очень благодарен, если бы вы мне сказали где можно скачать полностью работоспособную версию этой проги. Я слыхал, там можно смоделировать работу двух МК - вот это мне бы подошло!
Go to the top of the page
 
+Quote Post
rmo
сообщение Nov 7 2005, 07:59
Сообщение #13


Участник
*

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



VMLAB http://www.amctools.com/download.htm
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 7 2005, 10:41
Сообщение #14


Местный
***

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



М-да, выглядит как игрушка. Сомневаюсь я насчет реального моделирования.
Да и разбираться с ней времени нет. Я как-то к AVRStudio уже привык и осваивать новую прогу неохота.
Посмотрел я пример TWI - общий алгоритм у меня такой же, только без прерываний. И, главное, моя прога-то работает, но только с mega32 на mega16 данные не передаются. А обратно - пожалуйста.
Вот в чем проблема!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 7 2005, 12:30
Сообщение #15


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Ну я думаю во-первых, если не работает на разных кристаллах, проверить инициализацию меги 16.
Во-вторых, есть подозрение, что в транзакция не закрываеться
(не опознан адрес, не выставлен ACK etc)
Посему скромная рекомендация: делаем некую переменную, в которую по окончанию каждого этапа транзакции, ложим число.
По окончании всего выбрасываем это число на индикатор или в uart.
И смотрим в какой момент автомат TWI понесло не в ту сторону.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 7 2005, 12:53
Сообщение #16


Местный
***

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



У меня временная индикация сделана на светодиодах.

Приемник (В этом случае - диод D,0 горит, а D,1 нет):

From_MT:ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp

TWINT_n:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp

cbi PORTD,0

wait1n: in temp,TWCR ;Ожидаем вызова от MT контроллера
sbrs temp,TWINT
rjmp wait1n

cbi PORTD,1

in temp,TWSR
andi temp,$F8
cpi temp,$60 ;Проверка принятого адреса от MT
brne TWINT_n

cbi PORTD,2
.
.
.


Передатчик (здесь С,2; C,3; C,4 и C,5 - горят, а С,6 - уже не горит):

To_SR:

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

Pusk_Sr:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

cbi PORTC,2

wait1r: in temp,TWCR ;Ожидаем ответа от SR контроллера
sbrs temp,TWINT
rjmp wait1r

cbi PORTC,3

in temp,TWSR
andi temp,$F8
cpi temp,$08 ;Проверка подтверждения приема от SR (START)
brne Pusk_Sr

cbi PORTC,4

SLA_Wr: ldi temp,$04 ;Загрузка адреса SR-контроллера + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp

wait2r: in temp,TWCR ;Ожидаем ответа от SR контроллера
sbrs temp,TWINT
rjmp wait2r

cbi PORTC,5

in temp,TWSR
andi temp,$F8
cpi temp,$18
brne SLA_Wr ;Переход, если ответ от SR неверный

cbi PORTC,6
.
.
.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 7 2005, 13:25
Сообщение #17


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Ну и все проходит нормально?
Нигде не не вылетает с неопознаным кодом?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 7 2005, 14:12
Сообщение #18


Местный
***

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



Прога полностью работает при пересылке от m32 (мастер передатчик) к m32 (подчин. приемник) или от m16 (мастер передатчик) к m32 (подчин. приемник), а если от m32 (мастер передатчик) к m16 (подчин. приемник) - получается вышеприведенная ситуация.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 7 2005, 15:24
Сообщение #19


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Ну и на каком этапе вылетает обмен между м32 и м16?
Все таки еще раз напомню о проверке инициализации м16 как slave.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Nov 7 2005, 16:22
Сообщение #20


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

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



Ne znayu rabotaet ili net - no yesli da mozet i prigoditsya dlya debugginga sini .
http://fruttenboel.verhoeven272.nl/i2c/index.html


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

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


Местный
***

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



To beer_warrior:
а как проверить инициализацию м16 как slave?
Приемник (m16) cтопорит на начальном этапе ожидания связи с передатчиком - бит TWINT не устанавливается.
Передатчик (m32) после передачи SLA+W не принимает ACK - судя по-всему код в TWSR не $18.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Nov 7 2005, 23:28
Сообщение #22


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

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



Po moemu v code priemnika ty dlzen zapisat v TWAR $08 vmesto $04. Tam address biti smeseni na odnu poziciyu nalevo tak chto u tebya slave ozidaet address 2 a ne 4 .

Vnizu raskladka is Data sheeta atmega 16 dlya TWAR registra:

-------------------------------------------------------------
TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE
-------------------------------------------------------------
0 0 0 0 0 1 0 0

daet address $02 dlya priemnika .


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

Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 8 2005, 06:49
Сообщение #23


Местный
***

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



Попробовал $08 - не то.
Понимаете, artem, с mega32 пересылаю на mega32 - все работает (с адресом $04 у обоих; если ставлю $08 у приемника - не работает), потом вынимаю mega32 - приемник, ставлю на его место mega16 - не работает с любыми адресами!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 8 2005, 08:57
Сообщение #24


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата(James D. @ Nov 7 2005, 23:08) *
To beer_warrior:
а как проверить инициализацию м16 как slave?
Приемник (m16) cтопорит на начальном этапе ожидания связи с передатчиком - бит TWINT не устанавливается.
Передатчик (m32) после передачи SLA+W не принимает ACK - судя по-всему код в TWSR не $18.


Я имею в виду нет ли различий в коде м16 и м32. Возможно даже не относящихся непосредственно
к TWI. (прерывания, ватчдог)
Далее, проясните вопрос с передачей: клинит на первом обращении или на последующих, не требуеться ли repeated start?
Далее, проверяем прошел ли нормально start condition, если нет то что в статусе у мастера.
Бит TWINT должен устанавливаться в любом случае, если посылка проехала физически,
проверьте это.
Далее проверяем все-таки что твориться в TWSR слэйва, он возвращает ACK, NACK, arbitration lost,
что-то другое?
Для блезиру можно попробовать SLA+R, general call возможно это что-то прояснит.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Nov 8 2005, 10:04
Сообщение #25


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

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



Soglasen s beer_warrior, nado snachala soblyusti chistotu eksperimenta - ubrat vse vnesnie faktori mogusie pomesat i smotret na status register pered peredachey i v techenii ee .
No mne klazetsya podozritelnym chto device reagiruyet na $02 kogda kak $04 posilaetsya .

Slusay a ne mozes li ty gotoviy proyekt zaprogramirovat v atmega 16 "AVR311: Using the TWI module as I2C slave". To est mozno budet ubeditsya chto chip rabotaet po proverennomu kodu.


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

Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 8 2005, 10:51
Сообщение #26


Местный
***

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



Различия в коде, конечно есть.
Система у меня такая: два m32 + m16, все три соединены по TWI. Обе меги32 работают нормально (у каждой свой код), регулярно одна мега (мастер передат.) передает данные на другую (подчинен. приемник) приблиз. 30 раз в сек.
Мега 16 имеет функцию часов реального времени - внеш. кварц 32768 Гц. По нажатию спец. кнопочки, m32 (мастер передат.) связывается с m16 (подчинен. приемник), передает пару байт, и должен принять текущее значение времени. Так вот, при первом же нажатии этой кнопки связи не получается, оба контроллера зависают, а третий - m32 (подчинен. приемник), продолжает работать. То есть клинит на первом обращении.

Сделал еще два пробных проекта - первый m16 - мастер приемник, второй - m32 - подчин. передатчик. Ничего лишнего, только у m16 оставил часы реал. врем. Работают оба МК по прерываниям таймеров по переполнению или совпадению (в принципе неважно, главное связь по TWI проходит одним циклом, т.е. сработало прерывание - идет передача, закончилась передача - reti) После многочисленных неудачных попыток, заработало - пришлось только у обоих МК в самом конце передачи вставить команду
ldi temp,(0<<TWEN)
out TWCR,temp
потому как все зависало при ВТОРОМ соединении, первое полностью проходило нормально.

Вставил эти рабочие куски кода в свою 3-х контроллерную систему, все проверил, но опять та же фигня - клинит на первом же обращении m32 к m16.

Может соединить все это хозяйство по USART? Как думаете?
Беда только в том, что с USART я никогда не работал, как там со сложностью и стабильностью?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 8 2005, 11:39
Сообщение #27


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



USART это точка-точка в общем случае.
Вам какое расстояние нужно? Может SPI спасет.

По поводу TWI. Если я правильно понял вход слэйва в режим
приема производиться по таймеру. Это не есть хорошо. Слэйв на то
и слэйв чтобы вестись в обмене сигналами мастера. Т.е. мы ждем
прерывания от TWI (start condition) далее не вылазим оттедова пока
мастер нас не отпустит.
Сильно подозреваю что по вашей системе слэйв теряет либо старт
либо один из клоков и поэтому ждет еще чего-н из порта.

А вообще-то переходите на С, сильно облегчит жизнь :-)


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 8 2005, 11:42
Сообщение #28


Местный
***

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



Еще кое-что удалось выяснить: убрал я передачу данных на вторую m32 (приемник), заработала связь m16 - мастер приемник, с m32 - подчинен. передатчик. По нажатию кнопочки, все как положено.
У меня уже крыша едет.

У меня сделано так: первая m32 - это мастер-передатчик, когда связывается со второй m32, и подчиненный передатчик, когда связывается с m16. Видно что-то происходит со связью после соединения m32-m32, так как после этого не получается соединение первой m32 с m16.
Как же правильно завершать работу TWI, и переходить с мастера-передатчика на подчиненный передатчик?
В даташите про это ничерта не написано! Мудрецы!

P.S. Связь m32-m32 и m32-m16 осуществляется в пределах одного обработчика прерывания. Сначала идет передача на один МК, потом на второй. По следующему прерыванию опять тоже самое.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 8 2005, 12:42
Сообщение #29


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Батенька, с арбитражем у вас проблемы. И с отработкой нештатных
ситуаций.

К изучению:
ATMega16 ->TWI ->Multi-master Systems and Arbitration

http://www.semiconductors.philips.com/acro...98/39340011.pdf

Могу закинуть свой исходник на С и по непонятным местам прокомментировать


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 8 2005, 12:56
Сообщение #30


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Батенька, с арбитражем у вас проблемы. И с отработкой нештатных
ситуаций.

К изучению:
ATMega16 ->TWI ->Multi-master Systems and Arbitration

http://www.semiconductors.philips.com/acro...98/39340011.pdf

Могу закинуть свой исходник на С и по непонятным местам прокомментировать


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 8 2005, 13:39
Сообщение #31


Местный
***

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



Спасибо, изучу PDF и арбитраж.
А насчет Си, я боюсь, вам очень многое придется объяснять, и начать придется с самого Си. smile.gif
Кстати насчет арбитража. Первоначально, у меня был только один мастер - m32, и два подчиненных - m32 и m16. Мастер просто должен был передавать данные то одному то другому. Никаких других мастеров в системе нет, о какой потере арбитража может идти речь?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 8 2005, 15:48
Сообщение #32


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Ну тогда и говорим о первоначальном варианте.
м32 мастер, м32 слэйв, м16 слэйв.
Мастер пишет в слэйв м32по таймеру.
Мастер читает слэйв м16 по кнопке.
Я правильно понял?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 8 2005, 16:16
Сообщение #33


Местный
***

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



Правильно так:

м32 мастер, м32 слэйв, м16 слэйв.

1. Вход в обработчик прерывания таймера.
2. Мастер пишет в слэйв м32 по таймеру.
3. Мастер пишет в слэйв м16 по таймеру (забудем о кнопке, просто запись в м16 может производиться, но может быть и пропущена, после записи мастер читает из слэйв м16 (чтение идет сразу же после записи и может быть также пропущено - запись/чтение - одна операция)).
4. Выход из обработчика прерывания.

Дальше все повторяется.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 8 2005, 20:54
Сообщение #34


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



ОК, значит щелкнул таймер, обмен с м32 прошел, начал писать
в м16 и заткнулся. Так?
Если да, то проверить правильно ли отработал стоп в первом обмене
и старт во-втором. Поставить приличную паузу между стопом и стартом.
Заремить запись в м16 и тупо прочитать 1 байт.

Мне почему-то кажеться, что что-то не так со второй транзакцией.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 07:08
Сообщение #35


Местный
***

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



Для чистоты эксперимента сделал следующее.
Общение всех МК происходит в самом начале работы программ, т.е. после RESET идет настройка стека и портов, и сразу же вкл. работа блоков TWI.
1. Мастер m32 вызывает п/п передачи на слэйв m32 (адрес $02), потом на слэйв m16 (адрес $04) и останавливается - задан бесконечный цикл.
2. Слэйв m32 (RESET, настройка стека и портов) вызывает п/п приема данных, принимает несколько байт данных от мастера, индицирует завершение своей работы (светодиод), и останавливается - задан бесконечный цикл. Этот пункт полностью работает.
3. Слэйв m16 (RESET, настройка стека и портов), во время обмена двух m32 постоянно ждет, когда к нему обратится мастер (см. ниже цикл ожидания wait11).
После того, как мастер завершил передачу на слэйв m32, он индицирует завершение своей работы со слэйв m32 (светодиод), потом вызывает п/п передачи на слэйв m16, посылает START, принимает подтверждение (код $08), загружает адрес слэйв m16 + Write, и после этого ждет когда бит TWINT установится в "1". И все. Бит TWINT не устанавливается.

Слэйв m16, пример кода:

From_A1:ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp
TWINT_1:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp

cbi PORTD,0

wait11: in temp,TWCR ;Ожидаем вызова от мастера m32
sbrs temp,TWINT
rjmp wait11

cbi PORTD,1

Здесь светодиод PORTD,0 - горит, а PORTD,1 - нет. Бит TWINT не устанавливается.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 9 2005, 09:40
Сообщение #36


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



ОК, первая посылка мастера SLAW?
Тогда проверяем какой код вернул мастер 08, 10,18,20,30,38
т.е. что ушло с мастера.

добавлено:
Еще раз пересмотрел условия, сначала опрашиваеться м32, так вот это отключить и сразу писать в м16

Сообщение отредактировал beer_warrior - Nov 9 2005, 09:46


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 11:30
Сообщение #37


Местный
***

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



Слэйв м32 отключил, пишу сразу в м16.
Кусок кода в мастер м32:

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

Pusk_S1:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

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

in temp,TWSR
andi temp,$F8
cpi temp,$08 ;Проверка подтверждения приема от слэйв м16 (START)
brne Pusk_S1

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

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

in temp,TWSR
andi temp,$F8
cpi temp, (здесь идет проверка кода)

Мастер вернул код $20 - SLA+W был передан, NOT ACK был принят. Почему так?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 9 2005, 12:32
Сообщение #38


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Ну во-первых, адрес надо сдвигать на 1 бит и накладывать маску 0 или 1 в 0 разряде.
100% не уверен, однако м16 словила старт и теперь тупо ждет
опознания адреса.
TWINT выставляеться по совпадению адреса, а адрес не совпал.
Если бы работало на прерывании, м16 в него бы просто не заехал,
и жил бы себе дальше.

addr = (addr << 1) | 0x01; для чтеия
addr = (addr << 1) & 0xfe; для записи

обязательно.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 12:52
Сообщение #39


Местный
***

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



Вынул из панельки слейв м16, и поставил туда слэйв м32. Зашил в сл. м32 ту же прогу, какая была в сл. м16 (без всяких изменений). Теперь мастер выдал код $18 - то, что и должно быть.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 9 2005, 13:00
Сообщение #40


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Так может просто кристалл битый?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 13:09
Сообщение #41


Местный
***

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



Сдвинул в мастере код слэйв м16:

ldi temp,$04 ;Загрузка адреса м16 + "WRITE"
lsl temp
andi temp,$FE
out TWDR,temp

Выдается тот же код - $20.
Или я что-то не то делаю?...

У меня есть два м16 - оба выдают такую фигню. Вряд ли они оба битые.
К тому же пробовал ставить м16 - мастером приемником, а м32 - слэйв передатчиком - все работало (на макете, а в основной проге - по прерываниям и т.д. - работать отказался).
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 13:22
Сообщение #42


Местный
***

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



Да, и еще. Раньше у меня в системе (громко звучит, не правда ли smile.gif ) было задействовано два м16 (эти самые, с которыми теперь мучаюсь); один другому передавал данные по TWI. Потом я их заменил на м32.
Так что они полностью исправны. Проверено.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 9 2005, 13:24
Сообщение #43


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



ОК делаем вот такой финт - сразу после инициализации зацикливаем
м16, разрешаем прерывание и в прерывании зажигаем светодиод.
После этого бомбим м16 разными адресами


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 14:20
Сообщение #44


Местный
***

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



Значит сделал так: (в м16) после настройки стека и портов настроил прерывание (мигающий светодиод), и сразу же идет работа блока TWI. Так вот, вы знаете передал таки м32 данные на м16! И диод мигает.
Адрес $04 задается у обоих контроллеров.
Ну это хорошо, а как теперь мне культурно все это заделать в своей системке?

Ё-моё! Хоть что-то заработало!!!
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 14:38
Сообщение #45


Местный
***

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



Вы еще мне объясните: зачем это левое прерывание-то понадобилось? Чтобы привести в чувство TWI?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 9 2005, 16:32
Сообщение #46


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Неа, я имел в виду прерывание по TWI т.е. гарантированую хардварную проверку срабатывания TWINT.
Но в любом случае это показало, что девайс работоспособен
и проблема вероятнее всего состоит в неправильном отлове TWINT

Прерывания не зря придумали.

Вот пример проверенный. switсh это проверка условия, case это то, что делаеться по условию.
Обрабатываються все возможные ситуации. Изучайте логику перекладывайте на асм.
Прикрепленные файлы
Прикрепленный файл  twi.zip ( 2 килобайт ) Кол-во скачиваний: 100
 


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 9 2005, 17:03
Сообщение #47


Местный
***

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



Я так и подумал, что надо задействовать прерывание TWI, но из вашего сообщения толком не понял какое прерывание вы имели в виду, поэтому решил попробовать сначала так. И заработало. Попробую переделать основную прогу, если не получится, тогда буду мудрить с прерываниями TWI.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Nov 10 2005, 03:14
Сообщение #48


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

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



James , voobse to etot Atmel nado povesit ).
Vot prostudiroval ego datasheet na atmega16 i on govorit chto :
To initiate the Slave Transmitter mode, TWAR and TWCR must be initialized as follows:

TWAR (kak obychno u tebya v programme)
TWCR TWINT TWEA TWSTA TWSTO TWWC TWEN – TWIE
Value 0 1 0 0 0 1 0 X

To est v samom nachale TWINT obnulyaetsya. Esli isxodit iz logiki veshey , to srazu posle zapisi v TWCR - v TWINT dolzna zapisatsya edinica po apparatnoy initializacii I2C slave mode. Et ya predpolagayu . Inache TWINT ne budet funkcionirovat kak dolzen .
Xoroso by proverit eto . Esli eto deystvitelno imeet mesto to tebe nezachem aktivizirovat preryvanie - dostatochno sledovat etoy procedure . Dlya spravki posmotri na stranicu 189 mega16.pdf (datasheet).

Krome togo u Atmela est application note dlya TWI I2C slave mode. Tam code na C pravda i rabota s preryvaniyami no dumayu chto vzglyanut ne pomesaet.


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

Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 10 2005, 08:38
Сообщение #49


Местный
***

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



По прерыванию TWI что-то не работает... Прошу не бить меня ногами, но пинание в нужном направлении приветствуется.
При инициализации я сделал так:

1. Настроил прерывания:

.CSEG
.org $000 rjmp RESET ;Сброс вектор
.org $022 rjmp From_м32 ;Обработчик TWI ATmega16

2. Настроил TWI:

ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp

потом разрешил общие прерывания:

sei

;********************
Обработчик TWI:

From_м32: in temp,TWSR
andi temp,$F8
cpi temp,$60 ;Проверка принятого адреса от м32
breq Pr_data ;Если адрес совпал - прием данных, иначе - выход из прерывания

ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp

reti

Pr_data: здесь идет прием данных
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 10 2005, 09:01
Сообщение #50


Местный
***

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



artem, насчет повесить - за мной будешь, сначала он мой! maniac.gif
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 10 2005, 11:34
Сообщение #51


Местный
***

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



Тихо шифером шурша ...

Ситуация такая. Слэйв м16 восстановил так, как было вчера - TWI работает не по прерыванию (зациклено в основной программе), по прерыванию мигает диод.
Мастер м32 вначале (сразу после инициализации контроллера) передает данные на слэйв м32.
Потом, по прерыванию (по переполнению) таймера, мастер м32 постоянно передает данные на слэйв м32, и после этого (в этом же обработчике прерыв.) передает данные на слэйв м16.
Такая комбинация при передаче на слэйв м32 работает, а на слэйв м16 не работает.
Но если убрать в проге мастера м32 вначале и в обработчике прерыв. передачу на слэйв м32, то передача на слэйв м16 работает.
Может там как-то с сигналами START, повторный START и STOP надо порядок навести? Но я перебрал уже разные варианты - ничего не помогает.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 10 2005, 12:35
Сообщение #52


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Артем, запись 1 в TWINT сбрасывает триггер, а прервывание его взводит.
James, если м16 слэйв работает нормально, при отключенном м32слэйв. Значит предыдущая сессия обмена не закрывалась.
Вообще в отличии от большинства меговской перефирии TWI живет
как конечный автомат с кучей состояний.
Внимательно просмотрите таблицы с кодами TWSTA, в последней колонке список предлагаемых дествий после каждого этапа передачи. Т.е. тупая линейная программа - дали команду ждем завершения не катит, особенно если на линии больше двух устройств.
Т.е. мы отлавливаем каждый код возврата и ждем не только
ожидаемого исхода, но и обрабатываем возможные Nack, arbitration lost итд.
По этому коду принимаем решение о продолжении обмена, рестарте,
аварийном завершении итп.
Насколько я вижу картину, автомат сейчас заносит в какоето состояние которое не обрабатываеться. После чего невозврат ACK
и вечный цикл в ожидании TWINT который уже не придет.

Попробую скомпилировать вышеприведенный С код и кинуть листинг
для наглядности.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 10 2005, 16:34
Сообщение #53


Местный
***

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



Хорошо, если можно запустить программу обработки ошибок (знать бы еще как ее сделать), а если зацикливается в цикле ожидания wait1 (такое иногда бывает, только сейчас не вспомню при каких условиях - я их столько перебрал, вспомнить страшно)? Как тогда быть?

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

Pusk_St:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

wait1: in temp,TWCR ;Ожидаем ответа от слэйв контроллера
sbrs temp,TWINT
rjmp wait1
Go to the top of the page
 
+Quote Post
_artem_
сообщение Nov 10 2005, 18:17
Сообщение #54


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

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



2 beer_warrior, ya s samogo nachala zametil chto po 1 TWINT sbrasyvaetsya , no etot data sheet v tom meste kotoroe ya ukazal govorit drugoe, mozet byt ya chtoto nepravilno ponyal iz napisannogo v DS . Erratu dlya atmegi 16 ne nasel.
Yesli tebe ne trudno, mozes li posmotret na stranicu 189 v data shite atmega16 ?


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

Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 10 2005, 18:41
Сообщение #55


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



to artem:

• Bit 7 – TWINT: TWI Interrupt Flag
This bit is set by hardware when the TWI has finished its current job and expects application
software response. If the I-bit in SREG and TWIE in TWCR are set, the MCU will
jump to the TWI Interrupt Vector. While the TWINT Flag is set, the SCL low period is
stretched.
The TWINT Flag must be cleared by software by writing a logic one to it.

Страница 179 описание TWCR

to James:
Не хочеться раздувать топик, на выходных склепаю заметочку с подробным разбором этой
темы и выложу у себя на страничке.
Я тоже очень долго воевал c TWI, в моем случае был multimaster да еще на очень кривом железе,
поэтому опыта поднабрался немало <_<


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 10 2005, 20:41
Сообщение #56


Местный
***

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



Я очень благодарен вам за помощь. Буду ждать подробного разбора полетов, но и со своей стороны приложу максимум усилий для решения этой проблемы.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 11 2005, 07:37
Сообщение #57


Местный
***

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



Маленький вопрос.
Если писать программы на Си, можно ли для AVR-контроллеров написать программы рассчета тригонометрических функций, возведение в степень, извлечение корней, операций с плавающей запятой и прочей математики? С какой скоростью МК AVR будет рассчитывать такие функции?
Можно ли где-то найти обучение программированию на С для AVR?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Nov 11 2005, 08:16
Сообщение #58


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



http://www.nongnu.org/avr-libc/user-manual/index.html
modules->mathematics


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 11 2005, 09:46
Сообщение #59


Местный
***

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



Нашел на диске обучение языку С. Что-то типа книги, правда там уклон на написание программ для компьютера. В качастве компилятора использую - "CodeVisionAVR C Compiler". Попробую применить этот С для написания прог для МК...
Go to the top of the page
 
+Quote Post
bbg
сообщение Nov 11 2005, 17:23
Сообщение #60


Участник
*

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



Цитата(James D. @ Nov 11 2005, 12:46) *
Попробую применить этот С для написания прог для МК...


Весьма похвально. Но имейте ввиду, что CVAVR-овский компайлер,
так сказать, имеет много гитик, то есть девиаций, иногда полезных,
от стандартного C. Да и кто их не имеет.. Но все равно могу
предсказать вам радость от сокращения в десятки разов, если не
в сотни, времени разработки. Я вас даже зауважал, писать для
32-й меги на авээровском асме - это да!
Go to the top of the page
 
+Quote Post
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
James D.
сообщение Nov 20 2005, 15:25
Сообщение #76


Местный
***

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



Да есть у меня полный перевод м128 с этого сайта. Читал, конечно же читал.
Допустим, ситуация такая: вместо кода $18 получаем код $20. Согласно таблицы, что нужно сделать в этом случае? В TWCR записывается новое значение? Но какое из 4-х?
Там, например, говорится "Передается байт данных", да как же он может передаваться, если нет подтверждения адреса от слейва?
Елки-палки, ну ткните меня носом, что нужно делать в ошибочных ситуациях!!!
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 16:28
Сообщение #77


Местный
***

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



Цитата(James D. @ Nov 20 2005, 18:25) *
Допустим, ситуация такая: вместо кода $18 получаем код $20. Согласно таблицы, что нужно сделать в этом случае? В TWCR записывается новое значение? Но какое из 4-х?
Там, например, говорится "Передается байт данных", да как же он может передаваться, если нет подтверждения адреса от слейва?

ну что тут непонятного - после передачи пакета SLA+W принято NACK . действия : выдать STOP затем по новой START/ SLA+W/ и таким образом дожидаться ACK. чтобы не зациклиться - организуй количество попыток и собственно в шите есть пример на асме http://gaw.ru/html.cgi/txt/doc/micros/avr/arh128/18_5.htm
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 16:42
Сообщение #78


Местный
***

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



Но там вот что написано:

1. Пepeдaeтcя бaйт дaнныx, пpинимaется или нe пpинимaeтcя ПOДTBepждeниe
2. Пepeдaeтcя ПOBTOPHЫЙ CTAPT
3. Пepeдaeтcя услoвиe CTOП и cбpacывaeтcя флaг TWSTO
4. Bcлeд зa ycлoвием CTAPT пepeдaeтcя ycлoвиe CTOП и cбpacывaется флaг TWSTO

Это варианты ответных действий, или это одна процедура, которую надо выполнить?
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 17:06
Сообщение #79


Местный
***

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



Цитата(James D. @ Nov 20 2005, 19:42) *
Но там вот что написано:

1. Пepeдaeтcя бaйт дaнныx, пpинимaется или нe пpинимaeтcя ПOДTBepждeниe
2. Пepeдaeтcя ПOBTOPHЫЙ CTAPT
3. Пepeдaeтcя услoвиe CTOП и cбpacывaeтcя флaг TWSTO
4. Bcлeд зa ycлoвием CTAPT пepeдaeтcя ycлoвиe CTOП и cбpacывaется флaг TWSTO

Это варианты ответных действий, или это одна процедура, которую надо выполнить?


в таблице даны возможные варианты действий имхо первый пункт нуна выбросить тк он абсурден ну а далее исходя из алгоритма проги выбирается СТОП , ПОВСТАРТ, СТОП - СТАРТ , более доходчиво на рисунке 97 Форматы и состояния в режиме ведущего передатчика.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 17:15
Сообщение #80


Местный
***

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



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

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

У меня зацикливается в цикле ожидания "wait", шины SDA, SCL в состоянии "0".
Как тут быть?
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 17:25
Сообщение #81


Местный
***

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



а где старт и опрос состояния после оного?
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 17:33
Сообщение #82


Местный
***

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



Не, ну я кусок привел - где ошибка. А полностью вот:

To_m16: ldi temp,$03 ;Установка скорости передачи= ? kHz (поставил самую низкую, кварц на 4 MHz)
out TWSR,temp
ldi temp,$FF
out TWBR,temp

Pusk_Sq:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

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

in temp,TWSR
andi temp,$F8
cpi temp,$08 ;Проверка подтверждения приема от слэйв м16
brne Pusk_Sq

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

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


in temp,TWSR
andi temp,$F8
cpi temp,$18
brne SLA_Wq ;Переход, если ответ от слэйв м16 неверный

Далее идет прием данных. По идее...

Сообщение отредактировал James D. - Nov 20 2005, 17:37
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 17:40
Сообщение #83


Местный
***

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



пора уходить. приложил рабающий код для работы с ееprom может поможет
Прикрепленные файлы
Прикрепленный файл  TWI.zip ( 1.01 килобайт ) Кол-во скачиваний: 63
 
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 18:49
Сообщение #84


Местный
***

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



Не знаю насколько код работающий, пока не разобрался, но вот две ошибки:

ldi tempA,t5000
rcall l

Да и сложный у вас код, запутанный (как на первый взгляд), я пользуюсь такими п/п:
;************************************
;Подпрограмма чтения байта из EEPROM:

EEPROM_read:
sbic EECR,EEWE
rjmp EEPROM_read
out EEARH,temp1
out EEARL,temp2
sbi EECR,EERE
in data,EEDR
ret
;************************************

;************************************
;Подпрограмма записи байта в EEPROM:

EEPROM_write:
sbic EECR,EEWE
rjmp EEPROM_write
out EEARH,temp1
out EEARL,temp2
out EEDR,data
sbi EECR,EEMWE
sbi EECR,EEWE
ret

;*************************************

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


Местный
***

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



Кстати, приемник - слэйв м16 зацикливается здесь (выделено цветом):

ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp

TWINT_0:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp

wait1: in temp,TWCR ;Ожидаем вызова от мастера м32
sbrs temp,TWINT
rjmp wait1


in temp,TWSR
andi temp,$F8
cpi temp,$60 ;Проверка принятого адреса от м32
brne TWINT_0

Сообщение отредактировал James D. - Nov 20 2005, 19:15
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 19:49
Сообщение #86


Местный
***

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



Если линии SDA и SCL в "0" состоянии, значит бит TWINT установлен. Судя по даташиту. А моя программа говорит, что он в "0" состоянии, при "0" на линиях SDA и SCL... Что за дела? Ничего не понимаю!
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 06:41
Сообщение #87


Местный
***

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



Цитата(James D. @ Nov 20 2005, 21:49) *
Не знаю насколько код работающий, пока не разобрался, но вот две ошибки:

ldi tempA,t5000
rcall l

Да и сложный у вас код, запутанный (как на первый взгляд), я пользуюсь такими п/п:

я же писал что пп для eeprom . это зажержка 5мс между записью блоков.
и потом , зачем Вы приемник делаете ведущим?
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 10:31
Сообщение #88


Местный
***

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



Почему ведущим? Приемник у меня подчиненный.
Бит TWINT не надо сбрасывать? Написать так:

ldi temp,(1<<TWEA)|(1<<TWEN)
out TWCR,temp
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 11:06
Сообщение #89


Местный
***

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



именно
(1<<TWEA)|(1<<TWEN) - ведомый приемник
(1<<TWINT)|(1<<TWEA)|(1<<TWEN) - ведущий приемник
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 11:24
Сообщение #90


Местный
***

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



Понял, вечерком попробую с такой комбинацией.

Посмотрел даташит - "ведущий приемник" - там бит TWEA вообще не участвует.

START - (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
SLA+R - (1<<TWINT)|(1<<TWEN)
DATA - (1<<TWINT)|(1<<TWEN)

Вот дальше я не понял. Читаем:
"Данная последовательность повторяется до приема последнего байта. После этого ведущий приемник информирует подчиненный передатчик отправкой НЕТ ПОДТВерждения после приема последнего принятого байта данных."
Как мастер-приемник должен отправлять "НЕТ ПОДТВерждения после приема последнего принятого байта данных"?

Последняя команда:

STOP - (1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 11:40
Сообщение #91


Местный
***

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



Цитата(James D. @ Nov 21 2005, 14:24) *
Понял, вечерком попробую с такой комбинацией.
Посмотрел даташит - "ведущий приемник" - там бит TWEA вообще не участвует.

обшибся.конечно же TWSTA

Цитата
Как мастер-приемник должен отправлять "НЕТ ПОДТВерждения после приема последнего принятого байта данных"?
Последняя команда:
STOP - (1<<TWINT)|(1<<TWSTO)|(1<<TWEN)


после приема последнего байта приемник должен выдать NACK- (1<<TWINT)|(1<<TWEN) а затем STOP
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 16:03
Сообщение #92


Местный
***

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



В приемнике убрал (1<<TWINT), оставил везде только (1<<TWEA)|(1<<TWEN).
Приемник стопорит на этапе приема байта данных - в TWSR код отличный от $80.
Передатчик, после посылки START (получен код $18), не может передать байт данных:

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

бит TWINT не устанавливается.
Судя по всему, ошибка в мастере-передатчике, потому как он не может даже начать передачу.
Почему же TWINT не устанавливается?

ЗЫ. Но, если вернуть в код приемника код (1<<TWINT), то данные на слэйв м32 передаются нормально.
А вот на слэйв м16 данные не передаются в любом случае - если на него идет передача после м32.
А если сначала передавать на м16 - передается нормально, но потом нет передачи на м32...
Крыша едет.

Сообщение отредактировал James D. - Nov 21 2005, 16:19
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 16:41
Сообщение #93


Местный
***

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



вообще то если на шине нет ошибки (код F8) после передачи СТАРТ должен быть код 08 далее загрузить SLA+W и выдать (1<<TWINT) и если в этом случае получаем код 18 то выдаем данные и тд.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 17:10
Сообщение #94


Местный
***

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



Дык я так и делаю (прога передатчика целиком):

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

Pusk_Sq:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

wait1q: in temp,TWCR ;Ожидаем ответа от приемника
sbrs temp,TWINT
rjmp wait1q

in temp,TWSR
andi temp,$F8
cpi temp,$08 ;Проверка подтверждения приема от приемника (START)
brne Pusk_Sq

SLA_Wq: ldi temp,$04 ;Загрузка адреса приемника + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp

wait2q: in temp,TWCR ;Ожидаем ответа от приемника
sbrs temp,TWINT
rjmp wait2q

in temp,TWSR
andi temp,$F8
cpi temp,$18
brne SLA_Wq

;Начинаем передавать данные:

DATA_q: out TWDR,BYTE1 ;Отправка: байт данных 1
rcall Writeq

Pu_Menq:rjmp STOP_q ;Передача данных завершена

;*******************************************************************
Writeq: ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp

wait3q: in temp,TWCR ;Ожидаем ответа от приемника
sbrs temp,TWINT
rjmp wait3q

in temp,TWSR
andi temp,$F8
cpi temp,$28
brne Writeq ;Переход, если ответ от приемника неверный

ret

;*******************************************************************
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

STOP_q: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp

Inits: rjmp Inits

;***********************

Стопорит в цикле wait3q - ежели в проге приемника повыкидывать (1<<TWINT).
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 17:42
Сообщение #95


Местный
***

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



Цитата(James D. @ Nov 21 2005, 20:10) *
Дык я так и делаю (прога передатчика целиком):

lSLA_Wq: ldi temp,$04 ;Загрузка адреса приемника + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp

wait2q: in temp,TWCR ;Ожидаем ответа от приемника
sbrs temp,TWINT
rjmp wait2q

in temp,TWSR
andi temp,$F8
cpi temp,$18
brne SLA_Wq SLA не может повторно выдаваться только через стоп или повстарт

;Начинаем передавать данные:

DATA_q: out TWDR,BYTE1 ;Отправка: байт данных 1
rcall Writeq

Pu_Menq:rjmp STOP_q ;Передача данных завершена

;

Стопорит в цикле wait3q - ежели в проге приемника повыкидывать (1<<TWINT).

а что в приемнике? код в студию
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 18:04
Сообщение #96


Местный
***

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



Приемник:

ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp

TWINT_0:ldi temp,(1<<TWEA)|(1<<TWEN)
out TWCR,temp

wait1: in temp,TWCR ;Ожидаем вызова от передатчика
sbrs temp,TWINT
rjmp wait1

in temp,TWSR
andi temp,$F8
cpi temp,$60 ;Проверка принятого адреса от передатчика
brne TWINT_0

;Прием данных:

Pr_data:rcall TW_NT_1 ;Прием: байт данных
in temp,TWDR

rjmp STOP_1

;*******************************************************************
TW_NT_1:ldi temp,(1<<TWEA)|(1<<TWEN)
out TWCR,temp

wait21: in temp,TWCR ;Ожидаем ответа от передатчика
sbrs temp,TWINT
rjmp wait21

in temp,TWSR
andi temp,$F8
cpi temp,$80
brne TW_NT_1 ;Переход, если данные от передатчика не получены

ret

;*******************************************************************
;Все данные приняты - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

STOP_1: ldi temp,(1<<TWEA)|(1<<TWEN)
out TWCR,temp

wait31: in temp,TWCR ;Ожидаем ответа от передатчика
sbrs temp,TWINT
rjmp wait31

in temp,TWSR
andi temp,$F8
cpi temp,$A0
brne STOP_1 ;Переход, если данные от передатчика не получены

Inits: rjmp Inits
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 18:18
Сообщение #97


Местный
***

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



Цитата(James D. @ Nov 21 2005, 21:04) *
Приемник:

ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp вот и ошибочка : в 0-м разряде (TWGCE) сидит нолик что означает запрещение распознования общих вызовов на шине
а должно быть

ldi temp,$05
;Инициализация режима "Приемник"
out TWAR,temp

дальше не смотрел, пора домой .удачи
совет дня закажи по почте книгу http://www.dodeca.ru/books/me9.php не пожалеешь
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 20:18
Сообщение #98


Местный
***

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



Урра!!! Заработало!!! w00t.gif

Значит так:
1. в приемниках м32 и м16 оставил адреса $02 и $04 соответственно (без записи "1" в TWGCE).
2. в обоих приемниках пишется так:

ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp

бит TWINT должен присутствовать, иначе просто не работает!

Ну и наконец, самое главное!
3. в приемнике м32, после команды STOP и получения кода $A0 пишем:

ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp

Спасибо, m16, за твою подсказку: "после приема последнего байта приемник должен выдать NACK- (1<<TWINT)|(1<<TWEN) а затем STOP". Я решил применить это в моем случае.
Только я сначала даю STOP, а потом уже NACK.

Попробовал после приема последнего байта выдавать NACK (после команды STOP убрал) - тоже работает.

А теперь самое загадочное: убрал выдачу NACK везде в программах-приемниках - все равно работает. Но раньше-то не работало! Такое впечатление, как будто в контроллере после выдачи NACK сработала какая-то "защелка", которая наставила контроллер на путь истинный, и даже после удаления этой команды стало работать нормально. Но это мои домыслы.

Теперь попробуем новую задачу: после передачи на м32, потом на м16, надо принять данные с м16.
Ну как, одолеем? rolleyes.gif
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 22 2005, 12:58
Сообщение #99


Местный
***

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



М-да... Работать-то оно работает, но появились проблемы с записью в EEPROM - иногда (не всегда) при попытке что-либо записать в EEPROM все зависает.
Задержку пришлось поставить в мастере-передатчике:

Pusk_Sn:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

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

rcall Delay
.
.
.

Delay:push r20
push r21
push r22

ldi r20,$FF
ldi r21,$0F
ldi r22,$01
D_r_2: dec r20
brne D_r_2
ldi r20,$FF
dec r21
brne D_r_2
ldi r21,$FF
dec r22
brne D_r_2

pop r22
pop r21
pop r20

ret

по-другому работать не хочет!
Очень не нравится мне ента TWI. Капризная и нестабильная штука.
Go to the top of the page
 
+Quote Post
Moks
сообщение Dec 1 2005, 20:10
Сообщение #100


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 510



Добрый вечер!
Вот нужна какая помощь: Я передаю три байта как Master Transmitter , а вот четвёртый и пятый байты мне нужно принять как Master Receiver. После третьего байта только Acknowledge , а следующий такт уже я должен начать принимать данные. В регистре TWDR - последнее отосланное мной значение.

Ну не знаю я что делать. Помогите! Желательно на СИ!
Go to the top of the page
 
+Quote Post

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

 


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


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