Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по работе с битами в WINAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
sherr
Как сделать, чтобы в WINAVR можно было бы работать с отдельными битами аналогично
CVAVR например PORTD.5=0 . Где-то видел готовый хидер для этого, но,увы...
не могу найти. Также интересут другие подобные хидеры облегчающие переход между
различными версиями компиляторов С для AVR.
SasaVitebsk
Цитата(sherr @ Jan 20 2007, 23:44) *
Как сделать, чтобы в WINAVR можно было бы работать с отдельными битами аналогично
CVAVR например PORTD.5=0 . Где-то видел готовый хидер для этого, но,увы...
не могу найти. Также интересут другие подобные хидеры облегчающие переход между
различными версиями компиляторов С для AVR.


Насколько программисты ратуют за "облегчение перехода с компилятора на компилятор", настолько производители компиляторов пытаются усложнить данную задачу и сделать переход более неудобным. biggrin.gif И их где-то можно понять.

С другой стороны, по-моему данная проблема (перехода) интересует только преподавателей и людей неопределившихся. Вторые делают переход как правило один - два раза. И если они ещё неопределились, то у них, как правило, ещё мало наработанных программ.

Теперь по сути вопроса.
Сам я пишу на IAR. Там есть такая возможность. Она описана в документации на компилятор.

Код
__io union {
                    unsigned char PORTE;
                    struct {
                                unsigned char PE0:1,
                                                     PE1:1,
                                                     PE2:1,
                                                     PE3:1,
                                                     PE4:1,
                                                     PE5:1,
                                                     PE6:1,
                                                     PE7:1;
                    }
                } @0x1f;
.......
PORTE.PE0 =0;
.......
PORTE = 15;
.....


Но мне кажется, что чаще пользуются более простым способом. И он более универсален. Иными словами, в следующий раз Вам не придётся искать способ перехода на другой компилятор.

PORTD &= ~(1<<5); Можно сделать макрос.
Сергей Борщ
Цитата(sherr @ Jan 20 2007, 21:44) *
Также интересут другие подобные хидеры облегчающие переход между различными версиями компиляторов С для AVR.
Вот тут выложил один из вариантов, с комментариями по применению: http://electronix.ru/forum/index.php?s=&am...st&p=199555
defunct
Цитата
С другой стороны, по-моему данная проблема (перехода) интересует только преподавателей и людей неопределившихся. Вторые делают переход как правило один - два раза. И если они ещё неопределились, то у них, как правило, ещё мало наработанных программ.

Вероятно Вам мало приходилось таскать программы с платформы на платформу.
Иногда даже в рамках одной платформы, возникает необходимость прыгать между компиляторами.
Поэтому писать надо так, чтобы было как можно меньше привязок и к железу и к компилятору. Все привязки выносить на отдельный уровень. А логику работы программы писать строго на plain C. Но это Вы и без меня знаете smile.gif

to sherr
Порты напрямую лучше неиспользовать вообще, тем более подобные записи как PORTD.5=x. Перекроили плату и что делать с этими PORTD.5? Искать по всем кускам программы? А если сильно перекроили - программу в корзину и писать новую?

Почему бы просто не наделать требующихся макросов из названий которых было бы ясно, что они делают и разместить их в отдельном хидере. Что-то типа такого:

hal_led_lala_hide();
или
hal_jumper_blabla()
и т.п.
SasaVitebsk
Цитата(defunct @ Jan 21 2007, 03:06) *
Цитата
С другой стороны, по-моему данная проблема (перехода) интересует только преподавателей и людей неопределившихся. Вторые делают переход как правило один - два раза. И если они ещё неопределились, то у них, как правило, ещё мало наработанных программ.

Вероятно Вам мало приходилось таскать программы с платформы на платформу.
Иногда даже в рамках одной платформы, возникает необходимость прыгать между компиляторами.
Поэтому писать надо так, чтобы было как можно меньше привязок и к железу и к компилятору. Все привязки выносить на отдельный уровень. А логику работы программы писать строго на plain C. Но это Вы и без меня знаете smile.gif

to sherr
Порты напрямую лучше неиспользовать вообще, тем более подобные записи как PORTD.5=x. Перекроили плату и что делать с этими PORTD.5? Искать по всем кускам программы? А если сильно перекроили - программу в корзину и писать новую?

Почему бы просто не наделать требующихся макросов из названий которых было бы ясно, что они делают и разместить их в отдельном хидере. Что-то типа такого:

hal_led_lala_hide();
или
hal_jumper_blabla()
и т.п.


Хм.. С компилятора на компилятор прыгать не приходилось. С камня на камень - да.

Совершенно с Вами согласен. Я делаю правда не так, как уважаемый Сергей Борщ, скажем ближе к Вам, defunct. smile.gif Но, в общем смысл тот же. Я даже порты в явном виде в своём проекте, как правило, не указываю. А мой пример, я просто постарался приблизить к вопросу. Так сказать наметил направление движения. smile.gif А Вы развили.
sherr
Всем спасибо! Прийдётся менять подход к написанию программок...
А теперь еще вопрос (offtop маленько) - как успехи в борьбе
с секретами DebugWire - кто-нибудь хотя бы пытался перехватить
и расшифровать протокол ? ( А то хочется самодельный МК2 или
Dragon но без ограничений) :
Ljubitel
Цитата
Как сделать, чтобы в WINAVR можно было бы работать с отдельными битами аналогично
CVAVR например PORTD.5=0 . Где-то видел готовый хидер для этого, но,увы...
не могу найти. Также интересут другие подобные хидеры облегчающие переход между
различными версиями компиляторов С для AVR.

Как в CV не получится. Точка все таки оператор. А вот типа как в IAR можно.

Код
#include <avr/io.h>

/*
=====================================================================
    Задаем структуру (битовое поле) чтобы иметь возможность обращаться к битам переменных.
=====================================================================
*/
typedef struct    _bit_struct    {
                                unsigned char    Bit0:1,
                                                Bit1:1,
                                                Bit2:1,
                                                Bit3:1,
                                                Bit4:1,
                                                Bit5:1,
                                                Bit6:1,
                                                Bit7:1;
                            }bit_field;


/*
=====================================================================
    Определяем PORTD.
=====================================================================
*/
#ifdef    PORTD
    
    #define    PORTD_Bit0    (*((volatile bit_field*) (0x32))).Bit0
    #define    PORTD_Bit1    (*((volatile bit_field*) (0x32))).Bit1
    #define    PORTD_Bit2    (*((volatile bit_field*) (0x32))).Bit2
    #define    PORTD_Bit3    (*((volatile bit_field*) (0x32))).Bit3
    #define    PORTD_Bit4    (*((volatile bit_field*) (0x32))).Bit4
    #define    PORTD_Bit5    (*((volatile bit_field*) (0x32))).Bit5
    #define    PORTD_Bit6    (*((volatile bit_field*) (0x32))).Bit6
    #define    PORTD_Bit7    (*((volatile bit_field*) (0x32))).Bit7
    
    #define    DDRD_Bit0    (*((volatile bit_field*) (0x31))).Bit0
    #define    DDRD_Bit1    (*((volatile bit_field*) (0x31))).Bit1
    #define    DDRD_Bit2    (*((volatile bit_field*) (0x31))).Bit2
    #define    DDRD_Bit3    (*((volatile bit_field*) (0x31))).Bit3
    #define    DDRD_Bit4    (*((volatile bit_field*) (0x31))).Bit4
    #define    DDRD_Bit5    (*((volatile bit_field*) (0x31))).Bit5
    #define    DDRD_Bit6    (*((volatile bit_field*) (0x31))).Bit6
    #define    DDRD_Bit7    (*((volatile bit_field*) (0x31))).Bit7
    
    #define    PIND_Bit0    (*((volatile bit_field*) (0x30))).Bit0
    #define    PIND_Bit1    (*((volatile bit_field*) (0x30))).Bit1
    #define    PIND_Bit2    (*((volatile bit_field*) (0x30))).Bit2
    #define    PIND_Bit3    (*((volatile bit_field*) (0x30))).Bit3
    #define    PIND_Bit4    (*((volatile bit_field*) (0x30))).Bit4
    #define    PIND_Bit5    (*((volatile bit_field*) (0x30))).Bit5
    #define    PIND_Bit6    (*((volatile bit_field*) (0x30))).Bit6
    #define    PIND_Bit7    (*((volatile bit_field*) (0x30))).Bit7

#endif


int main ()
{
    while (1)
    {
        PORTD_Bit0 = 1;
        PORTD_Bit0 = 0;
    };
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.