Révision 861
Ajouté par jeleroy il y a presque 4 ans
SP4c2.c | ||
---|---|---|
|
||
#include "sfr32c87.h"
|
||
|
||
void uart0_init(void);
|
||
void uart0_tx(char c);
|
||
char uart0_rx(void);
|
||
int rec_trame(char* trame);
|
||
void irec_trame();
|
||
int hex2int(char* c);
|
||
void uart0_inter_init();
|
||
char trame[200];
|
||
int nombre_caractere = 0;
|
||
|
||
void uart0_inter_init(){
|
||
u0c1 = 0x15;
|
||
s0tic = 0x0F;
|
||
s0ric = 0x0F;
|
||
}
|
||
|
||
int etat=1;
|
||
int trame_ok = 0;
|
||
|
||
void uart0_init(void){
|
||
//Configuration des ports en entr?e ou en sortie
|
||
pd6_2 = 0; //RX en entr?e
|
||
... | ... | |
|
||
}
|
||
|
||
int rec_trame(char* trame){
|
||
int i = 1,trame_ok =0;
|
||
int check_sum=0;
|
||
char check_sum_trame[2];
|
||
#pragma INTERRUPT 18 irec_trame
|
||
|
||
void irec_trame(){
|
||
static int i = 0;
|
||
static int check_sum=0;
|
||
static char check_sum_trame[2];
|
||
char c;
|
||
|
||
while (uart0_rx() != '$'); //Tant qu'on ne re?oit pas le carat?re quii indique le d?but de la trame, on attend
|
||
while ((c = uart0_rx()) != '*'){//Reception des caracteres jusqu'? la fin de la trame
|
||
trame[i] = c;
|
||
check_sum ^= trame[i]; //Calcul du checksum de la trame re?ue
|
||
i++;
|
||
}
|
||
c = uart0_rx();
|
||
|
||
check_sum_trame[1] = uart0_rx(); //Acquisition du premier caractere du checksum
|
||
check_sum_trame[0] = uart0_rx();//Acquisition du deuxieme caractere du checksum
|
||
switch (etat){
|
||
case 1:
|
||
if (c == '$'){ //Tant qu'on ne re?oit pas le carat?re qui indique le d?but de la trame, on attend
|
||
etat = 2;
|
||
check_sum=0;
|
||
i = 0;
|
||
}
|
||
break;
|
||
|
||
case 2:
|
||
//Calcul du checksum
|
||
if (c != '*'){ //Tant qu'on ne re?oit pas le carat?re qui indique la fin de la trame, on continue de recevoir les caract?res
|
||
trame[i] = c;
|
||
check_sum ^= trame[i]; //Calcul du checksum de la trame re?ue
|
||
nombre_caractere++;
|
||
i++;
|
||
}else{
|
||
etat = 3;
|
||
i = 0;
|
||
}
|
||
break;
|
||
|
||
case 3:
|
||
//Lecture des caract?res correspondant au checksum
|
||
check_sum_trame[i] = c;
|
||
i++;
|
||
if (i == 2){ //Tant qu'on ne re?oit pas le carat?re qui indique le d?but de la trame, on attend
|
||
etat = 4;
|
||
}
|
||
break;
|
||
|
||
case 4:
|
||
//Comparaison(validation)
|
||
if (check_sum == hex2int(check_sum_trame)){
|
||
trame_ok = 1;
|
||
etat = 1;
|
||
}else{
|
||
trame_ok = 0;
|
||
etat = 1;
|
||
}
|
||
uart0_tx(trame_ok);
|
||
uart0_tx(nombre_caractere);
|
||
break;
|
||
|
||
}
|
||
|
||
|
||
|
||
if (check_sum == hex2int(check_sum_trame)){
|
||
trame_ok = 1;
|
||
}else{
|
||
trame_ok = 0;
|
||
}
|
||
uart0_tx(trame_ok);
|
||
|
||
return i;
|
||
}
|
||
|
||
int hex2int(char* c){
|
||
... | ... | |
}
|
||
}
|
||
|
||
return(c[0] + 16* c[1]);
|
||
return(c[1] + 16* c[0]);
|
||
|
||
}
|
||
}
|
||
|
||
void uart0_tx(char c){
|
||
while(ti_u0c1 != 1); //tant qu'il n'y a pas de donn?e dans le registre de transmission
|
||
... | ... | |
|
||
int i;
|
||
char trame[200];
|
||
char buffer[200];
|
||
|
||
void main(void)
|
||
{
|
||
uart0_init();
|
||
uart0_inter_init();
|
||
asm("FSET I");
|
||
while(1){
|
||
if (trame_ok == 1){
|
||
trame_ok = 0; //Remise z?ro de trame_ok d?s que la r?ception de la trame s'est bien pass?e
|
||
}
|
||
|
||
while(1){
|
||
rec_trame(trame); //Reception de la trame
|
||
}
|
||
|
||
|
||
}
|
||
}
|
Formats disponibles : Unified diff
Fin TP_SP4_c2 (réception de la trame GPS avec les interruptions)