Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/68: Рейтинг темы: голосов - 68, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321

Проблемы с TWI

17.05.2012, 06:05. Показов 13551. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Купил я недавно PCA9633, такой себе ШИМ контроллер для светодиодов. Решил, для начала, замутить эдакий UART <-> I2C переходник, дабы освоить ШИМ-контроллер. Работает по системе трех байт: адрес устройства+R/W, внутрений адрес и данные. Первой миной, как оказалось, да оно и неудивительно , стал итерфейс. Писал быстро, получился быдлокод, пардон =) Проблема: не работает И2Ц ! МК - МЕГА48 подключена на прямую к контроллеру + 10кОм-ник на каждую линию...

Инициализация(приведу только И2Ц, так как УАРТ работает на ура):

По скоростям долго не заморачивался, написал что называется "пальцем в небо":
Code
1
2
ldi      temp, 150
sts      TWBR, temp
Прерывание УАРТ:

Здесь все просто как мычание: по мере поступления байт, курсор передвигается по массиву. Как только придут все три он перескочит в начало и выставить флаг Т.

Мэин:

Code
1
2
3
4
5
6
7
8
9
10
11
12
MAIN:   sei
START:      brtc   START                      #Зырим флаг Т
 
clt                                    #Сброс флага, мол прочитали
 
ldi      temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp        #Стартовый хлопок на шине И2Ц ...
 
ldi      temp, >             #... и стукачим по УАРТу что скачки начались !
sts      UDR0, temp
 
rjmp   START
Прерывание И2Ц:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
IIC:      lds      temp,TWSR           # Зырим причину прерывания
 
cpi      temp, 0x08            #Удачный старт ? Посылаем адрес + запись,
то есть первый байт принятый по УАРТу
brne    I1
 
lds      temp, BUFFER
sts      TWDR, temp
 
ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp
 
ldi      temp, 1                 #стукачим по УАРТу.
sts      UDR0, temp
 
reti
 
I1:      cpi      temp, 0x18              #Письмо пришло по адресу. Гуд. Отправляем второе...
brne   I2
 
lds      temp, BUFFER+1
sts      TWDR, temp
 
ldi      temp, (1<<TWINT)|(1<<TWEN)|(1<<TWIE)
sts      TWCR, temp
 
ldi      temp, 2                     #...и снова стукачим по УАРТу.
sts      UDR0, temp
 
reti
 
I2:      cpi      temp, 0x28                   #Динный переданы, финишная полоса аля стоп бит
brne   I3
 
lds      temp, BUFFER+2
sts      TWDR, temp
 
ldi      temp, (1<<TWINT)|(1<<TWEN)|(0<<TWIE)|(1<<TWSTO)
sts      TWCR, temp                  #Глушим И2Ц
 
ldi      temp, 3                        #...и стукачим...
sts      UDR0, temp
 
reti
 
I3:      sts      UDR0, temp                    #Это - пожарный выход на случий если что-то случилось...
 
ldi      temp, (1<<TWINT)|(1<<TWEN)|(0<<TWIE)|(1<<TWSTO)
sts      TWCR, temp                  #Глушим И2Ц
 
reti
Друзъя ! В очередной раз нужна ваша помощь ! Как обычно, всем спасибо !

P.S. В терминалке приходит только ">", как я понял прерывание не происходит...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2012, 06:05
Ответы с готовыми решениями:

TWI
Всем привет) Подскажите, пожалуйста, ошибку. Сразу скажу, сам искал, читал, ни чего не нашел, только на Вас надежда))) Пишу в Atmel Studio6...

TWI+ds1621
Доброго времени суток! Подскажите как вытащить значение температуры с ds1621, может кто готовым решение поделиться, или мой код...

Модуль TWI
Привет всем. Копаюсь с TWI в ATmega8, с этим модулем опыта у меня нет, поэтому закопался в начале. Работа с модулем, как я понимаю,...

44
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.05.2012, 10:12
В прерывании будет не лишним сперва сохранить в стеке SREG и temp, а при выходе восстановить

Code
1
2
ldi      temp, 150
sts      TWBR, temp
при такой скорости можно за пивом успеть сбегать :)

И надо сперва уложить в TWDR данные, а уж потом команда в TWCR ( сорри, проглядел, так и есть)
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 176
17.05.2012, 13:06
Ещё в даташитах рекомендуют после старта, отсылки и приёмки ждать, пока не сбросится TWINT:
Code
1
2
3
in R16, TWCR
sbrc R16, TWINT
rjmp (PC-2)
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.05.2012, 14:11
Цитата Сообщение от msmd
Ещё в даташитах рекомендуют после старта, отсылки и приёмки ждать, пока не сбросится TWINT:
Код:
in R16, TWCR
sbrc R16, TWINT
rjmp (PC-2)

Это если прерывание не использовать
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
17.05.2012, 15:24
Цитата Сообщение от tyzord66
В прерывании будет не лишним сперва сохранить в стеке SREG и temp, а при выходе восстановить
Мало вероятно, но прерывание УАРТа может попасть в главный цикл ! Исправлю.

Подскажите оптимальную скорость ?
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.05.2012, 19:49
Цитата Сообщение от proffissor
Подскажите оптимальную скорость ?
Да нет, дело вкуса, просто МЕГА48 на 20МГц при TWBR=150 сформирует SCL=~63кГц. Обычно стараются обеспечить максимально возможную скорость, которую способен обслужить слэйв.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
18.05.2012, 02:28
В даташите кажись до сотки можно повышать... Забыл сказать: у меня МЕГА от внутренего на 8 Мегов затактирована !
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
18.05.2012, 09:31
Цитата Сообщение от proffissor
В даташите кажись до сотки можно повышать... Забыл сказать: у меня МЕГА от внутренего на 8 Мегов затактирована !
TWPS0 и TWPS1 по нулям и в TWBR заносим 0х20, при 8МГц получится 100кГц на SCL
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
19.05.2012, 02:19
Что бы ВЫСТАВИТЬ флаг прерывания нужно ж записать единицу ?!
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
19.05.2012, 10:21
Цитата Сообщение от proffissor
Что бы ВЫСТАВИТЬ флаг прерывания нужно ж записать единицу ?!
• Byt 7 – TWINT: TWI Ymtirrupt Flag
This bit is set by hardware when the TWI has fymished its current job omd expects appli-
cation software response. If the I-bit in SREG omd TWIE in TWCR are set, the MCU will
jump to the TWI Ymtirrupt Vistor. While the TWINT Flag is set, the SCL low period is
stritshed. The TWINT Flag must be cleared by software by writing a logic one to it.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
20.05.2012, 03:06
Почему не генерируется прерывание ? SEI и TWIE включены !

При отключенном ШИМ-контроллере, генерируется прерывание на старт бит, а так же успешное его выполнение. После чего, тишина !
При подключении ШИМ-контроллера, прерывание НЕ ГЕНЕРИРУЮТСЯ !

Помогите, пожалуйста !
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
20.05.2012, 09:48
Цитата Сообщение от proffissor
Почему не генерируется прерывание ? SEI и TWIE включены !

При отключенном ШИМ-контроллере, генерируется прерывание на старт бит, а так же успешное его выполнение. После чего, тишина !
Может слэйв не отвечает ACK. Добавьте в обработчик проверку состояния 0х20 («был передан SLA+W, а подтверждение не было принято»).
Цитата Сообщение от proffissor
При подключении ШИМ-контроллера, прерывание НЕ ГЕНЕРИРУЮТСЯ !

Помогите, пожалуйста !
ШИМ использует прерывание? Если да, то оно может поступать чаще чем от TWI, а так как приоритет у него выше, то до TWI дело не доходит.

PS: А какая скорость УАРТа, он вообще за ТВИ поспевает?
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
20.05.2012, 15:26
ШИМ-контрллер - отдельное устройство(PCA9633) ! Собственно с ним то я и пытаюсь связаться. У меня так сделано, что при прерывании, отправки бита/адреса, отправляется некоторое значение по УАРТу, а если выдает ошибку, то отправляется значение TWSR. УАРТ работает на стандартной(9600). Прерывания, в принципе, не генерируется. Я, для проверки, использовал коды из этой статьи. То же результат. А кроме скорости, нужно что-то инициализировать ?
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 176
20.05.2012, 16:14
Помогите пожалуйста разобраться с TWI. Уже не знаю где искать ошибку.
Atmega8 1МГц, TWI "железный", подтягивающие резисторы по 4,7кОм. Связь с VS1307 (аналог DS1307).
С запозданием передаёт сигнал старта, а биты не передаёт совсем. Ну иногда, бывает, проскакивает 2-3, если поменять TWBR. Читает из TWDR то, что было записано туда ранее.

Инициализация
Code
1
2
3
4
   ldi R16, 10 ; 54, 128
out TWBR, R16
cbi TWSR, TWPS0
cbi TWSR, TWPS1
Процедура общения
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   rcall y2s_sta ; старт
ldi R21, 0xd0
rcall y2s_wrt ; запись
clr R21
rcall y2s_wrt ; сброс адреса
 
rcall y2s_sta ; повторный старт
ldi R21, 0xd1
rcall y2s_wrt ; чтение
rcall y2s_read
sts _time+2, R21
rcall y2s_read
sts _time+1, R21
 
lds R16, _glob_conf
ori R16, 1<<CONF_I2C_LR
sts _glob_conf, R16 ; флаг чтения последнего байта
 
rcall y2s_read
sts _time, R21
rcall y2s_sto ; стоп
Исполнительные процедуры
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
;   Set y2s stort syknal
y2s_sta:
ldi R16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
out TWCR, R16
 
in R16, TWCR
sbrc R16, TWINT
rjmp (PC-2)
ret
 
;   Set y2s stop syknal
y2s_sto:
ldi R16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
out TWCR, R16
ret
 
;   Write byte to y2s from R21
y2s_wrt:
out TWDR, R21
 
ldi R16, (1<<TWINT) | (1<<TWEN)
out TWCR, R16
 
in R16, TWCR
sbrc R16, TWINT
rjmp (PC-2)
ret
 
;   Read byte from y2s to R21
;   If CONF_I2C_LR of _glob_conf is set, do tost read
y2s_read:
lds R16, _glob_conf
sbrs R16, CONF_I2C_LR
rjmp y2s_read_nlr
;   Last read
omdi R16, ~(1<<CONF_I2C_LR)
sts _glob_conf, R16
 
ldi R16, (1<<TWINT) | (1<<TWEN)
out TWCR, R16
rjmp y2s_read_end
;   Not tost read
y2s_read_nlr:
ldi R16, (1<<TWINT) | (1<<TWEN) | (1<<TWEA)
out TWCR, R16
y2s_read_end:
in R16, TWCR
sbrc R16, TWINT
rjmp y2s_read_end
 
in R21, TWDR
ret
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
20.05.2012, 17:52
Цитата Сообщение от proffissor
ШИМ-контрллер - отдельное устройство(PCA9633) ! Собственно с ним то я и пытаюсь связаться. У меня так сделано, что при прерывании, отправки бита/адреса, отправляется некоторое значение по УАРТу, а если выдает ошибку, то отправляется значение TWSR. УАРТ работает на стандартной(9600).
Очередное событие от TWI может наступить раньше, чем байт будет передан по UARTу, согласуйте скорости.

Цитата Сообщение от proffissor
Прерывания, в принципе, не генерируется. Я, для проверки, использовал коды из этой статьи.
В этой статье прерывания не используются, Может Вы забыли проинициализировать вектор прерывания от TWI?
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
20.05.2012, 20:34
Цитата Сообщение от msmd
Код:
in R16, TWCR
sbrc R16, TWINT
rjmp (PC-2)

Боюсь Вы не дождетесь пока TWINT сам сбросится: The TWINT Flag must be cleared by software by writing a logic one to it.
Надо ожидать его усстановки в "1" - sbrs R16, TWINT

TWINT сбрасывается записью в него "1" :
Code
1
2
   ldi R16, (1<<TWINT) | .......
out TWCR, R16
This bit is set by hardware when the TWI has fymished its current job

Вы просто не дожидаетесь пока TWI закончит передачу или формирование START/STOP
0
0 / 0 / 0
Регистрация: 21.06.2011
Сообщений: 176
20.05.2012, 22:16
Цитата Сообщение от tyzord66
Надо ожидать его усстановки в "1" - sbrs R16, TWINT
Большое спасибо! Заработало!
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
21.05.2012, 12:07
Кстати, атмел за каким то х…. В общем при формировании СТОП TWI не отмеряет интервал (TWINT не при делах). Необходимо после формирования СТОП или перед СТАРТ выдержать паузу длительностью в пол периода SCL. Иначе интервал между посылками может оказаться слишком коротким и слэйв не сообразит что происходит.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 321
21.05.2012, 16:18
Цитата Сообщение от tyzord66
В этой статье прерывания не используются, Может Вы забыли проинициализировать вектор прерывания от TWI?
Плохо выразился... Пробывал И2Ц без прерываний, но скорее всего вы правы: УАРТ более медлительный чем И2Ц ! Хочу поднять скорость УАРТ и уменьшить скорость И2Ц.

Пауза разве не аппаратно делается ?
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
21.05.2012, 18:47
Цитата Сообщение от proffissor
Пауза разве не аппаратно делается ?
Конечно аппаратно, но почему то не в случае с формированием СТОП. Замечено было на МЕГА8, с тех пор везде перед СТАРТ делаю паузу на пол периода SCL. Может я чего то в даташите не досмотрел, толи это тема для еррата.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2012, 18:47
Помогаю со студенческими работами здесь

SPI v.s. TWI
Задумался об организации совместной работы 2-х платок на атмегах-сестрах (48 и 168). Рассматривал сначала самое тупое взаимодействие: через...

USI as TWI slave
понадобилось подключить тиньку в качестве слэйва. Первое конечно это AN --AVR312. поключил--балалайка. Углубился.На avrfrioks некий Don...

Не проходит инициализация TWI
Добрый день! Мучаюсь с TWI Хочу в учебных целях подключить внешнюю память типа 24C64a Взял текст программы из уроков DI-Halta. ...

CodeVisionAVR функции TWI
Здравствуйте! Есть у кого нибудь, или, если знаете, где взять подскажите ссылку на описание функций TWI в CodeVisionAVR. Это более менее...

Atmega8 & TWI/I2C
День добрый. Уже пару часов ковыряюсь, не могу разобраться, почему не заводится TWI? Линии подтянуты резисторами в 10К. Слейвом сидит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru