Interrup disable suddenly after process on a string with MPLAB C18

Status
Not open for further replies.

baby_1

Advanced Member level 1
Joined
Dec 3, 2010
Messages
415
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,298
Activity points
4,277
Hello

here is my program

Code:
#include <p18f452.h>
#include <stdio.h>
#include <stdlib.h>
#include "LCD.h"
#include "delays.h"
#include "CTYPE.h"


//////////////////////////Variable

unsigned char xs;
unsigned char i1[17];
unsigned char flags;
unsigned char recv;
unsigned char msg[20];
unsigned char ip;

unsigned int lenght;
unsigned int width;
unsigned int num;
unsigned int angle;

unsigned char dels;

/////////////////////////////

void sendusart(unsigned char datas[17]);
void sendchar(unsigned char data);
void cls(void);
void xcl(void);
void cal(void);
unsigned int meter(unsigned int me,unsigned char states);
unsigned int zav(unsigned int me,unsigned char states);

#pragma config OSC=HSPLL
#pragma config DEBUG=OFF
#pragma config WDT=OFF
#pragma config BOR=OFF
#pragma config LVP=OFF
#pragma config PWRT=ON

#pragma interrupt SerialR
void SerialR(void)
{
    if(PIR1bits.RCIF==1)
    {
        xcl();
    }
  }

#pragma code Mans=0x0008
void Mans(void)
{
    _asm
    GOTO SerialR
    _endasm
}
#pragma code

//////////////////////////Define

#define in1 PORTAbits.RA0
#define in2 PORTAbits.RA1
#define in3 PORTAbits.RA2

#define d1 PORTAbits.RA3
#define d2 PORTAbits.RA5
#define d3 PORTEbits.RE0
#define d4 PORTEbits.RE1
#define d5 PORTEbits.RE2
#define d6 PORTCbits.RC3






void main(void)
{
unsigned int i;
recv=0;
ip=0;
lenght=0;
width=0;
num=0;
angle=0;
    ADCON1=6;
 /////timers
   TRISAbits.RA0=1;
   TRISAbits.RA1=1;
   TRISAbits.RA2=1;
   TRISAbits.RA3=1;
   TRISAbits.RA4=1;
   TRISCbits.RC0=1;
 /////  Outputs
    TRISB=0;
    TRISAbits.RA3=0;
    TRISAbits.RA5=0;
    TRISEbits.RE0=0;
    TRISEbits.RE1=0;
    TRISEbits.RE2=0;
    TRISCbits.RC3=0;

 ////////////////////
 ////////////////////
 ////////////////////

    TXSTA=0x20;
    SPBRG=25;
    TXSTAbits.TXEN=1;

    RCSTA=0x90;

    INTCONbits.GIE=1;
    INTCONbits.PEIE=1;

    PIE1bits.RCIE=1;

   // flags=0;


////////////////////
////////////////////
////////////////////


d1=0;
d2=0;
d3=0;
d4=0;
d5=0;
d6=0;
lcdinit();
i=0;
xs=0;
flags=0;
      cls();
      sprintf(i1,"%S","      IDLE");
      lcdprint(i1);
//////////////////////////

    while(1)
    {
       cls();
      sprintf(i1,"%d-%d",width,ip);
      lcdprint(i1);
      d1=~d1;
      Delay10KTCYx(1000);
}
}


//////////////////////
//////////////////////
/////////////////////
unsigned int meter(unsigned int me,unsigned char states)
{
    unsigned int i;
    i=0;
    if(states==1)
    {
        INTCONbits.TMR0IF=0;
        T0CON=0xA8;
        i=TMR0H;
        i=i<<8;
        i=i | TMR0L;
        return i;
    }
    INTCONbits.TMR0IF=0;
    TMR0H=0;
    TMR0L=0;
    T0CON=0xA8;
    while(i<=me)
    {
        i=TMR0H;
        i=i<<8;
        i=i | TMR0L;
    }
    T0CON=0x00;
    return i;
}


unsigned int zav(unsigned int me,unsigned char states)
{
    unsigned int i;
    i=0;
    if(states==1)
    {
        i=TMR1H;
        i=i<<8;
        i=i | TMR1L;
        return i;
    }
    PIR1bits.TMR1IF=0;
    TMR1H=0;
    TMR1L=0;
    T1CON=0x83;
    while(i<=me)
    {
        i=TMR1H;
        i=i<<8;
        i=i | TMR1L;
    }
    T1CON=0x00;
    return i;
}

void sendusart(unsigned char datas[17])
{
   unsigned char i;
    i=0;
    while(datas[i]!=0)
    {
      TXREG=datas[i];
        while(PIR1bits.TXIF==0);
        Delay1KTCYx(10);
        i=i+1;
    }
}
void sendchar(unsigned char data)
{
        TXREG=data;
        while(PIR1bits.TXIF==0);
        Delay1KTCYx(10);

}

void cls(void)
{
        writecommand(0x01);
        Delay1KTCYx(15);
        writecommand(0x02);
        Delay10TCYx(15);
}

void xcl(void)
{
    xs=RCREG;

                if(xs>=48 && xs<=57)
        {
                xs=xs-48;
                switch(ip){
                   case 0:lenght=lenght*10+xs;break;
                    case 1:width=width*10+xs;break;
                    case 2:num=num*10+xs;break;
                    case 3:angle=angle*10+xs;break;
                }
        }
            else
            {
                ip=ip+1;
            }

   

    PIR1bits.RCIF=0;
      }

when the ISR Program was

Code:
void xcl(void)
{
    xs=RCREG;
writedata(xs) ' Write on the lcd each Character

    PIR1bits.RCIF=0;
      }

if i send "15991345" is shows me 15991345

but i want to send some numbers via RS232 protocol i separate each numbers with a Character like this

A1518^7823|56842<3010B

in this ISR function

Code:
void xcl(void)
{
    xs=RCREG;

            if(xs>=48 && xs<=57)
        {
                xs=xs-48;
                switch(ip){
                   case 0:lenght=lenght*10+xs;break;
                    case 1:width=width*10+xs;break;
                    case 2:num=num*10+xs;break;
                    case 3:angle=angle*10+xs;break;
                }
        }
            else
            {
                ip=ip+1;
            }

     

    PIR1bits.RCIF=0;
      }

when i want to split each numbers to specify variable it shows shows me the first number (example:1518) and the other have zero value.when i send another command its interrupts doesn't work and only d1=~d1 runing.

what is my fault?
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…