asen 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба <_< Народ ктонибуть знает как в IAR обьевить собственные флаги ??????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба <_< Народ ктонибуть знает как в IAR обьевить собственные флаги ??????? <{POST_SNAPBACK}> Битовые переменные, в смысле флаги, с IAR, на мой взгляд, отлично уживаются. Рекомендую детально изучить вот этот документ: http://www.gaw.ru/pdf/Atmel/app/avr/AVR035.pdf. В нем изложены рекомендации от IAR, как эффективно создавать код при помощи IAR C/C++... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Не знаю, как для 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 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба я попробовал вставить кусок : 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 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Не должен он ругаться. Как он ругается? И куда ты, что вставил, конкретно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asen 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Программа тупа пока : #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 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Перенеси flag.m_prtcl=1; в тело функции main. Или если нужна начальная инициализация всей структуры, то инициализируй ее например вот так:volatile FLAG flag={1,1,1,1,1,0,1}; значения флагов естественно расставь как тебе нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asen 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Спасибо Пашет!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asen 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Да а может кто знает как посмотреть значение этих битов в IARe и AVRStudio ??? <_< Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BVU 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Да а может кто знает как посмотреть значение этих битов в IARe и AVRStudio ??? <_< <{POST_SNAPBACK}> Для IAR почитайте фирменное описание, как пользоваться Debug (отладчиком), откомпилируйтесь в режиме Debug, запустите Debug и посмотрите значение своей объявленой битовой структуры в окне параметров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asen 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба Дело в том что провожу отладку в AVRstudio и там в окне QuickWatch он их не отображает также есть проблемма с передачей этих битовых переменных из функции обработчика прерываний в основной модуль программы ? <_< Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 6 сентября, 2005 Опубликовано 6 сентября, 2005 · Жалоба есть проблемма с передачей этих битовых переменных из функции обработчика прерываний в основной модуль программы ? <_< <{POST_SNAPBACK}> Что за проблема? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 17 сентября, 2005 Опубликовано 17 сентября, 2005 · Жалоба Добавлю и я свой вопрос по иару Как корректно проверить флаг в регистре с учетом оптимизации кода? Поясню: в записи такого вида - 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 0 17 сентября, 2005 Опубликовано 17 сентября, 2005 · Жалоба 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) который никогда не изменится - он может измениться только вашей программой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 18 сентября, 2005 Опубликовано 18 сентября, 2005 · Жалоба Добавлю и я свой вопрос по иару Как корректно проверить флаг в регистре с учетом оптимизации кода? Поясню: в записи такого вида - 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: тоже виснет А как правильно? <{POST_SNAPBACK}> Правильно, чтобы ваш UCSR1A (или другой порт) был volatile - это и скажет компилятору, что значение зависит не только от генерируемого кода. А описание портов в стандартном .h имеют этот volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться