Цитата(evgforum @ Jun 6 2006, 13:04)

Цитата
И ногами дергал через макросы on() off() имени Аскольда Волкова.
Что это?
В 2000г Аскольд Волков посылал в конференцию ru.embedded свои макросы работы с портами для AVR. А это творческая переработка:
Код
#ifndef ASCOLD_SAM7_H__
#define ASCOLD_SAM7_H__
#ifdef __IAR_SYSTEMS_ICC__
#define _setL(port,bit) do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)
#define _setH(port,bit) do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)
#define _clrL(port,bit) do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)
#define _clrH(port,bit) do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)
#define _bitL(port,bit) (!(AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit)))
#define _bitH(port,bit) ( AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit))
#define _cpl(port,bit,val) do { AT91C_BASE_PIO##port##->PIO_ODSR ^= (1<<bit); } while(0)
#define _dir_out(port,bit,val) do { AT91C_BASE_PIO##port##->PIO_OER = (1<<bit); } while(0)
#define _dir_in(port,bit,val) do { AT91C_BASE_PIO##port##->PIO_ODR = (1<<bit); } while(0)
#define dir_out(x) _dir_out (x)
#define dir_in(x) _dir_in (x)
#define _set(port,bit,val) _set##val(port,bit)
#define on(x) _set (x)
#define SET _setH
#define _clr(port,bit,val) _clr##val(port,bit)
#define off(x) _clr (x)
#define CLR _clrH
#define _bit(port,bit,val) _bit##val(port,bit)
#define signal(x) _bit (x)
#define BIT _bitH
#define cpl(x) _cpl (x)
#endif // __IAR_SYSTEMS_ICC__
#endif //ASCOLD_SAM7_H__
Вот его комментарий по использованию:
Цитата
Макросы SET,CLR,BIT и CPL служат для работы со стандартными SFRами,
описанными в стандартных заголовках. А для своих собственных определений я
использую on,off,signal и cpl.
Пример использования:
#define Pin1 PORTD,5,H /* бит 5 порта PORTD, активный уровень высокий */
#define Pin2 PINA,3,L /* бит 3 порта PINA, активный уровень низкий */
...
if(signal(Pin2))
on(Pin1);
else
off(Pin1);
Ну идею ты, наверное, понял. Описание активного уровня я добавил для большей наглядности, а также потому, что изменение полярности сигнала при модификации случается не реже,чем перестановка ножек.
Ну а для AT91 это будет выглядеть так:
Код
#define LED A,0,H // PIOA, bit 0, active high
#define KEY A,20,L // PIOA, bit 20, active low
if(signal(KEY))
on(LED);
else
off(LED);
Цитата
Хотя с Самбой все работает.
А как прошиваете?
Из IAR C-SPY через JTAG.