Potter 0 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба Вопрос собственно в следующем.... Работаю в компиляторе IAR 4.02A.... Для меги 16 прекрасно работали такие команды как PORTC_Bit0, DDRC_Bit6 = 0x1; PINC_Bit6... В меге 64 эти команды тоже работают только для некоторых портов.... А для порта скажем F не работают.... Подскажите пожалуйста почему и что надо зделать что б они заработали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 30 октября, 2006 Опубликовано 30 октября, 2006 · Жалоба Вопрос собственно в следующем.... Работаю в компиляторе 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); } } И пусть у компилятора голова болит о портах и размерах адресных пространств, а также какой уровень у меня обозначает "включено" - ноль или единица. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба может режим совместимости с 103 включен и чать перефирии стала недоступной? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Potter 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба может режим совместимости с 103 включен и чать перефирии стала недоступной? Подскажите пожалуйста что такое 103? И как его отключить(включить)? Осмелюсь предположить, что порт F не влез в io address space, поэтому для него не работают команды cbi, sbi. Во избежание подобных сюрпризов можно приучить себя пользоваться конструкциями PORTC &= ~(1<<0); DDRC |= (1<<0) а чтобы было совсем красиво, позволю себе привести здесь очень полезный файл имени А как будет выглядеть такая конструкция для команды I = PINC_Bit2? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба По умолчанию мега 64 прикидывается мегой 103. Чтобы сделать ее мегой 64 с активацией ряда функций присущих меге 64 надо подправить соответствующий фуз. Бит проверить: #define bit3 3 if((PINC & (1<<bit3)) == 0) { ... } else { ... } Или #define bit3 (PINC & (1<<bit3)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Potter 0 31 октября, 2006 Опубликовано 31 октября, 2006 · Жалоба Убрал бит M103C и все заработало.... Всем большле спасибо за помощь.... Во блин сколько подводных камней при переходе на конроллер с которым не разу не рабботал.... Сначала программатор не работал.... Потом этот бит M103C.... Я конечно понимаю что есть даташит и в нем все написанно... Но допустим таких проблем у меня не было при переходе с меги 8 на мегу 16.... То есть я хачу сказать что не изучать же весь даташит на новый конроллер (на котроллер с которым не разу не работал).... Учитывая что очень большой объем информации у всех даташитов одинаков.... Ну собствено спасибо.... Думаю что больше проблем не будет... Но если что я буду еще писать.... Хотя кто знает с какими (очевидными) подводными камнями мне еще предстоит столкнуться просьба написать об этом... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться