Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как передать имя порта в подпрограмму?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Igor26
Уважаемые коллеги! Вопрос следующий.
Есть много портов настроенных на вывод. Обрабатываются они все ОДИНАКОВО, но каждый в своё время.
Вопрос: как описать и передать в функцию имя порта. Что-то в таком роде:

FunctinPort(PORTD_Pin7)
{
//здесь значение порта много раз меняется
}

Не хочется для каждого порта писАть свой обработчик. Их аж 36.

P.S. Что-то подобное здесь уже мелькало, но найти не смог.
CSB
тута - http://electronix.ru/forum/index.php?showtopic=24041
rx3apf
Цитата(Igor26 @ Mar 2 2007, 21:45) *
Уважаемые коллеги! Вопрос следующий.
Есть много портов настроенных на вывод. Обрабатываются они все ОДИНАКОВО, но каждый в своё время.
Вопрос: как описать и передать в функцию имя порта. Что-то в таком роде:

FunctinPort(PORTD_Pin7)
{
//здесь значение порта много раз меняется
}

Не хочется для каждого порта писАть свой обработчик. Их аж 36.

P.S. Что-то подобное здесь уже мелькало, но найти не смог.

Передавать адрес и работать через ST, а не OUT ?
singlskv
А компилятор то какой ?
Это дело компиляторозависимое smile.gif
arttab
передавай адрес регистра порта. а как передать это компиляторозависимое
Igor26
Цитата(singlskv @ Mar 3 2007, 01:06) *
А компилятор то какой ?
Это дело компиляторозависимое smile.gif

IAR 4.20
singlskv
Код
//---- Макросы для чтения портов ввода

//   читаем порт по адресу addr; пример: ReadSFR((BYTE)(&PINB))
#define ReadSFR(addr) (*(volatile BYTE *)((WORD)addr))

//   читаем бит из порта по адресу addr; пример: ReadSFRbit((BYTE)(&PINB),1<<PINB3)
#define ReadSFRbit(addr,mask) ((*(volatile BYTE *)((WORD)addr))&mask ? 1 : 0)

//---- Макросы для записи портов вывода

//   пишем в порт по адресу addr, data - значение; пример: WriteSFR((BYTE)(&PORTB), 0xAA)
#define WriteSFR(addr,data) (*(volatile BYTE *)((WORD)addr)=(BYTE)data)

//   записываем биты в порт по адресу addr, mask - биты записать;
//     пример: WriteSFRsetbit((BYTE)(&PORTB),1<<PORTB3)
#define WriteSFRsetbit(addr,mask) ((*(volatile BYTE *)((WORD)addr))|=mask)

//   стираем биты в порту по адресу addr, mask - биты стереть;
//     пример: WriteSFRclrbit((BYTE)(&PORTB),1<<PORTB3)
#define WriteSFRclrbit(addr,mask) ((*(volatile BYTE *)((WORD)addr))&=~mask)

соответственно можете переделать на функции
только макросами быстрее
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.