baby_1
Advanced Member level 1
Hello
here is my program
when the ISR Program was
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
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?
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?