Страница 1 из 6
Toggling the Pin
Добавлено: Ср авг 26, 2015 20:00:32
Dessp
Спасайте народ.
Угробил кучу времини на нахождение ошибки, а оно вот какое дело

((
контроллер attiny4313 datasheet:
Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a port.
супер удобная фишка, юзаю очень часто, ну типо:
sbi PINB,0
Так вот, недавно пришлось писать код под контроллер atmega8!!!!!
и вот нежданчик, там эта фишка не работает!!!!!!!!!! И не генерит даже ошибку при компиляции, фсиё типо ок, иди, пиши себе дальше код. А нифига, не работает....
Теперь вопрос. Какого фига они там в атмеле обкуренные все? как можно в одном контроллере такую фишку писания кода предусматривать а в другом нет?? дайте плиз разумное обяснение, я угробил дня 3 на это дело + 2 контроллера

Re: Toggling the Pin
Добавлено: Ср авг 26, 2015 20:10:32
ILYAUL
Они и дают . Называется DATASHEET
Re: Toggling the Pin
Добавлено: Чт авг 27, 2015 06:03:11
Kavka
Dessp, тини4313 с более свежим ядром, чем мега8.
В старом ядре упомянутой вами возможности нет, а в новых есть. Читайте описание портов В/В в спецификации на конкретный чип.
Re: Toggling the Pin
Добавлено: Чт авг 27, 2015 13:11:40
Engineer_Keen
Dessp писал(а):
и вот нежданчик, там эта фишка не работает!!!!!!!!!! И не генерит даже ошибку при компиляции, фсиё типо ок, иди, пиши себе дальше код. А нифига, не работает....
Компилятор ничего не знает про внутреннее устройство контроллера, он знает только команды, имена регистров и границы памяти (которые ему в inc файлах объяснили). Исключение некоторые команды (BREAK, MULxx, IJMP).
Ядро одно? Одно, значит в PIN можно писать, даже если это никак не повлияет на работу. Это тоже самое что запаять ногу PB0 на землю, потом в PORTB,PB0 записать "1" и при запуске проги благополучно спалить эту ногу. Зато даже если Atmel изобретет новый контроллер с этим ядром, нужно будет всего-лишь сделать новый inc-файл с описанием регистров, а не переписывать компилятор чтобы он знал какие аргументы можно использовать с какими командами в каждом конкретном контроллере, а какие нет.
Так что как выше писали - читайте даташит.
Re: Toggling the Pin
Добавлено: Сб авг 29, 2015 12:10:58
BOB51
Вообще-то запись в порт лапок (PINx) как-то противошерстно для АВРок, имеющих раздельные регистры направления, защелки выходных значений и значений конкретно физических выводов МК.
При "нормальном" подходе таких "казусов" не встречается.
А вот ежли привыкнуть к "оригинальному решению" исключительно для конкретной модификации кристалла то на переходе к "стандартному ряду" можно и фигвамс огресть...
конкретно:
и
в которой добавлена фишка "записи в PINx" по факту выполняющаяся не в выводы а в регистр PORTx (по сути аналогия записи в PORTx).

Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 12:45:57
Dessp
Как бы эта фишка намного облегчает жизнь.
Когда записываешь в PIN единицу, то выход ИНВЕРТИРУЕТСЯ.
В прот слуции надо сначало читать что у тебя там на ноге, потом инвертировать, а потом уже пихать в PORT. не?
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 13:30:49
BOB51
В некоторых приложениях удобнее содержимое буфера в порт пихать. Все операции с регистром файла РОН (или ОЗУ с пересылками), а вывод конечного продукта по требованию (маркеру времени/события).
Помимо прочего существует XOR - в приложении к АВРкам это будет EOR плюс представление порта как ячейки памяти.
Вобщем возможностей весьма много и в стандартном варианте.

Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 13:59:04
Андрей СШ
Но инверсия ноги записью в pin быстрее. Особенно если надо переключить больше одной.
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 15:04:53
ILYAUL
Андрей СШ писал(а):Но инверсия ноги записью в pin быстрее. Особенно если надо переключить больше одной.
Ну-ка ответь. Нач усл. PORTx = все единицы
Что быстрее OUT PORTx,zero или OUT PINx, FF
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 16:06:14
HardWareMan
ILYAUL писал(а):
Ну-ка ответь. Нач усл. PORTx = все единицы
Что быстрее OUT PORTx,zero или OUT PINx, FF
Ну-ка ответь. Нач усл. PORTx = 0xAA, требуется сделать 0x55
Что быстрее IN R16,PORTx/EOR R16,#0xFF/OUT PORTx,R16 или OUT PINx,0xFF?
Тогглинг на порту это супер, давно надо было сделать. И решение повесить его на запись в PINх тоже разумное решение, ИМХО.
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 17:30:57
Engineer_Keen
Вот теперь думаю, всего-то в inc-файле и в даташите обозвали бы его как-нибудь TOGGLEx, и путаницы бы не было, ну разве что самые внимательные углядели бы что у него адрес с PINx совпадает...
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 19:23:44
ILYAUL
HardWareMan писал(а):ILYAUL писал(а):
Ну-ка ответь. Нач усл. PORTx = все единицы
Что быстрее OUT PORTx,zero или OUT PINx, FF
Ну-ка ответь. Нач усл. PORTx = 0xAA, требуется сделать 0x55
Что быстрее IN R16,PORTx/EOR R16,#0xFF/OUT PORTx,R16 или OUT PINx,0xFF?
Тогглинг на порту это супер, давно надо было сделать. И решение повесить его на запись в PINх тоже разумное решение, ИМХО.
OUT PORTx,0x55
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 19:26:18
ARV
а никого не смущает, что в PORTx содержится одно, а фактически после "тогглинга" на выходах может быть другое?
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 19:37:25
ILYAUL
Для этого и придумали PINx , чтобы понимать , что писали в порт. Фишка toggling-ка в том , что надо постоянно следить , что при большом коде , можно запросто потерять счёт.
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 19:50:49
ARV
чтение PINx - это совсем не то же самое, что чтение PORTx, и придумали его как раз для того, чтобы считывать ВНЕШНИЕ сигналы, а не узнавать о ВНУТРЕННИХ.
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 20:03:44
ILYAUL
PORTx может быть и просажен т.ч его чтение для операций чтение-наложения маски -запись , не есть правильно. Эффект не предсказуем.
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 21:02:20
ARV
вы путаете: PORTx - это обычная защелка, что в нее вывели, то там и будет лежать, пока не перезапишут принудительно.
Re: Toggling the Pin
Добавлено: Ср сен 02, 2015 21:43:38
ILYAUL
Да , что-то подзабыл мат часть PINx реальный уровень на пине
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 02:24:25
Pnjom-Penb
ILYAUL писал(а):Ну-ка ответь. Нач усл. PORTx = все единицы. Что быстрее OUT PORTx,zero или OUT PINx, FF
HardWareMan писал(а):Ну-ка ответь. Нач усл. PORTx = 0xAA, требуется сделать 0x55. Что быстрее IN R16,PORTx/EOR R16,#0xFF/OUT PORTx,R16 или OUT PINx,0xFF?...
ILYAUL,
HardWareMan, ну-ка, ответьте оба - нужно
toggle'ить некоторые пины, а начальное их состояние
неизвестно - и чё делать тогда этими OUT'ами? Даже если бы они были в тысячу раз быстрее всех остальных инструкций...

Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 02:39:57
Андрей СШ
Бывают ситуации когда состояние пина не важно, а важен именно факт переключения (запись в PIN быстрее).
Бывают ситуации когда пин нужно переключить и состояние его известно (запись в PIN быстрее или равна по скорости).
Бывают ситуации когда состояние нужного пина известно, а остальных нет (запись в PIN быстрее).
Бывают ситуации, когда надо одновременно переключить два пина в противоположенных направлениях (запись в PIN быстрее).
Если состояние пина важно, но неизвестно, то переключать его не нужно. Это очевидно.
Никто никого не заставляет использовать запись в PIN если это не нужно или кому то не понятно.