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

 
 
19 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Проблема с TWI
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

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

 


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


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