SergeyVas 0 3 января, 2014 Опубликовано 3 января, 2014 · Жалоба Ка попроще мигать светодиодом что то типа такого gpio2 = ^= gpio2; Подсмотрел пример для lpc43xx тут реализовано так (очень сложно, много букв )) ) if(bli != 0) { FIO_SetValue(2,1<<9); bli = 0; }else{ FIO_ClearValue(2,1<<9); bli = 1; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 4 января, 2014 Опубликовано 4 января, 2014 (изменено) · Жалоба Это кто такое пишет?? Я думал, только программисты СТ на такое способны #define InvBit(dat, bit) dat ^= (1<<(bit)) Пользуемся так - InvBit(GPIOB, 1); //инвертировать 1-й бит PORTB Изменено 4 января, 2014 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Это кто такое пишет?? Я думал, только программисты СТ на такое способны #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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psL 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба bli?FIO_SetValue(2,bli--<<9):FIO_ClrValue(2,bli++<<9); так короче?:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба bli?FIO_SetValue(2,bli--<<9):FIO_ClrValue(2,bli++<<9); так короче?:) Короче, но не правильно. 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psL 0 4 января, 2014 Опубликовано 4 января, 2014 (изменено) · Жалоба а, ну да. Ошибся. Изменено 4 января, 2014 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Сделаю так, как подсказал mempfis_ как то эстетичней выглядит. )) static int bli = 0; bli?FIO_SetValue(2,1<<9):FIO_ClrValue(2,1<<9); bli ^= 0x1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Сделаю так, как подсказал mempfis_ как то эстетичней выглядит. )) Вы это серьезно? Завести переменную чтобы хранить в ней значение другой переменной (бита порта) вы называете "эстетичнее"? У вас в Индии родственников нет случайно? Я вот открыл user manual на LPC43xx и там английским по белому написано, что у LPC43xx есть специальный регистр для атомарного инвертирования ноги порта: GPIO1NOT = 1UL << bit; Объясните, почему вместо чтения документации вы ищете готовые примеры сомнительного качества? Вы бы хоть указали, какой именно у вас процессор. А то сначала упоминаете LPC43xx, а потом берете код для LPC17xx. И разве Ваш код подойдёт для 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Вы это серьезно? Завести переменную чтобы хранить в ней значение другой переменной (бита порта) вы называете "эстетичнее"? У вас в Индии родственников нет случайно? Надо внимательно читать документацию: обычно там есть не только отдельные регистры для установки и сброса. Все это для 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). Но не все могут знать об эти подробностях (особенно новички, коим я был, когда придумал такой способ инвертирования бита порта). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба то применив код IO1PIN ^= 1UL << bit можно попасть на такой момент, когда IO1PIN считался, сразу после этого переферия изменила состояние порта (например UART или PWM), потом на значение IO1PIN наложилась маска и новое значение занеслось в IO1PIN. Конечно, все может быть, поэтому особенно новичкам советую почитать про атомарные и неатомарные операции... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Слишком много букв, да еще и английских )) А если серьезно то пропустил это мимо глаз, сейчас еще полистаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 января, 2014 Опубликовано 6 января, 2014 · Жалоба Т.е. если на порту есть несколько цифровых функций, то применив код 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться