Перейти к содержанию
    

Биты и IAR живут ли вместе

<_< Народ ктонибуть знает как в IAR обьевить собственные флаги ???????

Битовые переменные, в смысле флаги, с IAR, на мой взгляд, отлично уживаются. Рекомендую детально изучить вот этот документ: http://www.gaw.ru/pdf/Atmel/app/avr/AVR035.pdf. В нем изложены рекомендации от IAR, как эффективно создавать код при помощи IAR C/C++...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, как для AVR, но для MSP430 объявляю так

typedef struct              // Флаги
{ unsigned flt_prg:       1;
 unsigned ini_measure:   1;
 unsigned enable_calk:   1;
 unsigned enable_ind:    1;
 unsigned m_prtcl:       1;
 unsigned enable_temp_f: 1;
 unsigned enable_temp_q: 1;
........... можно ооочень много флагов объявить
} FLAG;

использую, например так

volatile FLAG flag;

if ( flag.enable_temp_f == OFF )
{
}

Так работает не только в ИАРе, но и во всех нормальных С-компиляторах для винды, для ДОСа и даже работает в HiTech C для козлячих ПИКов...

Заранее извиняюсь, если задел любителей ПИКов. :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я попробовал вставить кусок :

typedef struct

{ unsigned flt_prg: 1;

unsigned ini_measure: 1;

unsigned enable_calk: 1;

unsigned enable_ind: 1;

unsigned m_prtcl: 1;

unsigned enable_temp_f: 1;

unsigned enable_temp_q: 1;

} FLAG;

volatile FLAG flag;

flag.m_prtcl=1;

 

У меня чтото IAR ругается на последнию строку может ктонибуть знает в чем дело?????? <_<

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не должен он ругаться. Как он ругается? И куда ты, что вставил, конкретно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Программа тупа пока :

#include <stdio.h>

#include <iom16.h>

#include <comp_a90.h>

#include <inavr.h>

#include <ina90.h>

//---------System bit and flag--------

#define I SREG_Bit7

#define _INT1 GICR_Bit7

#define f0t1_1 MCUCR_Bit3

#define f0t1_2 MCUCR_Bit2

//#define diod PORTD_Bit2

//#define PP2 DDRD_Bit2

//-----------KeyBoard-------------

#define kb_in1 PIND_Bit3

#define kb_in2 PINA_Bit7

#define kb_in3 PINA_Bit6

#define st1_kb PORTA_Bit5

#define des1_kb DDRA_Bit5

#define st2_kb PORTA_Bit4

#define des2_kb DDRA_Bit4

#define st3_kb PORTA_Bit3

#define des3_kb DDRA_Bit3

//--------------User bit and flag--------------------

#define flag1 PORTD_Bit2

//-------------led------------------

#define diod1 PORTD_Bit2

#define des_diod1 DDRD_Bit2

#define diod2 PORTD_Bit4

#define des_diod2 DDRD_Bit4

#define diod3 PORTD_Bit5

#define des_diod3 DDRD_Bit5

#define diod4 PORTD_Bit6

#define des_diod4 DDRD_Bit6

#define diod5 PORTD_Bit7

#define des_diod5 DDRD_Bit7

///short int BBB;

//--------------------Ïðåðûâàíèå îò êëàâèàòóðû----------------------------

#pragma vector=INT1_vect

static __interrupt void KBoard ()

{

__delay_cycles (480000);

//ïðîâåðêà ïîòâåðæäåíèÿ íàæàòèÿ

if (kb_in1==1)

{

if(diod2==1)

{ diod2=0;}

else

{ diod2=1;}

if(flag1==0)

{

diod1 = 0;

flag1 = 1;

}

else

{

diod1 = 1;

flag1 = 0;

}

}

};

//--------------------------Ïðîãðàìà ïðåäóñòàíîâùèê-----------------------

void predstart(void){

I = 1;

f0t1_1 = 1;

f0t1_2 = 1;

_INT1 = 1;

des_diod1 = 1; // Port D Line 2 set to output

flag1 = 0;

des1_kb=1;

st1_kb=1;

des2_kb=1;

st2_kb=1;

des3_kb=1;

st3_kb=1;

 

des_diod2=1;

diod2=1;

des_diod3=1;

diod3=0;

des_diod4=1;

diod4=0;

des_diod5=1;

diod5=0;

}

//------------------------Îñíîâíîé ìîäóëü-------------------------

typedef struct FLAG // Ôëàãè

{ unsigned flt_prg: 1;

unsigned ini_measure: 1;

unsigned enable_calk: 1;

unsigned enable_ind: 1;

unsigned m_prtcl: 1;

unsigned enable_temp_f: 1;

unsigned enable_temp_q: 1;

//........... ìîæíî îîî÷åíü ìíîãî ôëàãîâ îáúÿâèòü

} FLAG;

volatile FLAG flag;/// Это он и не понимае

flag.m_prtcl=1;

int main( void ){

predstart();

for(;;){

__delay_cycles(15993);

diod2=0;

__delay_cycles(15991);

diod2=1;

}

return 0;

}

 

 

А пишит он следущие:

 

 

Error[Pe077]: this declaration has no storage class or type specifier C:\Vovan\1\main.c 97

 

Error[Pe247]: variable "flag" has already been defined C:\Vovan\1\main.c 97

Error[Pe065]: expected a ";" C:\Vovan\1\main.c 97

<_<

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перенеси flag.m_prtcl=1; в тело функции main. Или если нужна начальная инициализация всей структуры, то инициализируй ее например вот так:volatile FLAG flag={1,1,1,1,1,0,1}; значения флагов естественно расставь как тебе нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да а может кто знает как посмотреть значение этих битов в IARe и AVRStudio ??? <_<

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да а может кто знает как посмотреть значение этих битов в IARe и  AVRStudio ??? <_<

 

Для IAR почитайте фирменное описание, как пользоваться Debug (отладчиком), откомпилируйтесь в режиме Debug, запустите Debug и посмотрите значение своей объявленой битовой структуры в окне параметров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело в том что провожу отладку в AVRstudio и там в окне QuickWatch он их не отображает также есть проблемма с передачей этих битовых переменных из функции обработчика прерываний в основной модуль программы ? <_<

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть проблемма с передачей этих битовых переменных из функции обработчика прерываний в основной модуль программы ? <_<

 

Что за проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавлю и я свой вопрос по иару

Как корректно проверить флаг в регистре с учетом оптимизации кода?

Поясню: в записи такого вида - while( UCSR1A & 0x06 ); для компилятора неочевидно, что значение UCSR1A может измениться само по себе, а не в результате действий программы. как тут быть?

Я попробывал так: while ((UCSR1A & 0x06) == 0); виснет.

тогда так: volatile unsigned char z = 0; while (z == 0)

{z = (UCSR1A & 0x06);} код похож на правду

M:

LDS R16,_A_UCSR1A

ANDI R16,0x06

ST Y,R16

LD R16,Y

TST R16

BREQ M:

 

тоже виснет

 

А как правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 arttab

правильно так:

while( UCSR1A & 0x06 );

и кто вам сказал что это для компилятора не очевидно??? Если вашему комилятору это не очевидно - выбросьте его :)... моему (iar4.11a) очевино и все работает:

1075: while( UCSR1A & 0x06 );

+00000725: 9100009B LDS R16,0x009B Load direct from data space

+00000727: 7006 ANDI R16,0x06 Logical AND with immediate

+00000728: F7E1 BRNE PC-0x03 Branch if not equal

 

може у вас что-то не работает (виснет) по другой причине :)? например промому что вы ждете изменения одного из битов (U2X1) который никогда не изменится - он может измениться только вашей программой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавлю и я свой вопрос по иару

    Как корректно проверить флаг в регистре с учетом оптимизации кода?

Поясню: в записи такого вида - while( UCSR1A & 0x06 );  для компилятора неочевидно, что значение UCSR1A может измениться само по себе, а не в результате действий программы.  как тут быть?

Я попробывал так: while ((UCSR1A & 0x06) == 0);  виснет.

тогда так:  volatile unsigned char z = 0;      while (z == 0)

    {z = (UCSR1A & 0x06);} код похож на правду

M:

LDS  R16,_A_UCSR1A

ANDI  R16,0x06

ST  Y,R16

LD  R16,Y

TST R16

BREQ  M:

 

тоже виснет

 

А как правильно?

Правильно, чтобы ваш UCSR1A (или другой порт) был volatile - это и скажет компилятору, что значение зависит не только от генерируемого кода. А описание портов в стандартном .h имеют этот volatile.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...