登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

初次用AVR 单片机ATtiny26的一些疑问,用ICCAVR的C

作者:WENLW 栏目:单片机
初次用AVR 单片机ATTINY26的一些疑问,用ICCAVR的C
初次用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
寄存器够用的话,还是用寄存器吧
 
3楼: >>参与讨论
WENLW
读不到正确的位呢
那为何有的标志位我在程序中明明将其置位了,但读不到正确的位呢?
如count_int++;
FLAG_INT=0x01;
......
if (FLAG_INT==0x01)
    {GIMSK = 0x00;break;} //disable INT0 interrupt
     WDR();
......
真是不明白!请再指点!

参与讨论
昵称:
讨论内容:
 
 
相关帖子
TIMER1的工作模式
Mega8的定时器1问题
1602显示程序(4位接法)为什么只有刚下载完和带电复位才行?
DS18B20在AVR上的应用
奇观现象
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号