Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.08.2007, 07:13
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Извините за недолгое отсутствие. Сам я не занимался USI. Но насколько я понимаю, ACK должен выдаваться по такту от мастера TWI. Выдает - ли такт мастер по шине SCL?
Удачи.
|
|
|
|
29.08.2007, 21:10
|
|
Временная регистрация
Регистрация: 24.09.2006
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
да, девятый такт выдаётся
|
|
|
|
30.08.2007, 08:08
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Непонятно. Вроде все должно работать. Может с портами что-нибудь напутано? Или чип задан неправильно?
Кстати. Вот Вы пишите
Цитата:
|
Так вот установлено (загорается светодиодик PORTA_Bit2=1, что первый байт принимается нормально, так как программа доходит до той точки где она должна отправить АСК:
DDR_USI |= (1‹‹PORT_USI_SDA); // Set SDA as output
USISR = (0‹‹USISIF)|(1‹‹USIOIF)|(1‹‹USIPF)|(1‹‹USIDC)| // Clear all flags, except Start Cond
(0xE‹‹USICNT0); // Set USI to shift out 1 bit
while ( !(USISR & ( (1‹‹USISIF)|(1‹‹USIOIF) )) ); // Wait until ACK sent. (Pass if Start Cond.)
DDR_USI &= ~(1‹‹PORT_USI_SDA); // Set SDA as input
PORTA_Bit2=1; //Светодиодик
Но этого не происходит.
|
А где строка
Цитата:
|
USIDR = 0; /* Prepare ACK */
|
???
Ведь именно она определяет данные, которые будут переданы в линию, т.е. ACK=0. Если в регистре USIDR в старшем бите будет 1, то ACK и не будет выдаваться (будет выдана 1).
Удачи.
|
|
|
|
30.08.2007, 08:12
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
И еще. Светодиодик загорается когда
Цитата:
|
PORTA_Bit2=1; //Светодиодик
|
или он тут гасится?
Удачи.
|
|
|
|
30.08.2007, 09:43
|
|
Временная регистрация
Регистрация: 24.09.2006
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
USIDR = 0;
есть чуть выше по коду.
Светодиодик именно загорается, хотя это и не принципиально, это я дебаг пытался делать.
Кстати пытался с помощью AVRStudio4 проследить как работает шифтрегистр в разных режимах, но никаким образом не удалось сместить ни одного битика.
Скорее всего - просто симуляция USI в нём не работает.
|
|
|
|
31.08.2007, 07:06
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Если светодиодик загорается, то строка
Цитата:
|
while ( !(USISR & ( (1‹‹USISIF)|(1‹‹USIOIF) )) ); // Wait until ACK sent. (Pass if Start Cond.)
|
выполняется. Т.е. либо приходит такт по SCL и тогда данные из USIDR (ACK) выданы, либо выполняется условие START STOP.
Если у Вас не выдается ACK, то может порт МК неисправен? Больше ничего в голову не приходит. И народ молчит. Люди, помогите человеку.
Цитата:
|
Сегодня ты мне поможешь, а завтра - я тебе помогу. А вместе делаем общее дело.
|
Удачи.
|
|
|
|
03.09.2007, 13:46
|
|
Временная регистрация
Регистрация: 24.09.2006
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Теперь я пытаюсь просто помигать светодиодиком,который присоединён к SDA. Но опять ничего не получается.
1) SDA настроен на выход:
PORTUSI_SDA=1;
DDR_SDA=1;
2) USISR показывает что 4битный счётчик работыет
PORTA=USISR; //через светодиоды
Блин, ну что за фигня такая происходит?
Прикрепленный файл: 8334415.rar
|
|
|
|
03.09.2007, 14:36
|
|
Временная регистрация
Регистрация: 24.09.2006
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
так!
Вроде немного разобрался.
Научился выдавать в SDA содержимое шифт-регистра.
|
|
|
|
05.09.2007, 18:34
|
|
Временная регистрация
Регистрация: 24.09.2006
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Не ну вы можете себе представить! Я в шоке!
В Апноуте была ошибка - вместо логического И (&&) стояло унарное умножение (&)
вследствие чего терялся один такт сдвигового регистра!
while ( (PIN_USI & (1‹‹PORT_USI_SCL)) && !(tmpUSISR & (1‹‹USIPF)) ); // Wait for SCL to go low to ensure the "Start Condition" has completed.
// If a Stop condition arises then leave the interrupt to prevent waiting forever.
[/b]
|
|
|
|
06.09.2007, 07:20
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Сообщение от duritskiy
|
Не ну вы можете себе представить! Я в шоке!
В Апноуте была ошибка - вместо логического И (&&) стояло унарное умножение (&)
вследствие чего терялся один такт сдвигового регистра!
|
Бывает и не такое. Я всегда разбираю апноуты по косточкам. Все лишнее выкидываю, все нужное перепроверяю. Все комментарии переписываю посвоему.
Доверяю лишь даташитам.
Удачи.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:30.
|
|