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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Биты и IAR живут ли вместе, Экомомно ОЗУ
asen
сообщение Sep 6 2005, 06:03
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



<_< Народ ктонибуть знает как в IAR обьевить собственные флаги ???????
Go to the top of the page
 
+Quote Post
Old1
сообщение Sep 6 2005, 06:21
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(asen @ Sep 6 2005, 09:03)
<_< Народ ктонибуть знает как в IAR обьевить собственные флаги ???????
*

Битовые переменные, в смысле флаги, с IAR, на мой взгляд, отлично уживаются. Рекомендую детально изучить вот этот документ: http://www.gaw.ru/pdf/Atmel/app/avr/AVR035.pdf. В нем изложены рекомендации от IAR, как эффективно создавать код при помощи IAR C/C++...
Go to the top of the page
 
+Quote Post
VAI
сообщение Sep 6 2005, 06:43
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Не знаю, как для 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 для козлячих ПИКов...
Заранее извиняюсь, если задел любителей ПИКов. :-)


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
asen
сообщение Sep 6 2005, 07:06
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



я попробовал вставить кусок :
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 ругается на последнию строку может ктонибуть знает в чем дело?????? <_<
Go to the top of the page
 
+Quote Post
Old1
сообщение Sep 6 2005, 07:15
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Не должен он ругаться. Как он ругается? И куда ты, что вставил, конкретно?
Go to the top of the page
 
+Quote Post
asen
сообщение Sep 6 2005, 07:29
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



Программа тупа пока :
#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
<_<
Go to the top of the page
 
+Quote Post
Old1
сообщение Sep 6 2005, 07:40
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Перенеси flag.m_prtcl=1; в тело функции main. Или если нужна начальная инициализация всей структуры, то инициализируй ее например вот так:volatile FLAG flag={1,1,1,1,1,0,1}; значения флагов естественно расставь как тебе нужно.
Go to the top of the page
 
+Quote Post
asen
сообщение Sep 6 2005, 07:46
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



blush.gif Спасибо Пашет!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Go to the top of the page
 
+Quote Post
asen
сообщение Sep 6 2005, 07:54
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



Да а может кто знает как посмотреть значение этих битов в IARe и AVRStudio ??? <_<
Go to the top of the page
 
+Quote Post
BVU
сообщение Sep 6 2005, 08:12
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(asen @ Sep 6 2005, 11:54)
Да а может кто знает как посмотреть значение этих битов в IARe и  AVRStudio ??? <_<
*


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


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
asen
сообщение Sep 6 2005, 08:20
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



Дело в том что провожу отладку в AVRstudio и там в окне QuickWatch он их не отображает также есть проблемма с передачей этих битовых переменных из функции обработчика прерываний в основной модуль программы ? <_<
Go to the top of the page
 
+Quote Post
Old1
сообщение Sep 6 2005, 08:51
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



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


Что за проблема?
Go to the top of the page
 
+Quote Post
arttab
сообщение Sep 17 2005, 16:41
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



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

тоже виснет

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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
ValeraVi
сообщение Sep 17 2005, 17:12
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 30-07-05
Из: Kyiv, Ukraine
Пользователь №: 7 211



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) который никогда не изменится - он может измениться только вашей программой.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Sep 18 2005, 06:14
Сообщение #15


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(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.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

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

 


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


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