Страница 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) как-то противошерстно для АВРок, имеющих раздельные регистры направления, защелки выходных значений и значений конкретно физических выводов МК.
При "нормальном" подходе таких "казусов" не встречается.
А вот ежли привыкнуть к "оригинальному решению" исключительно для конкретной модификации кристалла то на переходе к "стандартному ряду" можно и фигвамс огресть...
конкретно:
мега8_порт.GIF
(8.62 КБ) 313 скачиваний
и
тинька2313а_4313а.GIF
(8.43 КБ) 299 скачиваний
в которой добавлена фишка "записи в PINx" по факту выполняющаяся не в выводы а в регистр PORTx (по сути аналогия записи в PORTx).
8)

Re: Toggling the Pin

Добавлено: Ср сен 02, 2015 12:45:57
Dessp
Как бы эта фишка намного облегчает жизнь.
Когда записываешь в PIN единицу, то выход ИНВЕРТИРУЕТСЯ.
В прот слуции надо сначало читать что у тебя там на ноге, потом инвертировать, а потом уже пихать в PORT. не?

Re: Toggling the Pin

Добавлено: Ср сен 02, 2015 13:30:49
BOB51
В некоторых приложениях удобнее содержимое буфера в порт пихать. Все операции с регистром файла РОН (или ОЗУ с пересылками), а вывод конечного продукта по требованию (маркеру времени/события).
Помимо прочего существует XOR - в приложении к АВРкам это будет EOR плюс представление порта как ячейки памяти.
Вобщем возможностей весьма много и в стандартном варианте.
8)

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 если это не нужно или кому то не понятно.