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

 
 
> Биты и IAR живут ли вместе, Экомомно ОЗУ
asen
сообщение Sep 6 2005, 06:03
Сообщение #1


Знающий
****

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



<_< Народ ктонибуть знает как в IAR обьевить собственные флаги ???????
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
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
arttab
сообщение Sep 19 2005, 01:36
Сообщение #16


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

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



Иар 3.10. по флагу не пошла. увы. сделал по врерыванию от TXC1. по этому событию переключаю 485 на прием после передачи. устройство молчало. по прерыванию стало выдавать. получается что по флагу прога рано снимала разрешение на передачу. дома оссила нет - работаю на ощупь и дедукцией с индукцией huh.gif


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:39
Рейтинг@Mail.ru


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