打印
[AVR单片机]

求教 Atmega8 无法进入外中断

[复制链接]
1024|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sanguanko|  楼主 | 2015-3-5 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ATmega8 无法进入外中断,程序如下,目的是发生一次外中断累加一次data_1,并通过串口送到PC,上电后串口调试助手只能收到一次01,如果能进入中断应该能收到04啊,求教。多谢
#include <avr/io.h>

/***********************************宏定义**********************************/
#define fosc 11059200         //晶振8MHZ
#define baud 9600                //波特率

unsigned char data_1;//每触发一次中断,该值加1
unsigned char flag;//发生int0中断后,该值置0xFF


void uart0_init(void)
{
        UCSRB = 0x00;
        UCSRA = 0x00;
        UCSRC =(1<<UCSZ1)|(1<<UCSZ0);
        UBRRL=(fosc/16/(baud+1))%256;
        UBRRH=(fosc/16/(baud+1))/256;
        UCSRB =(1<<RXEN)|(1<<TXEN);
}

void int0_init(void)
{       
        MCUCR=(1<<ISC01);//INT0下降沿触发中断
        GICR=(1<<INT0);//enable INT0       
}

SIGNAL(SIG_INTERRUPT0)
{
    cli();
        flag=0xff;
        putchar0(4);
        sei();       
}

void putchar0(unsigned char c)
{
        while (!(UCSRA&(1<<UDRE)));
        UDR=c;
}

int main(void)
{
    uart0_init();
        int0_init();
        putchar0(1);
        sei();
       
        while(flag==0xff)
        {
                cli();
                flag=0;
               
                if(data_1<=255)
                {
                        putchar0(data_1);
                        putchar0(2);
                }                       
                else
                {
                        data_1=0;
                        putchar0(3);
                }                       
        sei();
        }
}

相关帖子

沙发
sanguanko|  楼主 | 2015-3-5 22:28 | 只看该作者
PD2外接有上啦电阻,按键按下时,用万用表量,PD2上却是有个有1->0的变化,为什么下降沿没产生中断呢?

使用特权

评论回复
板凳
j6920| | 2015-3-6 09:42 | 只看该作者
#include <avr/interrupt.h>

使用特权

评论回复
地板
yklstudent| | 2015-3-7 18:16 | 只看该作者
/*
* vs_proj2.c
*
* Created: 2015-3-7 14:16:35
*  Author: keliang.yao
*/

#define F_CPU        11059200ul

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define fosc        11059200ul
#define baud        9600ul

unsigned char data_l;
unsigned char flag;

void usart0_init(void)
{
        UCSRB = 0x00;
        UCSRA = 0x00;
        UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
        UBRRL = (fosc/16/(baud+1))%256;
        UBRRH = (fosc/16/(baud+1))/256;
        UCSRB = (1<<RXEN)|(1<<TXEN);
}

void putchar0(unsigned char c)
{
        while(!(UCSRA & (1<<UDRE)));
        UDR = c;
}

void int0_init(void)
{
        MCUCR = (1<<ISC01);
        GICR = (1<<INT0);
}

SIGNAL(INT0_vect)
{
        cli();
        flag = 0xff;
        putchar0(4);
        sei();
}

int main(void)
{
        usart0_init();
        int0_init();
        putchar0(1);
        DDRB = 0XFF;
        PORTB = 0X00;
        sei();
        while(1)
       {
        //TODO:: Please write your application code
                while(flag == 0xff)
                {
                        cli();
                        flag = 0;
                        if(data_l <= 255)
                        {
                                putchar0(data_l);
                                putchar0(2);
                        }
                        else
                        {
                                data_l = 0;
                                putchar0(3);
                        }
                        sei();
                }
        }
}
楼主试试这样

使用特权

评论回复
5
sanguanko|  楼主 | 2015-3-7 21:58 | 只看该作者
谢谢,以前用的是AVRStudio,换成ICCAVR,程序没怎么改,竟然成了

使用特权

评论回复
6
NE5532| | 2015-3-16 20:33 | 只看该作者
楼主去把中断部分的datasheet重新看一遍再写程序,你满篇不停地开关总中断标志干啥?

使用特权

评论回复
7
SD10A| | 2015-9-2 22:35 | 只看该作者
这个   如果你不用外部电阻  使用内部上拉   会不会成了?

使用特权

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

本版积分规则

262

主题

290

帖子

2

粉丝