реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по работе с битами в WINAVR
sherr
сообщение Jan 20 2007, 22:44
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955



Как сделать, чтобы в WINAVR можно было бы работать с отдельными битами аналогично
CVAVR например PORTD.5=0 . Где-то видел готовый хидер для этого, но,увы...
не могу найти. Также интересут другие подобные хидеры облегчающие переход между
различными версиями компиляторов С для AVR.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 21 2007, 01:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(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); Можно сделать макрос.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 21 2007, 01:24
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sherr @ Jan 20 2007, 21:44) *
Также интересут другие подобные хидеры облегчающие переход между различными версиями компиляторов С для AVR.
Вот тут выложил один из вариантов, с комментариями по применению: http://electronix.ru/forum/index.php?s=&am...st&p=199555


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 21 2007, 02:06
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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

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

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

hal_led_lala_hide();
или
hal_jumper_blabla()
и т.п.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 21 2007, 05:02
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(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 А Вы развили.
Go to the top of the page
 
+Quote Post
sherr
сообщение Jan 21 2007, 17:59
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955



Всем спасибо! Прийдётся менять подход к написанию программок...
А теперь еще вопрос (offtop маленько) - как успехи в борьбе
с секретами DebugWire - кто-нибудь хотя бы пытался перехватить
и расшифровать протокол ? ( А то хочется самодельный МК2 или
Dragon но без ограничений) :

Сообщение отредактировал sherr - Jan 21 2007, 18:20
Go to the top of the page
 
+Quote Post
Ljubitel
сообщение Jan 21 2007, 21:11
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 41
Регистрация: 12-01-05
Из: St. Petersburg
Пользователь №: 1 917



Цитата
Как сделать, чтобы в 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;
    };
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016