一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2553|回复: 3
收起左侧

[avr] M8 C程序 全局变量问题,兄弟帮看看问题在哪?

[复制链接]
发表于 2011-10-16 14:02 | 显示全部楼层 |阅读模式
/*****************************************************************************
MCU:ATMEGA8
时钟:外8MHZ
******************************************************************************/
#include <AVR/io.h>
#include <avr/interrupt.h>

#define uchar unsigned char
#define SET_LED PORTD&=0xfe
#define CLR_LED PORTD|=0x01
static uchar g_bCount=0;
static uchar g_bDirection=0;

SIGNAL(SIG_OVERFLOW0)
{
   g_bCount++;
}

int main(void)
{
DDRD=_BV(PD0);
PORTD=_BV(PD0);

TCNT0=0;
TCCR0=_BV(CS02)|_BV(CS00);
TIMSK=_BV(TOIE0);
sei();

while(1)
{
//---------------------------
  if(g_bCount>14)
  {
   if(g_bDirection)
    SET_LED,g_bDirection=0;
   else
    CLR_LED,g_bDirection=1;
  
   g_bCount=0;

//----------------------------
  }
}
}



这段程序是书上的一段例子,红色字体段本来在中断程序中的,我将其移到了主循环中
问题是这段程序在主循环中不能正确工作,感觉上无法取得全局变量的值,为什么呢?找了很久,没有找到错误的地方,头都大了
兄弟帮着看看
发表于 2011-10-16 14:33 | 显示全部楼层
SET_LED,
CLR_LED,
应该是标点不对
发表于 2011-10-16 21:42 | 显示全部楼层
在变量g_bCount前要加 volatile
 楼主| 发表于 2011-10-17 07:29 | 显示全部楼层
在变量g_bCount前要加 volatile
zxmok 发表于 2011-10-16 21:42 https://www.yleee.com.cn/images/common/back.gif



    谢谢兄弟,昨晚在OURDEV上找到了这种方法

不过还是不太明白具体的原因,应该是中断和主循环同时使用变量的冲突,存在同时读写变量

而加上volatile声明这个应该与编译器有关,是不是编译器优化的问题?

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-18 07:02 , Processed in 0.065259 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表