/** * @file $RCSfile: uart_multiproc_master.c,v $ * * Copyright (c) 2004 Atmel. * * Please read file license.txt for copyright notice. * * @brief This file is an example to use uart with timer in * multiprocessor mode. * * This file can be parsed by Doxygen for automatic documentation * generation. * Put here the functional description of this file within the software * architecture of your program. * * @version $Revision: 1.0 $ $Name: $ */ /* @section I N C L U D E S */ #include "reg_c51.h" bit transmit_completed; unsigned char serial_data; char cpt; char crce; #define MSB_reload_value 0xf9 /* msb reload value exemple */ #define LSB_reload_value 0xf9 /* lsb reload value exemple */ #define FC_INIT 3 // fonction + parité #define FC_RESET 3 #define FC_NOCHANGE 2 +4 #define FC_REPONSENOCHANGE 2 +4 #define FC_REPONSE 1 + 4 #define FC_CHANGE 0 #define RECEPT_DATA 1 #define RECEPT_ADRESS 2 unsigned char MajOutp=3; unsigned char MajIn=0; char pt=0; char timeout=0; char stade; char cpt=0,cpt2=0,timeok=0,module=0; // Num module -> Numero module bit 3 a bit 7 parite bit 2 char NumModule[]={0x00,0x0c,0x14,0x18,0x24,0x28,0x30,0x3c,0x44,0x48,0x50,0x5c,0x60,0x6c,0x74,0x78}; char xdata ValInit[16]; char xdata ValOutput[48]; char xdata ValMemo[48]; unsigned char Buf[10]; unsigned char BufIn[10],ptIn; char ReponsePc() { char crc,n,pt; TI = 0; if(BufIn[0] ==0xff) return 1; else if (BufIn[0] =='R') { if (BufIn[1] !='Z' ) { return 0; } if ( BufIn[2] == 'T'){ for (n=0; n < 16; n++) ValInit[n]=-1; TB8 = 0; P1_3 = 0; P1_0 = 1; SBUF = 'Z'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'O'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'K'; /* send data */ while( (TI == 0)); TI = 0; return 1; } } else if ((BufIn[0] =='S')&&(BufIn[1] =='O')) { TI = 0; SBUF = ptIn; /* send data */ while( (TI == 0)); if (ptIn == 7){ crc=0; for (n= 0; n < (ptIn-1); n++) crc ^= BufIn[n] ; //calcul du crc if( crc == BufIn[ptIn-1]){ //verif du crc pt =(BufIn[2]*3) ; for (n=0; n < 3; n++) ValOutput[pt+n] = BufIn[n+3]; TB8 = 0; P1_3 = 0; P1_0 = 1; TI = 0; SBUF = 'O'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'O'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'K'; /* send data */ while( (TI == 0)); TI = 0; SBUF = crc; /* send data */ while( (TI == 0)); TI = 0; P1_3 = 0; return 1; } } } return 0; } char ReponseModule(char num ) { char crc,n,v; if(BufIn[0] ==(NumModule[num]^ FC_REPONSENOCHANGE)) return 1; else if (BufIn[0] ==(NumModule[num]^ FC_INIT)) { if (BufIn[1] !=2 ) { return 0; } if ( BufIn[3] == (BufIn[0]^2^BufIn[2])){ ValInit[num]= BufIn[2]; TB8 = 0; P1_3 = 0; P1_0 = 1; TI = 0; SBUF = 'R'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'S'; /* send data */ while( (TI == 0)); crc='R'^'S'; TI = 0; SBUF = num; /* send data */ while( (TI == 0)); TI = 0; SBUF = BufIn[2]; /* send data */ while( (TI == 0)); TI = 0; SBUF = crc^num^BufIn[2]; /* send data */ while( (TI == 0)); P1_3 = 0; return 1; } else { ValInit[num]--; return 0; } } else if (BufIn[0] ==(NumModule[num]^ FC_CHANGE)) { if (ptIn > 1){ crc=0; for (n= 0; n < (ptIn-1); n++) crc ^= BufIn[n] ; //calcul du crc } if( crc == BufIn[ptIn-1]){ //verif du crc TB8 = 0; P1_3 = 0; P1_0 = 1; TI = 0; SBUF = 'I'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'N'; /* send data */ crc='I'^'N'^num; while( (TI == 0)); TI = 0; SBUF = num; /* send data */ while( (TI == 0)); for (n=1; n < 4; n++){ TI = 0; v = BufIn[n]; if (n >= (ptIn-1)) v=0; crc^=v; SBUF =v; /* send data */ while( (TI == 0)); } TI = 0; SBUF = crc; /* send data */ while( (TI == 0)); TI = 0; P1_3 = 0; return 1;; } } return 0; } char EnvoiModule(char * ptBuf,char Nb) { unsigned char n; timeout=30; P1_3 = 1; P1_0 = 1; TB8 = 1; for (n=0; n < Nb; n++){ while( (TI == 0)&&(n>0)); TI = 0; SBUF = ptBuf[n]; /* send data */ TB8 = 0; /* data mode */ } ptIn=0; TI = 0; while( (TI == 0)&&(n>0)); P1_3 = 0; RI = 0; while ( timeout >1 ) { timeout--; if (RI == 1) { /* if reception occur */ /* clear reception flag for next reception */ BufIn[ptIn++]=SBUF; RI = 0; timeout=20; } } return 1; } void InitModule(char nModule) { char n = 0; char m = nModule * 3; ValOutput[m] = 0; ValMemo[m] = 0xff; m++; ValOutput[m] = 0; ValMemo[m] = 0; m++; ValOutput[m] = 0; ValMemo[m] = 0xff; Buf[0]= NumModule[nModule]^FC_INIT; Buf[1]=2; Buf[2]=Buf[0]^Buf[1]; if(!EnvoiModule(Buf,3)) { return; } if (!ReponseModule(nModule )) { ValInit[nModule]--; for (n=0; n < 100; n++); P1_3 = 1; P1_0 = 1; TB8 = 0; SBUF = ptIn; /* send data */ P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; TB8 = 0; for (n=0; n < ptIn; n++){ SBUF = BufIn[n]; /* send data */ P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; P1_3 = 1; TB8 = 0; /* data mode */ } ptIn=0; P1_3 = 0; return ; } Buf[0]= NumModule[nModule]^FC_INIT; Buf[1]=0; Buf[2]=Buf[0]; EnvoiModule(Buf,3); } void OutModule(char nModule) { char nbb=3; char crc=0; char ptout=nModule*3; Buf[0]=NumModule[nModule]^FC_CHANGE; crc^=Buf[0]; Buf[1]=ValOutput[ptout++]; crc^=Buf[1]; if(ValInit[nModule] != 6){ Buf[2]=ValOutput[ptout++]; crc^=Buf[2]; nbb++; } if(ValInit[nModule] == 4){ Buf[3]=ValOutput[ptout++]; crc^=Buf[3]; nbb++; } Buf[nbb-1]= crc; EnvoiModule(Buf,nbb); ReponseModule(nModule ); } void NoChange(char nModule) { Buf[0]= NumModule[nModule]^FC_NOCHANGE; if(!EnvoiModule(Buf,1)) return; ReponseModule(nModule ); } void main (void) { char n,change; char nbb=3; char crc=0; char ptout=0; char InitOk=0; PCON |= 0x80; SCON = 0xF0; /* uart in mode 3 (9 bit), REN=1 */ CKCON0 &= ~0x01; BDRCON &=0xEC; /* BRR=0; SRC=0; */ BDRCON |=0x0e; /* TBCK=1;RBCK=1; SPD=0 */ BRL = 0xFF; /* 750 000 Bds at 24MHz */ //ES = 0; /* Enable serial interrupt */ EA = 1; /* Enable global interrupt */ SM2=0; BDRCON |=0x10; /* Baud rate generator run*/ P1_1 = 1; P1_2 = 0; for (n=0; n < 16; n++) ValInit[n]=-1; TB8 = 0; P1_3 = 1; SBUF = 'Z'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'O'; /* send data */ while( (TI == 0)); TI = 0; SBUF = 'K'; /* send data */ while( (TI == 0)); TI = 0; P1_3 = 0; while(1) /* endless */ { while(P1_2 == 1) { InitOk=1; if(( ValInit[module] < 0) && (ValInit[module] > -3)) InitModule(module); else if (ValInit[module] > 0 ){ if(module == MajIn){ Buf[0]= NumModule[module]^FC_INIT; Buf[1]=0; Buf[2]=Buf[0]; EnvoiModule(Buf,3); } else { ptout=module*3; change=0; if (ValOutput[ptout] != ValMemo[ptout]) { ValMemo[ptout] = ValOutput[ptout]; change = 1; } ptout++; if (ValOutput[ptout] != ValMemo[ptout]) { ValMemo[ptout] = ValOutput[ptout]; change = 1; } ptout++; if (ValOutput[ptout] != ValMemo[ptout]) { ValMemo[ptout] = ValOutput[ptout]; change = 1; } ptout=module*3; if( (module == MajOutp) || (change)){ OutModule(module); } else NoChange(module); } } if( P1_1 == 0) { timeout=20; P1_3 = 1; P1_0 = 0; RI = 0; ptIn=0; while ( timeout >1 ) { timeout--; if (RI == 1) { /* if reception occur */ /* clear reception flag for next reception */ BufIn[ptIn++]=SBUF; RI = 0; timeout=20; } } P1_0 = 1; P1_3 = 0; ReponsePc(); } module ++; if ( module > 15){ module = 0; MajOutp++; if(MajOutp >15) { MajOutp=0; } MajIn++; if(MajIn >15) { MajIn=0; } } } if(P1_2 == 0) { InitOk=0; for (n=0;n <48;n++){ ValMemo[n] =0; ValOutput[n]=0; } for (n=0;n <15;n++){ if(ValInit[n] > 0 ) OutModule(n); ValInit[n]=-1; } while(P1_2 == 0); } } } /** * FUNCTION_PURPOSE: timer0 interrupt * FUNCTION_INPUTS: void * FUNCTION_OUTPUTS: P1.0 toggle period = 2 * 8192 cycles */ void it_timer0(void) interrupt 1 /* interrupt address is 0x000b */ { TF0 = 0; /* reset interrupt flag (already done by hardware)*/ timeok=0; if (timeout) timeout--; }