|
Узнал новое о GPIO портах AVR |
|
|
|
Oct 16 2012, 05:49
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата из даташита на atmega1281 Цитата 13.2.2 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. Забавно, но в достаточно свежих мегах эта фича есть, а в старых мегах типа mega16,64,128 не было, поэтому не обращал внимания. А так получается за один такт можно атомарно инвертировать несколько бит в порту например так PINA = (1<<7)|(1<<0); Может кому-нибудь пригодится..
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 16 2012, 07:42
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(kovigor @ Oct 16 2012, 11:31)  зачем переключать в противоположное состояние пины, настроенные на ввод ? Вы немного не поняли... Это касается не только пинов настроенных на ввод, но и на вывод тоже (независимо от состояния DDRx). PORTx = 0xf0; PINx = 0xff; после этого PORTx станет 0x0f.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 16 2012, 07:53
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(SasaVitebsk @ Oct 16 2012, 11:47)  Так я и не говорю что это новая фича, просто не обращал на неё внимания ибо пользуюсь макросами Аскольда и всё меня устраивает. А тут оказалось что произошли незамеченные мной изменения, которые могут быть использованы в благих целях. Подумал что я не одинок в этом незнании (думал что нет смысла перечитывать даташиты в их базовых частях).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 21 2012, 07:37
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 3-12-06
Из: Новороссийск
Пользователь №: 23 082

|
Цитата Подумал что я не одинок в этом незнании (думал что нет смысла перечитывать даташиты в их базовых частях). Верно. С каждым новым релизом даташиты раздуваются и увидеть в них пару новых строчек не всегда удается. Глянул даташит на Attiny2313 - там тоже такая фича есть. А я по-старинке использовал PORTx ^= 0x**
Сообщение отредактировал LexaK - Oct 21 2012, 07:38
|
|
|
|
|
Oct 21 2012, 11:50
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Вот в этом pin_macros.h я стараюсь поддерживать список PORT_TOGGLE_BY_PIN_WRITE актуальным. В старом варианте я ещё не думал, что они подсунут mega8A и подобные, которые пойдут новым define-ом. И выделял список старых, которые не поддерживают, считая, что новые уже будут все поддерживать. На случай mega8B :-) сразу перевёл на выделение поддерживающих, так как несвоевременное добавление нового поддерживающего в этом случае приведет к росту кода, но не к потере работоспособности. Да, хть это и не в эту тему, но в тех портах scmRTOS можно писать Код { #ifndef PIN_TOGGLE_BY_PORT_WRITE TCritSect cs; #endif CPL(SOME_PIN); } так как инверися через PIN атомарна.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 22 2012, 05:26
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ReAl @ Oct 21 2012, 15:50)  я стараюсь поддерживать список PORT_TOGGLE_BY_PIN_WRITE актуальным Неблагодарная работа. Поддержкой этого дефайна должен avr-libc заниматься. ИМХО. А Вы правы, так оптимальнее выходит Код # define PM_CPL(port,bit,val) (PIN##port |= (1 << (bit))) нежели Код # define PM_CPL(port,bit,val) (PIN##port = (1 << (bit))) sbi PINx,n будет получше чем ldi R, (1<<n) out PINx,R Остаётся подумать над тем, что всегда-ли PINx лежит в области применимости инструкции sbi, а то можно немного доработать макросы и проверять этот момент чтобы не хватануть вариант с lds ori sts...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 22 2012, 15:41
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(demiurg_spb @ Oct 22 2012, 08:26)  Неблагодарная работа. Поддержкой этого дефайна должен avr-libc заниматься. Ну это надо выйти с предложением, аргументировать, ... Добиваться, короче :-) Я вот на друге никак не решусь — большинство h-файлов несвоместимы с компиляцией в режиме ассемблера. Через avr/io.h можно получить все SFR и вектора, а вот константы для WDT, Sleep mode, прескалера такта ядра, ... — или вообще enum, или даже если define, то в этом файле не охвачено #ifndef __ASSEMBLER__ -ом всякие inline-функции и т.п. А я иногда на асме пишу :-) Надо как-то по мере необходимости для себя править файлы, а потом предложить патч. Цитата(demiurg_spb @ Oct 22 2012, 08:26)  Остаётся подумать над тем, что всегда-ли PINx лежит в области применимости инструкции sbi, Пока всегда. Даже у mega64/mega128 для порта F -- это пока единственный порт, у которого PIN/PORT/DDR находятся не рядом, да еще и PORT/DDR сидят как раз под LDS/STS -- PINF внизу, по адресу 0. Тяжкое наследие mega103. Но для m64/m128 обсуждаемая фича все равно не работает.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|