Здравствуйте, подскажите, пожалуйста, я делаю функцию, в которую хочу передавать значение в виде PORTN=0xN, где PORTN могут иметь разные буквы и в дальнейшем конфигурировать DDRN в этой функции, т.е.
void GoBackMotor(PortБуква=значение ) {
DDRБуква= значение2; // Настраиваем порт
PortБуква=значение; //И делаем работу
}
И вот не понятно, как это лучше реализовать, как массив передать PortБуква=значение, а потом вычленять букву со значением?
Динамическое изменение свойств портов
- Реклама
Re: Динамическое изменение свойств портов
В таком случае целесообразнее сделать макрос, а не функцию. тем более, что такого синтаксиса
void GoBackMotor(PortБуква=значение )
всеравно не будет
#define GoBackMotor(port, value) { DDR##port=value; PORT##port=value; }
void GoBackMotor(PortБуква=значение )
всеравно не будет
#define GoBackMotor(port, value) { DDR##port=value; PORT##port=value; }
Re: Динамическое изменение свойств портов
Любой порт - это цифра. Если посмотреть .inc файл для нужного контроллера, то увидим:
(пример для меги48)
На ассемблере для этих целей я использовал обычные константы:
Изменив первую строку мы переопределим порты во всей программе (разумеется, если там использовать имена констант)
Думаю, это можно делать динамически. А вот как - попробуйте и расскажите
Код: Выделить всё
.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
На ассемблере для этих целей я использовал обычные константы:
Код: Выделить всё
.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: Динамическое изменение свойств портов
... если честно, то непонятно для чего такие "извращения"И вот не понятно, как это лучше реализовать, как массив передать 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: Динамическое изменение свойств портов
С этой задачей элементарно справятся указатели, и никакой лишней флеши они не сожрут !
ТС, смотрите в сторону косвеной адресации.
ТС, смотрите в сторону косвеной адресации.
- Реклама
Re: Динамическое изменение свойств портов
Если касаемо gcc (win-avr), то полезно почитать вот тут: http://www.nongnu.org/avr-libc/user-man ... _port_pass
И про расход флэша, и про разные способы там есть...
И про расход флэша, и про разные способы там есть...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Динамическое изменение свойств портов
как уже прозвучало выше.boobonick писал(а):...И вот не понятно, как это лучше реализовать, как массив передать PortБуква=значение...
лубой порт = может быть представлен адрессом памяти.
так что организовываете масив буква=адресс памяти
и адресуйтесь се на здоровье как к обычной памяти (подсказка старший байт всегда нуль
при этом подпрограмма универсальная - в одном экземпляре будет.
удачи вам
(круглый)
Re: Динамическое изменение свойств портов
Только надо учитывать, что как только sbi/cbi (исправил, было in/out) провращаются в load-modify-write конструкцию, и если есть побитовая модификация одного порта из основной программы и прерываний, то могут возникнуть ошибки выполнения (race conditions). Если, конечно, не предпринимать мер.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)


