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

 
 
> #define - как применить правильно ?
Shurmas
сообщение Aug 17 2006, 14:58
Сообщение #1


Местный
***

Группа: Новичок
Сообщений: 232
Регистрация: 24-06-06
Пользователь №: 18 332



прошу совета.

Мне нужно управлять (подавать "1" или "0") 6-ю приборами с 6 ног мега16.

Хочу чтоб в верху программы были дефайны типа

#define PRIBOR(1) (тут порт и номер ноги к которой подключен)
и так 6 строчек. Но не могу понять что там писать ? Ведь нужна возможность писать и разные порты. И как потом в программе управлять DDR - хотя бы раз чтоб сделать соотв. ножки выходами ?
если я в дефайнах пропишу PORTx.x то как управлять DDRx ? или только 12 дефайнами решается ?

Компилер IAR или WinAVR но можно и под другой.

в идеале нужно чтоб можно бы так управлять

PRIBOR(переменная номер нужного прибора) = 1;
// выдать "1" на прибор номер как значение переменной.


PRIBOR(переменная номер нужного прибора) = OUT ;
// включить на выход ножку к прибору номер как значение переменной.

это возможно ? не могу придумать как.

Подскажите пожалуйста.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Guest_Цыкетчик_*
сообщение Sep 24 2008, 10:37
Сообщение #2





Guests






Цитата(Shurmas @ Aug 17 2006, 18:58) *
прошу совета.

Мне нужно управлять (подавать "1" или "0") 6-ю приборами с 6 ног мега16.

Хочу чтоб в верху программы были дефайны типа

#define PRIBOR(1) (тут порт и номер ноги к которой подключен)
и так 6 строчек. Но не могу понять что там писать ? Ведь нужна возможность писать и разные порты. И как потом в программе управлять DDR - хотя бы раз чтоб сделать соотв. ножки выходами ?
если я в дефайнах пропишу PORTx.x то как управлять DDRx ? или только 12 дефайнами решается ?

Компилер IAR или WinAVR но можно и под другой.

в идеале нужно чтоб можно бы так управлять

PRIBOR(переменная номер нужного прибора) = 1;
// выдать "1" на прибор номер как значение переменной.
PRIBOR(переменная номер нужного прибора) = OUT ;
// включить на выход ножку к прибору номер как значение переменной.

это возможно ? не могу придумать как.

Подскажите пожалуйста.

Тут лучше использовать не препроцессорные, а обычные макросы.
Примерно так biggrin.gif
.macro Pribor
; Пример для ATmega128 у которой некоторые регистры управления портами
; расположены в пространстве дополнительных РВВ
; Номера разрядов и имена портов взяты произвольно (так как автор темы не указал их)
; @0 - номер прибора
; @1 - требуемое состояние пина, управляющего прибором

.if @0 > 6
.error "Ошибка: номер прибора больше 6-ти."
.endif

.if @0 == 1
.set Number_of_Digit = 6
.set DDR_Addres = DDRF
.set PORT_Addres = PORTF
.endif

.if @0 == 2
.set Number_of_Digit = 3
.set DDR_Addres = DDRF
.set PORT_Addres = PORTF
.endif

.if @0 == 3
.set Number_of_Digit = 5
.set DDR_Addres = PORTF
.set PORT_Addres = PORTF
.endif

.if @0 == 4
.set Number_of_Digit = 0
.set DDR_Addres = DDRD + $20
.set PORT_Addres = PORTD + $20
.endif

.if @0 == 5
.set Number_of_Digit = 4
.set DDR_Addres = DDRD + $20
.set PORT_Addres = PORTD + $20
.endif

.if @0 == 6
.set Number_of_Digit = 1
.set DDR_Addres = DDRD + $20
.set PORT_Addres = PORTD + $20
.endif

; Запрограммировать пин на вывод
lds R16 , DDR_Addres
sbr R16 , ( 1 << Number_of_Digit )
sts DDR_Addres , R16

; Установить нужный логический уровень на пине
lds R16 , PORT_Addres
.if @1 = 0
cbr R16 , ( 1 << Number_of_Digit ) ; Выставили '0' на пине
.else
sbr R16 , ( 1 << Number_of_Digit ) ; Выставили '1' на пине
.endif
sts PORT_Addres , R16

.endmacro

.........................
.........................
.........................

; Установить '1' на пине, управляющем прибором №3
Pribor 3, 1

.........................
.........................
; Установить '0' на пине, управляющем прибором №6
Pribor 6, 0


Сообщение отредактировал Цыкетчик - Sep 24 2008, 10:43
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 13:14
Рейтинг@Mail.ru


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