Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Биты и IAR живут ли вместе
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
asen
<_< Народ ктонибуть знает как в IAR обьевить собственные флаги ???????
Old1
Цитата(asen @ Sep 6 2005, 09:03)
<_< Народ ктонибуть знает как в IAR обьевить собственные флаги ???????
*

Битовые переменные, в смысле флаги, с IAR, на мой взгляд, отлично уживаются. Рекомендую детально изучить вот этот документ: http://www.gaw.ru/pdf/Atmel/app/avr/AVR035.pdf. В нем изложены рекомендации от IAR, как эффективно создавать код при помощи IAR C/C++...
VAI
Не знаю, как для 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 для козлячих ПИКов...
Заранее извиняюсь, если задел любителей ПИКов. :-)
asen
я попробовал вставить кусок :
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 ругается на последнию строку может ктонибуть знает в чем дело?????? <_<
Old1
Не должен он ругаться. Как он ругается? И куда ты, что вставил, конкретно?
asen
Программа тупа пока :
#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
<_<
Old1
Перенеси flag.m_prtcl=1; в тело функции main. Или если нужна начальная инициализация всей структуры, то инициализируй ее например вот так:volatile FLAG flag={1,1,1,1,1,0,1}; значения флагов естественно расставь как тебе нужно.
asen
blush.gif Спасибо Пашет!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
asen
Да а может кто знает как посмотреть значение этих битов в IARe и AVRStudio ??? <_<
BVU
Цитата(asen @ Sep 6 2005, 11:54)
Да а может кто знает как посмотреть значение этих битов в IARe и  AVRStudio ??? <_<
*


Для IAR почитайте фирменное описание, как пользоваться Debug (отладчиком), откомпилируйтесь в режиме Debug, запустите Debug и посмотрите значение своей объявленой битовой структуры в окне параметров.
asen
Дело в том что провожу отладку в AVRstudio и там в окне QuickWatch он их не отображает также есть проблемма с передачей этих битовых переменных из функции обработчика прерываний в основной модуль программы ? <_<
Old1
Цитата(asen @ Sep 6 2005, 11:20)
есть проблемма с передачей этих битовых переменных из функции обработчика прерываний в основной модуль программы ? <_<
*


Что за проблема?
arttab
Добавлю и я свой вопрос по иару
Как корректно проверить флаг в регистре с учетом оптимизации кода?
Поясню: в записи такого вида - 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:

тоже виснет

А как правильно?
ValeraVi
2 arttab
правильно так:
while( UCSR1A & 0x06 );
и кто вам сказал что это для компилятора не очевидно??? Если вашему комилятору это не очевидно - выбросьте его smile.gif... моему (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

може у вас что-то не работает (виснет) по другой причине smile.gif? например промому что вы ждете изменения одного из битов (U2X1) который никогда не изменится - он может измениться только вашей программой.
Rst7
Цитата(arttab @ Sep 17 2005, 19:41)
Добавлю и я свой вопрос по иару
    Как корректно проверить флаг в регистре с учетом оптимизации кода?
Поясню: в записи такого вида - 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.
arttab
Иар 3.10. по флагу не пошла. увы. сделал по врерыванию от TXC1. по этому событию переключаю 485 на прием после передачи. устройство молчало. по прерыванию стало выдавать. получается что по флагу прога рано снимала разрешение на передачу. дома оссила нет - работаю на ощупь и дедукцией с индукцией huh.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.