USI как I^2C Slave на Attiny2313-20PU, не раб. внеш. такт...

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт фев 19, 2008 10:14:47
Откуда: SPb

Сообщение DrLithium »

Кварц 7.970MHz:
СпойлерCommand KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 1
M3 - SA[0]aUnP 200 6C(W) U-NASK 1
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 1
M3 - SA[0]aUnP 100 6C(W) A-NASK 1
M3 - SA[0]aUnP 200 6C(W) U-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 1

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 1
Кварц 8.867238:
СпойлерCommand KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) U-NASK 1
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 1
M3 - SA[0]aUnP 200 6C(W) U-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 1
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) U-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 0
Кварц 14.318MHz:
СпойлерCommand KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 1
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) U-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) U-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) U-NASK 0
Кварц 17.734475MHz:
СпойлерCommand KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 2

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 1
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 1
M3 - SA[0]aUnP 400 6C(W) A-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 1
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) A-NASK 0
Кварц 24MHz:
СпойлерCommand KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 1
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) U-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) U-NASK 0

Command KHz Address Byte U Time, mS
-----------------------------------------------------------------------
M3 - SA[0]aUnP 50 6C(W) A-NASK 0
M3 - SA[0]aUnP 100 6C(W) A-NASK 0
M3 - SA[0]aUnP 200 6C(W) A-NASK 0
M3 - SA[0]aUnP 300 6C(W) A-NASK 0
M3 - SA[0]aUnP 400 6C(W) U-NASK 0
*- "U-NASK" в данном логе сообщение означает: "Условно названный 'Byte U' мастером отправлен, подчинённый ответил NASK, при этом адрес подчинённого был отправлен и опознан подчинённым как свой."
**- "A-NASK" - "адрес не опознан подчинённым как свой."

Суть статистики в том, что прерывание "USI_START" (при USISR 0b11110000 и USICR 0b10101000) на событие "START" реагирует. В обработке прерывания "USI_START" меняем USICR на 0b11101000 и в прерывании "USI_OVF" внешнего тактирования от "SCL" мастера - нет! А есть совершенно конкретная реакция сдвигового регистра на частоту именно своего кварца! Какой при этом работает предделитель - не ясно совсем.

Т.е. выставлено USICS1 =1 USICS0 =0 USICLK =0, эта комбинация определяет "Источник тактирования
сдвигового регистра" = "Внешний, положительный фронт" + "Источник тактирования счётчика" =
"Внешний, оба фронта". Но на деле это не работает! Тактирование внутреннее и не перестраиваемое программно или перестраиваемое с помощью частоты кварца.

USIWM1 + USIWM0 = 10 или 11, без разницы.

Инициализация SDA и SCL - PB5,7 как входы:
Спойлерldi Temp,0b00011111 ; PB5,7 вход I^2C, PB6 - концевик, PB0-4 на выходы
out DDRB,Temp ; 0-3 выход на ШД 1-4, соответственно
ldi Temp,0b00000000 ; PB0-4 в "0"
out PortB,temp ; PB5-7 без подтяжки
В обработчике прерывания "USI_START", SDA не изменятся, так и остаётся входом.

SCL в обработчике прерывания "USI_START":
СпойлерВ начале:
sbi sclddr,scl ; пин7@PORTB как выход для удержания SCL
cbi sclport,scl ; устанавливаем лог. ноль на пине пин7@PORTB
В конце:
cbi sclddr,scl ; пин7@PORTB как вход
Далее в прерывании "USI_OVF" уже получаем байт адреса и полученный адрес может не совпадать с реально отправленным мастером. Тут проблема передачи байт, из-за разности частот тактирования. При не полном совпадении по таймингу сигнала SCL мастера и подчинённого, происходят пропуски данных, начиная с адреса.

Т.ч. для себя решил, что сэкономить код на USI не получается. Хотел сделать для всех, но на паре разных экземпляров 2313, максимум получена нестабильная передача байт. Если точнее подобрать кварц (коих не великие закрома), то можно добиться почти 100%-й работы протокола. Цена при этом получилась слишком высока. В планах было заставить стабильно работать код с тактированием МК от внутреннего генератора на 4.0MHz.

Задача была следующая: т.к. Attiny2313 накоплено какое-то кол-во, пустить в дело как I^2C-исполнители (подчинённые, типа управление шаговым двигателем в простейшем узле), при этом с приличным для свободы действий куском программной памяти. Заставить работать USI - получилось, но как надо - так и не вышло.

В качестве тестера была использована "Arduino Nano" с частотой 16MHz и софтовая часть написанная в среде Ардуино.

Вопрос: у кого-нить получилось заставить работать USI подчинённым, с тактированием шины I^2C от мастера, на Attiny2313, на разных частотах и при тактировании МК от внутреннего генератора? Может упустил чего?

З.Ы. Следует заметить, что в "Atmel Studio 6.2", USI не поддерживается на предмет отладки полностью! Пройти по шагам и отыскать грабли не получится, т.к. сдвиговый регистр тупо не принимает данные с пина SDA. А в железе приём есть.
З.З.Ы. Код не выкладываю, т.к. удовлетворительного результата нет. Если у кого есть что-то рабочее, то поправлю у себя и поделюсь. Проблема в "трёх соснах" - конфигурации регистров USISR+USICR.
Если в голове каша, значит ваш котелок варит!
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

А зачем вы меняете CR после принятия старта? Всю передачу и генерацию SCL должен только мастер вести.
К делу отношения не имеет - но почему студия 6ая? Я понимаю когда 4ую берут - там продукт совсем другой был, но уже что 6ая, что 7ая на базе VS сделаны, так почему бы не поставить последнюю 7ую тогда уж?
Реклама
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт фев 19, 2008 10:14:47
Откуда: SPb

Сообщение DrLithium »

А зачем вы меняете CR после принятия старта?
Взято от сюда: https://github.com/CalcProgrammer1/Step ... pperDriver
В CR взводится флаг по переполнению "Bit 6 — USIOIE: Counter Overflow Interrupt Enable". Нормальная практика: в зависимости от состояния автомата, лишнее вырубается, нужное включается.
Всю передачу и генерацию SCL должен только мастер вести.
Это известно каждому школьнику. Но если вы внимательно читали пост, то должны были бы понять, что подчинённый не работает по внешке и в этом и есть проблема. Мне нужно, что б он тактировался от мастера, но именно это и не работает! Что доказано логами!
"студия 6ая?"
Потому, что на момент установки была рабочая именно эта версия. Сырой седьмой мне не надо. Тем более переходить на следующую веря, что там USI починили, что-то не хочется. При 6-е ещё и исправно работает 4.19. Когда мне не станет хватать 6-ки, буду думать, а пока нет ни времени, ни места на винте, ни желания искать рабочую и безглючную версию.
Если в голове каша, значит ваш котелок варит!
Ответить

Вернуться в «AVR»