Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Наиболее удобно имхо мне показал один Гуру. В смысле наибольший уровень абстракции >>

Отправлено VasilyS 16 ноября 2008 г. 13:27
В ответ на: to VasilyS: а PORTA = 0x23 лучше что ли ?! отправлено MegaJohn 16 ноября 2008 г. 02:42


Для ИАР AVR.Делаю файл.h, который виден во всех .с файлах
В нем макросы установки, сброса, и т.п. бит:
/////////////////////////////////////////////////////////
// Set bit
#define _SET_BIT(port, pin) (port |= (1<<##pin))
#define SET_BIT(bit) _SET_BIT(bit)

// Clr bit
#define _CLR_BIT(port, pin) (port &= ~(1<<##pin))
#define CLR_BIT(bit) _CLR_BIT(bit)

// Toggle bit
#define _TGL_BIT(port, pin) (port ^= (1<<##pin))
#define TGL_BIT(bit) _TGL_BIT(bit)

// Опрос бита
#define _OPROS_PIN(inp_pin, pin) (inp_pin & (1<<##pin))
#define OPROS_PIN(bit) _OPROS_PIN(bit)

//////////////////////////////////////////
Далее в этом же файле описываю биты портов. Пример для порта В, остальные аналогично.
ЧТОБЫ ИЗМЕНИТЬ ИМЯ ИЛИ МЕСТОПОЛОЖЕНИЕ БИТА ДОСТАТОЧНО
ИЗМЕНИТЬ ЗАПИСИ ВОТ В ЭТОМ СПИСКЕ !!!!!
/**** Port B ***/
/* бит 0 */
#define RESET_FLASH PORTB,0 /*имя порта, номер бита*/
#define dRESET_FLASH DDRB,0 /*имя DDR, номер бита*/
#define DDRB_0 1 /*состояние DDRn при инициализации*/
#define PRTB_0 1 /*состояние PORTn при инициализации*/
/* бит 1 */
#define SCK_FLASH PORTB,1
#define dSCK_FLASH DDRB,1
#define DDRB_1 1
#define PRTB_1 1
/* бит 2 */
#define MOSI_FLASH PORTB,2
#define dMOSI_FLASH DDRB,2
#define DDRB_2 1
#define PRTB_2 1
/* бит 3 */
#define MISO_FLASH PORTB,3
#define pinMISO_FLASH PINB,3 /*опрашиваемый пин*/
#define dMISO_FLASH DDRB,3
#define DDRB_3 0
#define PRTB_3 1
/* бит 4 */
/* не используется в проекте, имя отсутствует */
#define DDRB_4 0
#define PRTB_4 1
/* бит 5 */
/* не используется в проекте, имя отсутствует */
#define DDRB_5 0
#define PRTB_5 1
/* бит 6 */
/* не используется в проекте, имя отсутствует */
#define DDRB_6 0
#define PRTB_6 1
/* бит 7 */
/* не используется в проекте, имя отсутствует */
#define DDRB_7 1
#define PRTB_7 0
/**********/
/////////////////////////////////////////////////////////
Биты описали, теперь поясню зачем макросы для инициализации:
#define DDRB_0 1 /*состояние DDRn при инициализации*/
#define PRTB_0 1 /*состояние PORTn при инициализации*/
Это чтобы не побитно инициализовывать порт, а сразу байтом.
Для этого пишу еще инициализационные макросы.
Пример инициализации DDRB и PORTB, остальные аналогично:
#define DDRB_INIT ( DDRB = \
(DDRB_7 << 7) + \
(DDRB_6 << 6) + \
(DDRB_5 << 5) + \
(DDRB_4 << 4) + \
(DDRB_3 << 3) + \
(DDRB_2 << 2) + \
(DDRB_1 << 1) + \
(DDRB_0 << 0) )
#define PORTB_INIT ( PORTB = \
(PRTB_7 << 7) + \
(PRTB_6 << 6) + \
(PRTB_5 << 5) + \
(PRTB_4 << 4) + \
(PRTB_3 << 3) + \
(PRTB_2 << 2) + \
(PRTB_1 << 1) + \
(PRTB_0 << 0) )
////////////////////////////////////////////////
Все, подвожу черту, больше нам ничего не понадобится, конец Н-файла.
///////////////////////////////////////////
///////////////////////////////////////////
Теперь проект.
main()
..............
// инициализцую порты
......
DDRB_INIT;
PORTB_INIT;
и так же все другие порты.
..................
А вот теперь - как ставить и чистить биты:
SET_BIT( MOSI_FLASH );

SET_BIT( dMOSI_FLASH );

SET_BIT( MISO_FLASH );

CLR_BIT( dMISO_FLASH );

SET_BIT( RESET_FLASH );

SET_BIT( dRESET_FLASH );
if( !(OPROS_PIN(pinI_O_KLAV)) )
.................
//////////////////////////
Чем это удобно? Чтобы перебросить биты, например MOSI перебросить на вывод D.7, достаточно в .H файле перебросить его имя и описание c порта В на нужное место порта D, например теперь стало.
/* PORT D*/
/* бит 7 */
#define MOSI_FLASH PORTD,7
#define dMOSI_FLASH DDRD,7
#define DDRD_7 1
#define PRTD_7 1
А в исходнике проекта все остается неизменным. Мне нравится так. Во всех проектах таскаю этот .Н файл, только изменяю имена и местоположение бит для конкретного проекта.


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
сложите 2 и 3:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru