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

 
 
 
Reply to this topicStart new topic
> мигать светодиодом gpio
sergey sva
сообщение Jan 3 2014, 21:38
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Ка попроще мигать светодиодом что то типа такого gpio2 = ^= gpio2;
Подсмотрел пример для lpc43xx тут реализовано так (очень сложно, много букв )) )
Код
    if(bli != 0)
    {
        FIO_SetValue(2,1<<9);
        bli = 0;
    }else{
        FIO_ClearValue(2,1<<9);
        bli = 1;
    }

Go to the top of the page
 
+Quote Post
mantech
сообщение Jan 4 2014, 06:38
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Это кто такое пишет?? Я думал, только программисты СТ на такое способны biggrin.gif

#define InvBit(dat, bit) dat ^= (1<<(bit))

Пользуемся так - InvBit(GPIOB, 1); //инвертировать 1-й бит PORTB

Сообщение отредактировал Herz - Jan 4 2014, 09:28
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 4 2014, 08:24
Сообщение #3


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(mantech @ Jan 4 2014, 09:38) *
Это кто такое пишет?? Я думал, только программисты СТ на такое способны biggrin.gif

#define InvBit(dat, bit) dat ^= (1<<(bit))

Пользуемся так - InvBit(GPIOB, 1); //инвертировать 1-й бит PORTB


А что в этом не так?
И разве Ваш код подойдёт для ARM, где для установки/сброса пина используются разные регистры?

Например для LPC17xx я часто использую такой код:
Код
void invLED(void)
{
static int led_stat = 0;
if(led_stat)
{
led_stat = 0;
FIO0CLR = 1<<6;
}
else
{
led_stat = 1;
FIO0SET = 1<<6;
}
}



Найдите процедуру, разберитесь в ней и увидите что в итоге
Код
FIO_SetValue(2,1<<9);
преобразуется к виду
Код
FIO2SET = 1<<9;

Код
FIO_ClrValue(2,1<<9);
к виду
Код
FIO2CLR = 1<<9;

Go to the top of the page
 
+Quote Post
psL
сообщение Jan 4 2014, 08:52
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Код
bli?FIO_SetValue(2,bli--<<9):FIO_ClrValue(2,bli++<<9);

так короче?sm.gif
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 4 2014, 09:03
Сообщение #5


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(psL @ Jan 4 2014, 12:52) *
Код
bli?FIO_SetValue(2,bli--<<9):FIO_ClrValue(2,bli++<<9);

так короче?sm.gif


Короче, но не правильно. bli--<<9, bli++<<9 это для чего? Там всегда должно быть (1<<x) или любая другая битовая маска.
Если проблема только в длине записи кода, то тогда уж лучше так:
Код
static int bli = 0;
bli?FIO_SetValue(2,1<<9):FIO_ClrValue(2,1<<9);
bli ^= 0x1



На худой конец можно и так сделать:
Код
if(FIO2PIN&(1<<9)) FIO2CLR = 1<<9;
else FIO2SET = 1<<9;
Go to the top of the page
 
+Quote Post
psL
сообщение Jan 4 2014, 09:05
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390




а, ну да. Ошибся.

Сообщение отредактировал Herz - Jan 4 2014, 09:29
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 4 2014, 11:10
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Сделаю так, как подсказал mempfis_ как то эстетичней выглядит. ))
Код
static int bli = 0;
bli?FIO_SetValue(2,1<<9):FIO_ClrValue(2,1<<9);
bli ^= 0x1
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 5 2014, 00:16
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sergey sva @ Jan 4 2014, 13:10) *
Сделаю так, как подсказал mempfis_ как то эстетичней выглядит. ))

Вы это серьезно? Завести переменную чтобы хранить в ней значение другой переменной (бита порта) вы называете "эстетичнее"? У вас в Индии родственников нет случайно?
Я вот открыл user manual на LPC43xx и там английским по белому написано, что у LPC43xx есть специальный регистр для атомарного инвертирования ноги порта:
Код
GPIO1NOT = 1UL << bit;

Объясните, почему вместо чтения документации вы ищете готовые примеры сомнительного качества?

Вы бы хоть указали, какой именно у вас процессор. А то сначала упоминаете LPC43xx, а потом берете код для LPC17xx.

Цитата(mempfis_ @ Jan 4 2014, 10:24) *
И разве Ваш код подойдёт для ARM, где для установки/сброса пина используются разные регистры?
Надо внимательно читать документацию: обычно там есть не только отдельные регистры для установки и сброса. Все это для ARM:

для LPC2xxx
Код
IO1PIN ^= 1UL << bit

для ADuC70xx
Код
GP1DAT ^= 1UL << (bit + 16);

для AT91SAM7
Код
AT91C_BASE_PIOA->PIO_ODSR ^= 1UL << bit;

для LPC11xx, LPC13xx:
Код
LPC_GPIO1->MASKED_ACCESS[1UL << bit] ^= 1UL << bit;

с LPC17хx не приходилось сталкиваться, но должно работать так:
Код
FIO1PIN ^= 1UL << bit;



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 5 2014, 16:11
Сообщение #9


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Сергей Борщ @ Jan 5 2014, 03:16) *
Вы это серьезно? Завести переменную чтобы хранить в ней значение другой переменной (бита порта) вы называете "эстетичнее"? У вас в Индии родственников нет случайно?


Надо внимательно читать документацию: обычно там есть не только отдельные регистры для установки и сброса. Все это для ARM:

для LPC2xxx
Код
IO1PIN ^= 1UL << bit

с LPC17хx не приходилось сталкиваться, но должно работать так:
Код
FIO1PIN ^= 1UL << bit;


Спасибо что напомнили, но хамить не нужно (это я про индусов). В LPC43 действительно есть GPIO port toggle registers, который упрощает топикстартеру задачу.

UM LPC17 p. 127
GPIO port Pin valueregister FIOxPIN
This register provides the value of port pinsthat are configured to perform only digital
functions. The register will give the logic value of the pin regardless of whether the pin is
configured for input or output, or as GPIO or an alternate digital function.

Т.е. если на порту есть несколько цифровых функций, то применив код IO1PIN ^= 1UL << bit можно попасть на такой момент, когда IO1PIN считался, сразу после этого переферия изменила состояние порта (например UART или PWM), потом на значение IO1PIN наложилась маска и новое значение занеслось в IO1PIN. И мы потеряли требуемое состояние порта? Конечно можно запретить прерывания или использовать маскирование доступа (Fast GPIO port Mask register FIOxMASK). Но не все могут знать об эти подробностях (особенно новички, коим я был, когда придумал такой способ инвертирования бита порта).
Go to the top of the page
 
+Quote Post
mantech
сообщение Jan 5 2014, 16:52
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(mempfis_ @ Jan 5 2014, 20:11) *
то применив код IO1PIN ^= 1UL << bit можно попасть на такой момент, когда IO1PIN считался, сразу после этого переферия изменила состояние порта (например UART или PWM), потом на значение IO1PIN наложилась маска и новое значение занеслось в IO1PIN.


Конечно, все может быть, поэтому особенно новичкам советую почитать про атомарные и неатомарные операции...
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 5 2014, 17:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Слишком много букв, да еще и английских ))
А если серьезно то пропустил это мимо глаз, сейчас еще полистаю.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 6 2014, 00:49
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(mempfis_ @ Jan 5 2014, 18:11) *
Т.е. если на порту есть несколько цифровых функций, то применив код IO1PIN ^= 1UL << bit можно попасть на такой момент, когда IO1PIN считался, сразу после этого переферия изменила состояние порта (например UART или PWM),
Если на ногу порта включен вывод периферии, то запись в IOPIN на него влиять не будет и IO1PIN ^= 1UL << bit ничего плохого не сделает:
Цитата
Selection of a single function on a port pin excludes other peripheral functions available
on the same pin. However, the GPIO input stays connected and may be read by software
or used to contribute to the GPIO interrupt feature.



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 16:10
Рейтинг@Mail.ru


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