打印
[AVR单片机]

ATtiny26 这个程序竟然进不了中断.求高手指教

[复制链接]
2284|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pic专用|  楼主 | 2007-4-17 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include   <iot26v.h>
#include   <macros.h>
#define    uchar      unsigned char 
#define    uint      unsigned int 
#define       RED_LED_ON          PORTA &= ~(1<<PA7)
#define       RED_LED_OFF          PORTA |= (1<<PA7)        
#pragma interrupt_handler adc_isr:11
void adc_isr(void)
     {          
     RED_LED_ON;            
     }

void AD_init(void)
     {
          ADCSR     =  0x00;                         
         ADCMUX =  0x20;                           
 ACSR   =  0x80;
         ADCSR  =  0xAe;     //连续转换,64分频,ad中断使能
     }
    
void main()
    {    
         DDRA   = 0xE0;/* 定义PORTA口输入且不带上拉,,PA7,PA6,PA5输出*/
         PORTA  = 0xE0;    
         SREG &= ~(1<<7) ;    //关总中断    
    MCUCR = 0x00;
     TIMSK = 0x00;                          
GIMSK = 0x00;                           
RED_LED_OFF;
     AD_init();            
     ADCSR|=(1<<ADSC);       //连续模式,开始AD转换
     SREG |= (1<<7)    ;        
      while (1)
     {    
     ;
     }
       }
    
内部4M时钟..ATtiny26芯片
PA0 信号采集   
为什么进不了中断程序
(主程序里面测试指示灯控制正常,是不是说熔丝配置正常了)


请帮忙了.都两天了.还是没有弄出来....

相关帖子

沙发
zhiwei| | 2007-4-17 15:40 | 只看该作者

中断号错了吧

请看icc的头文件iot26v.h。中断号从1开始排的。
#define iv_ADC          12

另外,你的io访问最好写成移位或形式,|= (1<<7),带上位名,不然看不懂啊。

使用特权

评论回复
板凳
pic专用|  楼主 | 2007-4-17 16:33 | 只看该作者

谢谢你

把它当十一了 $00b

这个程序读AD值还有问题 

使用特权

评论回复
地板
pic专用|  楼主 | 2007-4-17 17:06 | 只看该作者

AD值

#include   <iot26v.h>
#include   <macros.h>
#define    uchar      unsigned char 
#define    uint      unsigned int 
#define       RED_LED_ON          PORTA &= ~(1<<PA7)
#define       RED_LED_OFF          PORTA |= (1<<PA7)    
unsigned   int       value;
#pragma interrupt_handler adc_isr:12
void adc_isr(void)
     { 
     value=ADCL;            
       value|=(int)ADCH << 8;     
     }

void AD_init(void)
     {              
              ADCMUX =  0xA0;//内部参考电压
              ADCSR  =  0xAe;//连续转换,64分频,ad中断使能
     }     

void main()
    {    
             DDRA   = 0xE0;/* 定义PORTA口输入且不带上拉,,PA7,PA6,PA5输出*/
             PORTA  = 0xE0;
             DDRB   = 0xBD;/* 定义PORTB口输出,PB1,PB6输入且带上拉*/
             PORTB  = 0x00;    
             CLI();         //关总中断    
             MCUCR = 0x00;
             TIMSK = 0x00; //timer interrupt sources
             GIMSK = 0x00; //interrupt sources
             RED_LED_ON;
            
             AD_init();            
             ADCSR|=(1<<ADSC);//连续模式,开始AD转换
             SEI();                   
             while (1)
             {    
             if(value>6000)  RED_LED_OFF;
             else            RED_LED_ON;
             }
       }
    
为什么while语句里面的value会这么大啊
我的pa0口用表测量电压为2.56v 用的是内部2.56v基准电压
计算下来应该是1000左右...怎么会这么大啊

使用特权

评论回复
5
pic专用|  楼主 | 2007-4-17 17:09 | 只看该作者

现在板上结果是灯灭了

就是说if(value>6000)  RED_LED_OFF;成立了  
板子是产品板.别人的.我拿过来自己编代码用的
板子问题应该排除

使用特权

评论回复
6
zhiwei| | 2007-4-17 19:07 | 只看该作者

程序好像没有什么问题啊

把value=ADC;,试一下。 

使用特权

评论回复
7
pic专用|  楼主 | 2007-4-17 20:16 | 只看该作者

大哥.你真是厉害啊

我想了一下午.找了几个小时的资料.才得到和你一样的结论
后来我也是这样的..但是什么理论还是不懂

很感谢你的帮助..

使用特权

评论回复
8
pic专用|  楼主 | 2007-4-17 20:21 | 只看该作者

不知道是不是得寸进尺,又有问题了

 while (1)
     {                             
      if(IR_IN)        {  GREEN_LED_ON;   }
      if(!IR_IN)    {  GREEN_LED_OFF;  }     
         }   
这个程序和下面的程序从运行结果来看一样吗?

 while (1)
     {                             
      if(IR_IN)        {  GREEN_LED_ON;   }
      else          {  GREEN_LED_OFF;  }     
         }

第二段代码能正常检测

第一段代码无法检测管教状态

这程序应该思维是一样得啊.是avr管脚特性引起还是icc avr 6.31A 问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

42

帖子

1

粉丝