Динамическое изменение свойств портов

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Динамическое изменение свойств портов

Сообщение boobonick »

Здравствуйте, подскажите, пожалуйста, я делаю функцию, в которую хочу передавать значение в виде PORTN=0xN, где PORTN могут иметь разные буквы и в дальнейшем конфигурировать DDRN в этой функции, т.е.

void GoBackMotor(PortБуква=значение ) {

DDRБуква= значение2; // Настраиваем порт
PortБуква=значение; //И делаем работу

}


И вот не понятно, как это лучше реализовать, как массив передать PortБуква=значение, а потом вычленять букву со значением?
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: Динамическое изменение свойств портов

Сообщение Satyr »

В таком случае целесообразнее сделать макрос, а не функцию. тем более, что такого синтаксиса
void GoBackMotor(PortБуква=значение )
всеравно не будет

#define GoBackMotor(port, value) { DDR##port=value; PORT##port=value; }
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Динамическое изменение свойств портов

Сообщение ploop »

Любой порт - это цифра. Если посмотреть .inc файл для нужного контроллера, то увидим:

Код: Выделить всё

.equ	PORTD	= $0B		; - PORTD -
.equ	DDRD	= $0A
.equ	PIND	= $09	
.equ	PORTC	= $08		; - PORTC -
.equ	DDRC	= $07
.equ	PINC	= $06
.equ	PORTB	= $05		; - PORTB -
.equ	DDRB	= $04
.equ	PINB	= $03
(пример для меги48)

На ассемблере для этих целей я использовал обычные константы:

Код: Выделить всё

.equ led_run_port = PORTD 
---- где-то дальше ----
.equ led_run_ddr = led_run_port-1
.equ led_run_pin = led_run_port-2
Изменив первую строку мы переопределим порты во всей программе (разумеется, если там использовать имена констант)
Думаю, это можно делать динамически. А вот как - попробуйте и расскажите :)
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Динамическое изменение свойств портов

Сообщение ChipKiller »

И вот не понятно, как это лучше реализовать, как массив передать PortБуква=значение, а потом вычленять букву со значением?
... если честно, то непонятно для чего такие "извращения" :) !!!???
Сделать то можно, но только кроме общего замедления работы с портами и лишнего расхода Flash_a, вряд-ли чего получите ИМХО.

Код: Выделить всё

GoBackMotor(char port,unsigned char dir,unsigned char value){
		switch (port) {
			case 'A':
				PORTА = value;
				DDRА = dir; 	
			// ...........
			case 'B':
			// ......
		}
}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Динамическое изменение свойств портов

Сообщение Аlex »

С этой задачей элементарно справятся указатели, и никакой лишней флеши они не сожрут !
ТС, смотрите в сторону косвеной адресации.
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Динамическое изменение свойств портов

Сообщение Kavka »

Если касаемо gcc (win-avr), то полезно почитать вот тут: http://www.nongnu.org/avr-libc/user-man ... _port_pass
И про расход флэша, и про разные способы там есть...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
kolobok0
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

Re: Динамическое изменение свойств портов

Сообщение kolobok0 »

boobonick писал(а):...И вот не понятно, как это лучше реализовать, как массив передать PortБуква=значение...
как уже прозвучало выше.
лубой порт = может быть представлен адрессом памяти.
так что организовываете масив буква=адресс памяти
и адресуйтесь се на здоровье как к обычной памяти (подсказка старший байт всегда нуль :) ).
при этом подпрограмма универсальная - в одном экземпляре будет.

удачи вам
(круглый)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Динамическое изменение свойств портов

Сообщение Kavka »

Только надо учитывать, что как только sbi/cbi (исправил, было in/out) провращаются в load-modify-write конструкцию, и если есть побитовая модификация одного порта из основной программы и прерываний, то могут возникнуть ошибки выполнения (race conditions). Если, конечно, не предпринимать мер.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»