Projet

Général

Profil

« Précédent | Suivant » 

Révision 861

Ajouté par jeleroy il y a presque 4 ans

Fin TP_SP4_c2 (réception de la trame GPS avec les interruptions)

Voir les différences:

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