Кварц 7.970MHz:
-----------------------------------------------------------------------
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:
-----------------------------------------------------------------------
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:
-----------------------------------------------------------------------
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:
-----------------------------------------------------------------------
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:
-----------------------------------------------------------------------
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 как входы:
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.
Спойлер
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
Спойлер
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
Спойлер
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
Спойлер
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
Спойлер
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
**- "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 без подтяжки
SCL в обработчике прерывания "USI_START":
Спойлер
В начале:sbi sclddr,scl ; пин7@PORTB как выход для удержания SCL
cbi sclport,scl ; устанавливаем лог. ноль на пине пин7@PORTB
В конце:
cbi sclddr,scl ; пин7@PORTB как вход
Т.ч. для себя решил, что сэкономить код на USI не получается. Хотел сделать для всех, но на паре разных экземпляров 2313, максимум получена нестабильная передача байт. Если точнее подобрать кварц (коих не великие закрома), то можно добиться почти 100%-й работы протокола. Цена при этом получилась слишком высока. В планах было заставить стабильно работать код с тактированием МК от внутреннего генератора на 4.0MHz.
Задача была следующая: т.к. Attiny2313 накоплено какое-то кол-во, пустить в дело как I^2C-исполнители (подчинённые, типа управление шаговым двигателем в простейшем узле), при этом с приличным для свободы действий куском программной памяти. Заставить работать USI - получилось, но как надо - так и не вышло.
В качестве тестера была использована "Arduino Nano" с частотой 16MHz и софтовая часть написанная в среде Ардуино.
Вопрос: у кого-нить получилось заставить работать USI подчинённым, с тактированием шины I^2C от мастера, на Attiny2313, на разных частотах и при тактировании МК от внутреннего генератора? Может упустил чего?
З.Ы. Следует заметить, что в "Atmel Studio 6.2", USI не поддерживается на предмет отладки полностью! Пройти по шагам и отыскать грабли не получится, т.к. сдвиговый регистр тупо не принимает данные с пина SDA. А в железе приём есть.
З.З.Ы. Код не выкладываю, т.к. удовлетворительного результата нет. Если у кого есть что-то рабочее, то поправлю у себя и поделюсь. Проблема в "трёх соснах" - конфигурации регистров USISR+USICR.
Если в голове каша, значит ваш котелок варит!
