Цитата(Potter @ Oct 31 2006, 00:41)

Вопрос собственно в следующем.... Работаю в компиляторе IAR 4.02A.... Для меги 16 прекрасно работали такие команды как PORTC_Bit0, DDRC_Bit6 = 0x1; PINC_Bit6... В меге 64 эти команды тоже работают только для некоторых портов.... А для порта скажем F не работают.... Подскажите пожалуйста почему и что надо зделать что б они заработали?
Осмелюсь предположить, что порт F не влез в io address space, поэтому для него не работают команды cbi, sbi. Во избежание подобных сюрпризов можно приучить себя пользоваться конструкциями
Код
PORTC &= ~(1<<0);
DDRC |= (1<<0)
а чтобы было совсем красиво, позволю себе привести здесь очень полезный файл имени Аскольда Волкова:
Код
// *****************************************
// **** ****
// **** I/O bits altering macros ****
// **** Idea by Ascold Volkov ****
// **** ****
// *****************************************
#ifndef ASCOLD_H__
#define ASCOLD_H__
#ifdef __IAR_SYSTEMS_ICC__
#if defined(AT91SAM7S64) || defined(AT91SAM7S128)
#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_PDSR & (1 << bit)))
#define _bitH(port,bit) ( AT91C_BASE_PIO##port##->PIO_PDSR & (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)
#elif defined(LPC2119) || defined(LPC2129)
#define _setL(port,bit) do { IO##port##CLR = (1 << bit); } while(0)
#define _setH(port,bit) do { IO##port##SET = (1 << bit); } while(0)
#define _clrL(port,bit) do { IO##port##SET = (1 << bit); } while(0)
#define _clrH(port,bit) do { IO##port##CLR = (1 << bit); } while(0)
#define _bitL(port,bit) (!(IO##port##PIN & (1 << bit)))
#define _bitH(port,bit) ( IO##port##PIN & (1 << bit))
#define _cpl(port,bit,val) do { IO##port##PIN ^= (1 << bit); } while(0)
#define _dir_out(port,bit,val) do { IO##port##DIR |= (1 << bit); } while(0)
#define _dir_in(port,bit,val) do { IO##port##DIR &= ~(1 << bit); } while(0)
#elif defined(ADuC7020) || defined(ADuC7021)|| defined(ADuC7022)|| defined(ADuC7024)|| defined(ADuC7025)|| defined(ADuC7026)|| defined(ADuC7027)
#define _setL(port,bit) do { GP##port##CLR = (1 << (bit + 16)); } while(0)
#define _setH(port,bit) do { GP##port##SET = (1 << (bit + 16)); } while(0)
#define _clrL(port,bit) do { GP##port##SET = (1 << (bit + 16)); } while(0)
#define _clrH(port,bit) do { GP##port##CLR = (1 << (bit + 16)); } while(0)
#define _bitL(port,bit) (!(GP##port##DAT & (1 << bit)))
#define _bitH(port,bit) ( GP##port##DAT & (1 << bit))
#define _cpl(port,bit,val) do { GP##port##DAT ^= (1 << (bit + 16)); } while(0)
#define _dir_out(port,bit,val) do { GP##port##DAT |= (1 << (bit + 24)); } while(0)
#define _dir_in(port,bit,val) do { GP##port##DAT &= ~(1 << (bit + 24)); } while(0)
#else // MSP430, AVR etc.
#define _setL(port,bit) do { port &= ~(1 << bit); } while(0)
#define _setH(port,bit) do { port |= (1 << bit); } while(0)
#define _clrL(port,bit) do { port |= (1 << bit); } while(0)
#define _clrH(port,bit) do { port &= ~(1 << bit); } while(0)
#define _bitL(port,bit) (!(port & (1 << bit)))
#define _bitH(port,bit) (port & (1 << bit))
#define _cpl(port,bit,val) do {port ^= (1 << bit); } while(0)
#endif
#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 _clr(port,bit,val) _clr##val(port,bit)
#define off(x) _clr (x)
#define _bit(port,bit,val) _bit##val(port,bit)
#define signal(x) _bit (x)
#define cpl(x) _cpl (x)
#endif // __IAR_SYSTEMS_ICC__
#endif // ASCOLD_H__
пример использования:
Код
#define LED PORTC,2,H // active high
#define TEST PORTD,3,L // active low
#define MANUAL_PROG PINB,5,L
void main() {
for(;;) {
cpl(TEST);
if(signal(MANUAL_PROG))
on(LED);
else
off(LED);
}
}
И пусть у компилятора голова болит о портах и размерах адресных пространств, а также какой уровень у меня обозначает "включено" - ноль или единица.