Цитата(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 ;
// включить на выход ножку к прибору номер как значение переменной.
это возможно ? не могу придумать как.
Подскажите пожалуйста.
Тут лучше использовать не препроцессорные, а обычные макросы.
Примерно так
.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