|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
初次用AVR 单片机ATtiny26的一些疑问,用ICCAVR的C |
作者:WENLW 栏目:单片机 |
初次用AVR 单片机ATTINY26的一些疑问,用ICCAVR的C 1、对一些标志位是用一个寄存器来做好呢?还是用一个寄存器用联合体与结构进行位操作好? 2、我用一个寄存器来做一个标志位,但在程序运行过程中,其寄存器器的相应位会自行变动,告别是一个模块程序中有很多循环时?相关如下: static unsigned CHAR INT0COUNT=0x8d;//intocount=9024us//8d static unsigned CHAR TMR1H;//timer1 interrupt flag static unsigned CHAR TMR0H; static unsigned CHAR FLAG_INT;// static unsigned int delay_4ms; static unsigned CHAR PULSE_flag;//PULSE identify mark static unsigned CHAR drn_flag;//drive flag static unsigned CHAR slow_flag;//slow_drive flag static unsigned CHAR count_int;//external interrupt counter static unsigned CHAR k;//DISPLAY counter static unsigned CHAR PULSE1_flag=0x00; static unsigned CHAR count; 3、我用联合体与结构与结构进行位操作如下: /********************************************************************* //bit variabe define union { unsigned CHAR byte;//define a ram and bit operation struct { unsigned TMR1H :1; //timer1 interrupt flag unsigned FLAG_INT :1; //external interrupt flag unsigned PULSE_flag :1; //PULSE identify mark unsigned PULSE1_flag :1; // unsigned drn_flag :1; //drive flag unsigned slow_flag :1; //slow_drive flag unsigned BIT6 :1; // unsigned TMR0H :1; // }BIT; }FLAG; //bit operation //********************************************************************* // FLAG bit operation macros define #define TMR1H_ON (FLAG.BIT.TMR1H|=(1<<0)) #define TMR1H_OFF (FLAG.BIT.TMR1H&=~(1<<0)) #define FLAGINT_ON (FLAG.BIT.FLAG_INT|=(1<<1)) #define FLAGINT_OFF (FLAG.BIT.FLAG_INT&=~(1<<1)) #define PULSEflag_on (FLAG.BIT.PULSE_flag|=(1<<2)) #define PULSEflag_off (FLAG.BIT.PULSE_flag&=~(1<<2)) #define PULSEflag1_on (FLAG.BIT.PULSE1_flag|=(1<<3)) #define PULSEflag1_off (FLAG.BIT.PULSE1_flag&=~(1<<3)) #define drnflag_on (FLAG.BIT.drn_flag|=(1<<4)) #define drnflag_off (FLAG.BIT.drn_flag&=~(1<<4)) #define solwflag_on (FLAG.BIT.slow_flag|=(1<<5)) #define solwflag_off (FLAG.BIT.slow_flag&=~(1<<5)) 如当我要置位标志位时就用 FLAGINT_ON 当我要读其状态时如 if(FLAG.BIT.PULSE_flag) break; //identify ir signal else ... 问题是这样根本读不到正确的位值!程序就乱了呀,急呀!请各位指点! |
2楼: | >>参与讨论 |
作者: javie 于 2006/1/11 18:32:00 发布:
寄存器够用的话,还是用寄存器吧 |
3楼: | >>参与讨论 |
作者: WENLW 于 2006/1/11 18:42:00 发布:
读不到正确的位呢 那为何有的标志位我在程序中明明将其置位了,但读不到正确的位呢? 如count_int++; FLAG_INT=0x01; ...... if (FLAG_INT==0x01) {GIMSK = 0x00;break;} //disable INT0 interrupt WDR(); ...... 真是不明白!请再指点! |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |