Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Начал разбираться с IAR AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
eXeC001er
if ((PINB &= 0xFE) == 1)
правильно ли я проверяю 1 в нулевом бите PINB
==================================
command |= (PINB &= 0xFE);
правильно переношу PINB.0 в нулевой бит command
===================================
можно делать так:

OCR1 = ICR1 + Bit_75;

или лучше вот так:

tempor = ICR1 + Bit_75;
OCR1 = tempor;
KRS
Цитата(eXeC001er @ Sep 9 2005, 11:30)
if ((PINB &= 0xFE) == 1)
правильно ли я проверяю 1 в нулевом бите PINB
==================================
command |= (PINB &= 0xFE);
правильно переношу PINB.0 в нулевой бит command
===================================
можно делать так:

OCR1 = ICR1 + Bit_75;

или лучше вот так:

tempor = ICR1 + Bit_75;
OCR1 = tempor;
*



1. Не правильно
надо так
if (PINB & 1)

а вот так можно
OCR1 = ICR1 + Bit_75;
eXeC001er
Следующий

static char count_bit = 0;

если я в обработчике прерываний объявлю переменную вот так она будет при каждом заходе обнуляться или нет
==============================================
static char count_bit;

если я ее объявлю вот так, то чему она будет равна?!
KRS
Вообще все эти вопросы не по IAR AVR, а по С
все в соответсвии со стандартом.
Порты - обычные перменные volatile
Прерывание - обычная функция, только с другим прологом и эпилогом
eXeC001er
ладна сам отвечу на свой вопрос (книгу открыл)
она будет проинициализированна только один раз.
PaulS
command |= (PINB &= 0xFE);
правильно переношу PINB.0 в нулевой бит command

Это тоже не совсем правильно, надо или очищать предварительно
0 бит в command, а то первая же 1 там навсегда и останется
или например так делать

if(PINB & 1) command |= (0<<1);
else command &= ~(0<<1);

И лучше сразу вместо 0 писАть символьное имя
для улучшения читабельности.
eXeC001er
Другой вопрос именно по IAR
у него в *.h файлах написаны объявления
типа
#define ICR1 1
но они не работают при использовании этих имен из С конструкций, а в файле написано что это объявления для Ассемблера, пришлось их скопировать в свой h файл, шоб работало, почему так, что мне в каждом новом проекте такие операции проводить?!
eXeC001er
to PaulS
у меня там вот такая конструкция

command |= (PINB & 1);
command = command << 1;

после принятия всех битов и обработки, command обнуляется
KRS
Цитата(eXeC001er @ Sep 9 2005, 12:01)
to PaulS
у меня там вот такая конструкция

command |= (PINB & 1);
command = command << 1;

после принятия всех битов и обработки, command обнуляется
*


command будет равнв 0 если 0 бит порта 0
или будет равна 2
в симуляторе IAR будет 0 (потому что PINB 0)? если туда конечно не записать другое значение
KRS
Цитата(eXeC001er @ Sep 9 2005, 11:59)
Другой вопрос именно по IAR
у него в *.h файлах написаны объявления
типа
#define ICR1  1
но они не работают при использовании этих имен из С конструкций, а в файле написано что это объявления для Ассемблера, пришлось их скопировать в свой h файл, шоб работало, почему так, что мне в каждом новом проекте такие операции проводить?!
*



вообще для С у IAR используются не #define
а специальные макросы типа
SFR_B(PINB, 0x16) /* Input Pins, Port B */
таким образом и обявляется порт
макрос преобразуется в определение переменной volatile по определенному адресу
eXeC001er
да я это обнаружил но это савсем не удобно! только номера битов и все а имен нет!
там для примера есть конструкция
Examples of how to use the expanded result:
1) AVR |= (1<<5);
* or like this:
2) AVR_Bit5 = 1;

первая работает (но опять же нет имен, плохо!)
вторая отказывается работать
вместо AVR понятно что я подставляю имя регистра.
например
TIMSK |= (1<<5); работает
а
TIMSK_bit5 = 1; не работает
eXeC001er
еще вопрос по среде
в даташите сказанол что при чтении 16 битных регистров надо соблюдать определенный порядок, так вот если я обращаюсь ко всему регистру сразу например
TCNT1 = 0xFFD0;
при транстляции это дело сделается как указано в даташите, или надо в С конструкциях тоже придерживаться требований даташита?!
Rst7
Цитата(eXeC001er @ Sep 9 2005, 12:17)
TIMSK_bit5 = 1;          не работает
*


Enable bit definition поможет плохому танцору :-) шутка...
eXeC001er
просьба отвечайте полнее,

/quote
Enable bit definition поможет плохому танцору :-) шутка...
/quote

попробуй разберись где искать этот Enable bit definition, а может его в начале проекта прописывать для препроцессора.

Но все равно спасибо. Сам нашел.
В опциях проекта >> general >> Library Configuration
PaulS
Цитата(eXeC001er @ Sep 9 2005, 12:17)
да я это обнаружил но это савсем не удобно! только номера битов и все а имен нет!
TIMSK |= (1<<5);        работает
а
TIMSK_bit5 = 1;          не работает
*


Так пиши не номера, а имена и все понятно будет smile.gif

TIMSK |= (1<<TICIE1);

А битам внешних регистров сам присвой имена в зависимости от назначения

Цитата(eXeC001er @ Sep 9 2005, 12:01)
у меня там вот такая конструкция

command |= (PINB & 1);
command = command << 1;

после принятия всех битов и обработки, command обнуляется
*


А ну тогда все ОК, вдвигаться всегда будет 0
eXeC001er
скажите битовые переменные можно объявлять через встроенный макрос, как это сделано для регистров контроллера, а потом обращатся к ним
например вот так
SFR_B(FLAG, Addr)

но вот вопрос какое значение записывать в Addr?!
Или это как то по другому делается?!
BVU
Цитата(eXeC001er @ Sep 9 2005, 14:57)
скажите битовые переменные можно объявлять через встроенный макрос, как это сделано для регистров контроллера, а потом обращатся к ним
например вот так
SFR_B(FLAG,  Addr)

но вот вопрос какое значение записывать в Addr?!
Или это как то по другому делается?!
*


Объявите сначала Ваши переменные, а потом через #define переобозначтесь.
eXeC001er
подробнее пжлста
BVU
Цитата(eXeC001er @ Sep 9 2005, 15:25)
подробнее пжлста
*


Это стандарт языка С. Почитайте любую книжку (учебник) по С, и посмотрите, как можно организовать макрос. Я Вам дам лучше другое ценное замечание: что бы избежать ошибок параметры макроолределения всегда необходимо заключать в скобки: #define xxx (xxx/xxx * ... + ... - xxx)
eXeC001er
я про то как мне организовать собственные битовые переменные?!
я где то здесь на форуме встречал как это делается, но вот забыл где?!
Rst7
Цитата(eXeC001er @ Sep 9 2005, 15:01)
я про то как мне организовать собственные битовые переменные?!
я где то здесь на форуме встречал как это делается, но вот забыл где?!
*


Из исходника:

//TCP заголовок
struct
{
unsigned int rport; //От какого порта
unsigned int lport; //В какой
unsigned long SEQ;
unsigned long ACK;
char hlen;
union
{
char CTL; //Флаги
struct
{
char FIN:1,
SYN:1,
RST:1,
PSH:1,
_ACK:1,
F5:1,
F6:1,
F7:1;
};
};
unsigned int wsize;
} TCP_HDR;

FIN, SYN, RST и т.д. - ото оно, CTL - доступ сразу ко всему байту.
PaulS
Цитата(eXeC001er @ Sep 9 2005, 15:01)
я про то как мне организовать собственные битовые переменные?!
я где то здесь на форуме встречал как это делается, но вот забыл где?!
*


ИМХО лучше всего так, например:

typedef union isd_status {
unsigned int word;
struct {
unsigned char powerUP_delay : 1;
unsigned char record_start : 1;
unsigned char play_start : 1;
unsigned char record_process : 1;
unsigned char play_process : 1;
unsigned char pause_stop : 1;
};
} isd_status;

Если будет больше chara, смело пиши word или long.

В программе:

обьява:
isd_status ISD_status = {0};

Модификация бита:
ISD_status.pause_stop = SET;

Модификация всей структуры:
ISD_status.word = CLR;

Проверка бита:
if (ISD_status.pause_stop);
Так же и байта.

Передача параметром в функцию:
number_operation = GetNumberBit(ISD_status.word);

Ну и т.д.

Так 6-й час, домой пора.
Успехов.
ObitJr
Цитата(BVU @ Sep 9 2005, 13:51)
Цитата(eXeC001er @ Sep 9 2005, 15:25)
подробнее пжлста
*


Это стандарт языка С. Почитайте любую книжку (учебник) по С, и посмотрите, как можно организовать макрос. Я Вам дам лучше другое ценное замечание: что бы избежать ошибок параметры макроолределения всегда необходимо заключать в скобки: #define xxx (xxx/xxx * ... + ... - xxx)
*


я б даже сказал вот так #define ...(xxx) ((xxx)/(xxx) * ... + ... - (xxx)), если речь шла о параметрах
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.