打印
[PIC®/AVR®/dsPIC®产品]

pic18f25k2用到timer0和usart两个中断……

[复制链接]
1199|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Pace、|  楼主 | 2016-12-18 00:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pic18f25k2用到timer0和usart两个中断,请问该怎么设置……
沙发
lqwuliang| | 2016-12-18 15:42 | 只看该作者
这个看芯片手册应该可以吧

使用特权

评论回复
板凳
dogglove| | 2016-12-18 15:45 | 只看该作者
看看手册,找个例子试试就可以了

使用特权

评论回复
地板
Pace、|  楼主 | 2016-12-19 08:23 | 只看该作者
lqwuliang 发表于 2016-12-18 15:42
这个看芯片手册应该可以吧

照着芯片手册写的,编译不通过

使用特权

评论回复
5
Pace、|  楼主 | 2016-12-19 08:24 | 只看该作者
dogglove 发表于 2016-12-18 15:45
看看手册,找个例子试试就可以了

找试了 ,不行啊

使用特权

评论回复
6
Pace、|  楼主 | 2016-12-19 09:39 | 只看该作者
//485初始化以及接收中断
void RS485_Init()
{
  TRISCbits.RC7=1;         //set RC7 input mode ,and set RC0-RC6 output mode
  TRISCbits.RC6=0;
  ANSELCbits.ANSC7=0;       //close RC7 pin analog input feature   
  ANSELCbits.ANSC6=0;       //close RC7 pin analog input feature
  SPBRG=0X33;              //the baud rate is 9600 (8Mhz/(16(SPBRG-1)))
  TXSTA=0X24;              //transmit enable  and set baud rate high speed  mode         
  RCSTA=0X90;      //enable serial port and set to continous receive mode
  RCIE=0X1;      //enable receive interrupt
  RCONbits.IPEN =1;
  IPR1bits.RC1IP=1;         
  
  GIEH=0X1;      //enable gloal interrupt
  PEIE=0X1;    //enable peripheral interrupt
}

void interrupt_usart(void)           //function to usart interrupt
{
        uchar res;            
        if(RCIE&&RCIF)                        //receive data
        {                
          res =RCREG;
          if(RS485_RX_CNT<12) //the numbers of receive data less than the length of receice buffer array
          {
              RS485_RX_BUF[RS485_RX_CNT]=res;//save data to an receive buffer array
              RS485_RX_CNT++;                                // the numbers of receive data plus one
           }
        }                                                                                           
}
//timer0中断初始化以及中断处理函数

void Init_Tim0()      //intialize timer 0
{
        RCONbits.IPEN =1;
        TMR0IP=0;                //
        INTCON=0xA0;   //enable global interrupt and timer 0 interrupt
        INTCON2bits.TMR0IP=1;
        TMR0=255;          //set counter initial value 250
        T0CON=0xc4;  //enable timer 0 and timer 0 is configured an 8-bit timer
        GIEL=1;                //enable global interrupt
        PEIE=1;           //enable peripheral interrupt
        TMR0IE=1; //enable timer 0 interript
}

                /**************************
                                        S3
                                S1        S2        S5
                                        S4
                ***************************/
void interrupt timer0()              //funciton to timer 0 interrupt
{                                               
        TMR0IF=0;                                 //clear timer 0 interrupt flag bit
        count++;
        uchar keynum=0;
       ……
}

使用特权

评论回复
7
JY-DX-JY| | 2016-12-19 09:42 | 只看该作者
编译错误提示是什么?

使用特权

评论回复
8
Pace、|  楼主 | 2016-12-19 10:20 | 只看该作者
JY-DX-JY 发表于 2016-12-19 09:42
编译错误提示是什么?

Error   [845] C:\Users\Administrator\Desktop\elc_box\hardware\74HC595\74HC595.c; 111. symbol "int_func" defined more than once

使用特权

评论回复
9
JY-DX-JY| | 2016-12-19 10:22 | 只看该作者
int_func" defined more than once
i提示int_func这个函数定义了不止一次

使用特权

评论回复
10
Pace、|  楼主 | 2016-12-19 10:27 | 只看该作者
JY-DX-JY 发表于 2016-12-19 10:22
int_func" defined more than once
i提示int_func这个函数定义了不止一次

压根就没这个函数
把中断函数interrupt_usart(void)换成 interrupt usart(void)就会报错 ,只知道PIC18F25K22有两个中断入口,但是不知道设置

使用特权

评论回复
11
JY-DX-JY| | 2016-12-19 10:30 | 只看该作者
给你个例子。
void high_isr(void);
void low_isr(void);

////////////////////////////////////////////////////////////////////////////
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
    _asm
        GOTO high_isr
    _endasm
}
#pragma code    // allow the linker to locate the remaining code
////////////////////////////////////////////////////////////////////////////
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
    _asm
    GOTO low_isr
    _endasm
}
#pragma code
////////////////////////////////////////////////////////////////////////////
#pragma interrupt high_isr  //, section(".tmpdata")
void high_isr (void)
{
   
}
//***************************************************************************************************
//ILLUMINATE:   低优先级中断服务程序
//FUNCTION:     根据中断标志转向相应的服务子程序;
//              timer0();2ms定时,算法:(4MHz/4)×(T0PS2:T0PS0:分频比)×(256-TMR0L定时常数)
//              INT1();进入调试模式
//ARGUMENTS:    void
//RETURN:       void
//***************************************************************************************************
#pragma interruptlow low_isr    //, section(".tmpdata")
void low_isr (void)
{   
    unsigned char RData = 0x00;//存储读取
    if(INTCONbits.TMR0IF)
    {
        INTCONbits.TMR0IF = 0;        //Clear Timer0 overflow flag
        TMR0L += 40;                  //10ms timer
        jiffies += 10;  
        tenms++;

        if(U2.RxTimeOut > 0)//读取串口缓冲区
            {
                U2.RxTimeOut -= 10;
                if(0 == U2.RxTimeOut)
                {
                    U2.RxBytes = U2.RxNo;
                    U2.RxNo = 0;    //缓冲区指示标志指向0
                    U2.Rxed = 1;   //
                }
            }

            if(U1_RxTimeOut > 0)//读取串口缓冲区
            {
                U1_RxTimeOut -= 10;
                if(0 == U1_RxTimeOut)
                {
                   
                    //U1_RxNo = 0;    //缓冲区指示标志指向0
                    U1_Rxed = 1;    //接收完成标志---开始处理数据标志
                }
            }       
    }
        if(PIR3bits.RC2IF)//接受中断标志
        {
                 //TSSendTime();                         
                 PIR3bits.RC2IF = 0;
                 Nop();
                 RData = RCREG2;
                     if((U2.RxNo==(unsigned int)0)&&(RData != (unsigned char)0xA5))
                 {
                                ;
                 }
                 else if(U2.Rxed == (unsigned char)0)//第一位
                 {   
                            U2JSQ ++;//串口2接收计数器
                            if((RData == (unsigned char)0)&&(U2JSQ == (unsigned char)1))
                               //去掉开头为0的数  从第一个不是零的数开始接收
                            {
                                        U2JSQ = (unsigned char)0;
                            }
                            else
                            {
                                         if(U2.RxNo < UART_RX_BUF_SIZE)                                 //如果接受到的数据个数还小于接收缓冲区大小
                                         {
                                              U2.RxBuf[U2.RxNo] = RData;                       //将接收到的数据存入缓冲区
                                              U2.RxNo ++;                            //指示标志前移
                                         }
                                         else
                                         {
                                              U2.RxNo = 0;                            //否则清空缓冲区
                                         }       
                                         U2.RxTimeOut = U2_RX_TIME_OUT_MS;//100
                             }
                 }
        }

        if(PIR1bits.RCIF)//串口接受中断
           {          
                      if(U1_RxNo==0)//第一位“S”
                      {
                            if(RCREG=='S')
                            {
                                   U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
                            }
                            else{U1_RxNo=0; return;}//接受到S位置
                      }
                      else if(U1_RxNo==1)
                     {
                            if(RCREG=='N')
                           {
                                 U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
                            }
                            else{U1_RxNo=0; return;}
                    }
                     else if(U1_RxNo==2)
                    {
                             if(RCREG=='D')
                         {
                                   U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
                         }
                         else{U1_RxNo=0; return;}
                    }
                         else if(U1_RxNo==3)
                    {
                               if(RCREG=='Z')
                          {
                                   U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
                          }
                          else{U1_RxNo=0; return;}
                    }
                          else if(U1_RxNo>3)
                    {
                           if(U1_RxNo < 100)//如果接受到的数据个数还小于接收缓冲区大小
                         {
                              U1_RxBuf[U1_RxNo] = RCREG;//将接收到的数据存入缓冲区
                              U1_RxNo++;//指示标志前移
                         }
                         else
                         {
                              U1_RxNo = 0;//否则清空缓冲区
                         }
                        U1_RxTimeOut= U1_RX_TIME_OUT_MS;//接受时间
                    }         
          }
}

使用特权

评论回复
12
Pace、|  楼主 | 2016-12-26 22:34 | 只看该作者
设置中断优先级

使用特权

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

本版积分规则

6

主题

34

帖子

0

粉丝