Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

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

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top