реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Узнал новое о GPIO портах AVR
demiurg_spb
сообщение Oct 16 2012, 05:49
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 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);
Может кому-нибудь пригодится..


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
kovigor
сообщение Oct 16 2012, 07:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(demiurg_spb @ Oct 16 2012, 08:49) *
А так получается за один такт можно атомарно инвертировать несколько бит в порту например так PINA = (1<<7)|(1<<0);
Может кому-нибудь пригодится..

Интересно. Пока не вижу, где это можно использовать (зачем переключать в противоположное состояние пины, настроенные на ввод ?), но все равно спасибо ...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 16 2012, 07:42
Сообщение #3


неотягощённый злом
******

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



Цитата(kovigor @ Oct 16 2012, 11:31) *
зачем переключать в противоположное состояние пины, настроенные на ввод ?
Вы немного не поняли... Это касается не только пинов настроенных на ввод, но и на вывод тоже (независимо от состояния DDRx).

PORTx = 0xf0;
PINx = 0xff;
после этого PORTx станет 0x0f.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 16 2012, 07:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



lol.gif Ну вы и даёте. Это было уже в меге88 лет 6 назад.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 16 2012, 07:53
Сообщение #5


неотягощённый злом
******

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



Цитата(SasaVitebsk @ Oct 16 2012, 11:47) *
Так я и не говорю что это новая фича, просто не обращал на неё внимания ибо пользуюсь макросами Аскольда и всё меня устраивает.
А тут оказалось что произошли незамеченные мной изменения, которые могут быть использованы в благих целях.
Подумал что я не одинок в этом незнании (думал что нет смысла перечитывать даташиты в их базовых частях).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 16 2012, 08:04
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(kovigor @ Oct 16 2012, 10:31) *
Пока не вижу, где это можно использовать

Инвертирование одного пина за 2 такта вместо 3-х и группы пинов за 1 такт вместо 3-х. И всё это атомарно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 16 2012, 08:14
Сообщение #7


неотягощённый злом
******

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



Цитата(_Pasha @ Oct 16 2012, 12:04) *
Верное замечание.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 16 2012, 09:40
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Помоему они нашли свой баг и решили сделать из него себе большой ПЛЮС


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
V_G
сообщение Oct 16 2012, 12:51
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



В xmega-х изначально есть регистры OUTTGL и DIRTGL для переключения выходов и направления соответственно
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 16 2012, 20:45
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Ну в тех кусках, которые "ногодрыганием" должны сформировать за минимальное время строб (например, формирование клока 9-го бита SPI при использовании совместно с аппаратным или всех вместо аппаратного) - может пригодиться.

Сообщение отредактировал Genadi Zawidowski - Oct 16 2012, 20:45
Go to the top of the page
 
+Quote Post
LexaK
сообщение Oct 21 2012, 07:37
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 3-12-06
Из: Новороссийск
Пользователь №: 23 082



Цитата
Подумал что я не одинок в этом незнании (думал что нет смысла перечитывать даташиты в их базовых частях).
Верно. С каждым новым релизом даташиты раздуваются и увидеть в них пару новых строчек не всегда удается. Глянул даташит на Attiny2313 - там тоже такая фича есть. А я по-старинке использовал PORTx ^= 0x**

Сообщение отредактировал LexaK - Oct 21 2012, 07:38
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 21 2012, 11:50
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 атомарна.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 22 2012, 05:26
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 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...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 22 2012, 15:41
Сообщение #14


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 обсуждаемая фича все равно не работает.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 22 2012, 17:50
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Код
sbi PINx,n будет получше чем
ldi R, (1<<n)
out PINx,R

а sbi PORTX,N чем плох?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 15:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016