Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
communication PC-PIC par USB-UART
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Voici le code que j'ai utilisé , mais avec ma carte en cours .. un Click 18F47J53 !
Il y a donc quelques differences , minimes..
Mon BP est à 1 au repos , 0 su appuyé
J'utilise l'UART2 au lieu de l'UART1
j'utilise le LCD 2119 I2C .. donc syntaxes differentes , mais reconnaissable..
j'utilise buffer2 au lieu de buffer
Attention si on envoie LF (10)+ CR(13) en fin de message .. en retour sur le LCD ..la ligne LCD disparait à cause du LF (10)
il vaut mieux envoyer CR + LF .. ou simplement CR dans ce cas de figure.
RAZ_UART2 nettoie le buffer et reinuitialise le poineteur index
Je stoppe l'interrupt RC2IE_bit=0 sur reception /validation de message .. et le rearme apres traitement du buffer
j'utilise aussi 2 index pour le buffer
i2 qui est local à l'interrupt .. non visible dans le main
et Index2 qui est l'image de I2 ,mais non mis à zero sur reception de CR .. il contient donc le nb de caracteres recus
peut etre utile ! mais non indispensable.
Traitement des erreurs OERR et FERR.. qui sont bloquantes si non traitees.
J'ai rajouté un compteur de message simpliste de 0 à 9 qui apparait en haut à droite de la 1ere ligne LCD
ce qui permet de "voir " une raffale d'envoi de message identique par incrementation dudit compteur..
Testé OK à 38400 bds et à 115200 bds
nota PIC à 48MHz!
Il y a donc quelques differences , minimes..
Mon BP est à 1 au repos , 0 su appuyé
J'utilise l'UART2 au lieu de l'UART1
j'utilise le LCD 2119 I2C .. donc syntaxes differentes , mais reconnaissable..
j'utilise buffer2 au lieu de buffer
Attention si on envoie LF (10)+ CR(13) en fin de message .. en retour sur le LCD ..la ligne LCD disparait à cause du LF (10)
il vaut mieux envoyer CR + LF .. ou simplement CR dans ce cas de figure.
RAZ_UART2 nettoie le buffer et reinuitialise le poineteur index
Je stoppe l'interrupt RC2IE_bit=0 sur reception /validation de message .. et le rearme apres traitement du buffer
j'utilise aussi 2 index pour le buffer
i2 qui est local à l'interrupt .. non visible dans le main
et Index2 qui est l'image de I2 ,mais non mis à zero sur reception de CR .. il contient donc le nb de caracteres recus
peut etre utile ! mais non indispensable.
Traitement des erreurs OERR et FERR.. qui sont bloquantes si non traitees.
J'ai rajouté un compteur de message simpliste de 0 à 9 qui apparait en haut à droite de la 1ere ligne LCD
ce qui permet de "voir " une raffale d'envoi de message identique par incrementation dudit compteur..
Testé OK à 38400 bds et à 115200 bds
nota PIC à 48MHz!
Code : Tout sélectionner
void interrupt() iv 0x0008 ics ICS_AUTO
{
static int i2=0;
if((RC2IF_bit==1) && (RC2IE_bit==1))
{
c2 = RCREG2 ;
//if(OERR_bit) //
if(RCSTA2.B1) // OERR de RCSTA2
{
CREN2_bit = 0;
_asm nop;
_asm nop;
CREN2_bit = 1;
_asm nop;
}
if(FERR2_bit)
{
RCREG2=0;
_asm nop;
c2 = RCREG2;// UART2_Read(); //c2 = RCREG2;
}
if ((c2==13) || (c2==10) || (i2 >=16)) // terminaison par CR ou LF ou buffer plein
{
Flag_data_OK=1;
buffer2[i2]=0 ;
c2=0;
Index2=i2; // Index pouvant etre utilisé dans le main
i2=0; // index local à l'interrupt
RC2IE_bit=0 ; // pour blocage reception
}
else
{
buffer2[i2]=c2;
i2++;
Index2=i2;
}
}
}
#define MAXLEN2 16
void RAZ_UART2()
{
RC2IE_bit=0 ;
// nettoie le buffer
for (i=0;i<MAXLEN2;i++) buffer2[i]=0;
Index2=0;
c2=RCREG2; // vide buffer UART
c2=0;
Flag_data_OK=0;
RC2IE_bit=1 ;
}
..... main ................
RAZ_UART2();
Index=0;
RC2IE_bit = 1; // Enable UART_Remappable RX interrupt
PEIE_bit = 1; // Enable Peripheral interrupt
GIE_bit = 1; // Enable Global interrupt
LCD_CLS();
LCD_Write_CText(1,1,"Test RX Interrupt");
k=0;
while (1)
{
if (BP==0)
// if ((BP==1) && (UART1_Tx_Idle() == 1)) // Check le BP et le buffer
{ // Attention : UART2 utilisé ici au lieu de UART1 !
UART2_Write_Text("Hello World !"); // Envoie du texte
UART2_Write(13); // envoie un CR // invertion CR et LF, sinon le mesg sur LCD peut disparaitre !
UART2_Write(10); // Envoie un LF
// while (BP==1); // Anti rebond
while (BP==0); //car mon BP est à 1 au repos et donc BP==0 si appuyé
}
if (Flag_data_OK==1) // Si la drapeau de fin de trame, on affiche le mot stocker dans le buffer
{
// echo sur terminal
LCD_Write_CText(1,1,"Rx buffer= ");
//Lcd_out (1, 1, "Rx_buffer=" );
LCD_Write_Chr_at(1,15,k+48); // numero de message 0 à 9
buffer2[16]=0; // Verouilage à 16 car maxi affichable sur LCD
LCD_RAZ_Ligne(2);
LCD_Write_Text(2,1,buffer2);
// Lcd_out (2, 1, Rx_buffer ); // On l'affiche
Flag_data_OK=0; // On RAZ le flag
Index2=0; // car Je ne RAZ pas l'index dans l'interrupt
k++;
if (k>9) k=0;
RC2IE_bit=1 ;
}
}
communication PC-PIC par USB-UART
communication PC-PIC par USB-UART
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bon voila un truc qui fonctionne très bien, inspiré de celui de Paul .
Frequence OSCà 8Mhz si je change , il ecrit n'importe quoi ??
Vitesse à 115200 bauds impeccable pas un bug
J'ai télécharger realterm pour dialoguer entre le PIC et le PC , car avec l'outil de MikroC j’avais des bugs incessants , quand je reprogrammais mon pic .
pensez vous qu'il est bien structuré ?
EDIT: j'ai rajouté les codes pour traiter les erreurs
Frequence OSCà 8Mhz si je change , il ecrit n'importe quoi ??
Vitesse à 115200 bauds impeccable pas un bug
J'ai télécharger realterm pour dialoguer entre le PIC et le PC , car avec l'outil de MikroC j’avais des bugs incessants , quand je reprogrammais mon pic .
pensez vous qu'il est bien structuré ?
EDIT: j'ai rajouté les codes pour traiter les erreurs
Code : Tout sélectionner
/*##################################################################################
Programme de test pour liaison UART-USB sur carte EasyPIC_V7 avec PC
Fait par Jérémy pour FantasPic.fr
- Version du "22-12-2015"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC à 8MHZ, Quartz extrene de 8Mhz, PLL désactivée
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
- manuel et schéma de la carte : http://www.mikroe.com/downloads/get/1711/easypic_v7_manual_v104c.pdf
#################################################################################*/
#define BP PORTD.B0
// Connections de l'écran LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin connections LCD
// Déclaration des variables utilisées -------------------------------------------
char Rx_buffer[16] ;
int Registre, Flag_Data_OK=0, i=0;
// Fin des varaibles----------------------------------------------------------------
// Prototypes ---------------------------------------------------------------------
// FIN Prototypes
// Début Interruption---------------------------------------------------------------
void interrupt (){
if ((PIR1.RC1IF) && (RC1IE_bit)) // On check le FLAG de l'INT et si elle est autorisée
{
Registre=RCREG1; // On enregsitre le buffer, qui a pour effet de RAZ le flag RC1IF
if (OERR1_bit) // Gestion des erreurs ici over run erreur est traité
{ // saturation du buffer. 2 bit stockées une 3ieme recue.
CREN1_bit = 0; // Remise à zéro de CREN1 pour effacer l'erreur
_asm nop;
_asm nop;
CREN1_bit = 1;
_asm nop;
}
if (FERR1_bit) // Framing Error
{ // Il s'agit du temps ecoulé trop long pour recevoir le bit de stop
RCREG1='*';
_asm nop;
Registre = RCREG1; // On indique une erreur par l'afficahge d'une '*'
}
if ((Registre == 13) || (i>=16)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
{
RC1IE_bit = 0; // On interrompt la recetpion le temps de l'affichage
Flag_Data_OK=1; // On léve le drapeau pour indiqué que le mot est fini
}
else
{
Rx_buffer[i]= Registre; // On enregistre la lettre à l'emplacement de l'index dans le buffer
i++; // On incremente l'index pour la lettre suivante
}
}
}
// Fin Interruption ----------------------------------------------------------------
//##################################################################################
//######################### PROGRAMME PRINCIPAL #########################
//##################################################################################
void main() {
ANSELB = 0x00; // Configure le PORTB en digital pour le LCD
ANSELC = 0x00; // PORTB en digital
ANSELD = 0x00; // PORTB en digital
TRISB = 0x00; // PORTB en sortie
TRISC = 0x00; // PORTC en sortie
TRISD = 0xFF; // PORTD en entrée
//----- config. interrutpion ------------------------------------------------------
INTCON.GIE = 1; // Activation Global des INT
INTCON.PEIE = 1; // Active l'INT sur periphérique
PIE1.RC1IE = 1; // Active l'INT sur reception EUSART
PIR1.RC1IF = 0; // bit=0 --> buffer vide
//PIE1.TX1IE = 0; // Active l'INT sur l'émission EUSART
//PIR1.TX1IF = 1; // bit=0 --> buffer plein
//---------------------------------------------------------------------------------
UART1_Init(57600); // Initialisation de l'UART
delay_ms(100); // Petite pause
Lcd_Init(); // Initialisation du LCD
Lcd_Cmd (_LCD_CLEAR); // On efface l'écran
Lcd_Cmd (_LCD_CURSOR_OFF);// On arrete le clignotement du curseur
delay_ms(100); // Petite pause
//####################### BOUCLE INFINIE ####################################
while (1)
{
if (Flag_data_OK==1) // Si la drapeau de fin de trame, on affiche le mot stocker dans le buffer
{
for (;i<=15;i++) // On comble le reste de la ligne avec des espaces
Rx_buffer[i] = ' ';
Lcd_Out (2, 1, Rx_buffer); // on ecrit sur le LCD
Flag_data_OK = 0; // on reame notre drapeau
i = 0; // on raz l'index
RC1IE_bit = 1; // On autoriser l'INT
}
if ((BP==1) && (UART1_Tx_Idle() == 1)) // Check le BP et le buffer
{
UART1_Write_Text("Hello World !"); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
while (BP==1); // Anti rebond
i=0; // Pour le test l'appui sur l'emission efface l'ecran
Lcd_Cmd (_LCD_CLEAR);
}
}
}
//##################################################################################
//######################### PROGRAMME SECONDAIRE #########################
//##################################################################################
communication PC-PIC par USB-UART
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Question :
Pourquoi quand je ne suis pas connecté à mon port COM ( realterm éteint), Il y a des bugs à l'envoi ? j' entend par la , que ma led d'indication d'envoi sur ma carte , ne s'allume qu'une fois sur 10/15 grosso modo quand j’appuie sur le BP? ( idle ?)
Quand je connecte le PORT impeccable , 1 appui => 1 envoi
Question :
le fait de faire le test sur le bit ( if (FERR1_bit)) est-il interprété comme une lecture ? Sinon ne devrait pas le lire e l"enregistrant dans une variable ?
Pourquoi quand je ne suis pas connecté à mon port COM ( realterm éteint), Il y a des bugs à l'envoi ? j' entend par la , que ma led d'indication d'envoi sur ma carte , ne s'allume qu'une fois sur 10/15 grosso modo quand j’appuie sur le BP? ( idle ?)
Quand je connecte le PORT impeccable , 1 appui => 1 envoi
Question :
Therefore, the FERR bit must be read before reading the RCREG.x
le fait de faire le test sur le bit ( if (FERR1_bit)) est-il interprété comme une lecture ? Sinon ne devrait pas le lire e l"enregistrant dans une variable ?
communication PC-PIC par USB-UART
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
On s'intruit tous les jours davantage !
Au niveau MCU, je ne pense pas qu'on fasse un equivalent de LECTURE entiere du registre RCSTAx
avec un Test bit à bit ... quoique au niveau microcode interne MCU ?
voir d'autres avis ....
Neammoins la lecture de RCREG efface au moins le premier byte fautif ..
le probleme est si le caractere suivant est aussi en FERR
d'ou peut etre l'usage d'un while , en cas d'erreurs successives.
et de la solution drastique via RCSTA1.SPEN
// If all receive characters in the receive FIFO have framing errors, repeated reads
// of the RCREGx will not clear the FERR bit.
En principe RCREG ne peut etre que lu ?
à confirmer
sauf que sur mon dernier PIC18F47J53 datasheet:
----
alors que pour le PIC18F45K22
-----
à moins que ce soit une erreur datasheet
.. à confirmer ?
format classique 8 bits ,N (sans parite) ,1 stop
on peut forcer l'erreur OERR et FERR en mettant le format d'envoi terminal 7,N,1 .. on a alors sur le terminal *@*@....
on peut forcer l'erreur FERR seule en mettant le format d'envoi terminal 7,N,2... on a alors sur le terminal @@@@....
corrigé whilef par while
Au niveau MCU, je ne pense pas qu'on fasse un equivalent de LECTURE entiere du registre RCSTAx
avec un Test bit à bit ... quoique au niveau microcode interne MCU ?
voir d'autres avis ....
Neammoins la lecture de RCREG efface au moins le premier byte fautif ..
le probleme est si le caractere suivant est aussi en FERR
d'ou peut etre l'usage d'un while , en cas d'erreurs successives.
et de la solution drastique via RCSTA1.SPEN
// If all receive characters in the receive FIFO have framing errors, repeated reads
// of the RCREGx will not clear the FERR bit.
En principe RCREG ne peut etre que lu ?
à confirmer
sauf que sur mon dernier PIC18F47J53 datasheet:
bit 2 FERR: Framing Error bit
1 = Framing error (can be updated by clearing the RCREGx register and receiving the next valid byte)
0 = No framing error
----
alors que pour le PIC18F45K22
bit 2 FERR: Framing Error bit
1 = Framing error (can be updated by reading RCREGx register and receive next valid byte)
0 = No framing error
-----
à moins que ce soit une erreur datasheet
.. à confirmer ?
format classique 8 bits ,N (sans parite) ,1 stop
on peut forcer l'erreur OERR et FERR en mettant le format d'envoi terminal 7,N,1 .. on a alors sur le terminal *@*@....
on peut forcer l'erreur FERR seule en mettant le format d'envoi terminal 7,N,2... on a alors sur le terminal @@@@....
Code : Tout sélectionner
if (OERR1_bit) // Gestion des erreurs ici over run erreur est traité
{ // saturation du buffer. 2 bit stockées une 3ieme recue.
TXREG1='@'; // echo sur terminal pour signaler erreur Overrun OERR
CREN1_bit = 0; // Remise à zéro de CREN1 pour effacer l'erreur
_asm nop;
_asm nop;
CREN1_bit = 1;
_asm nop;
}
while (FERR1_bit) // Tant qu'on a Framing Error
{
// Il s'agit du temps ecoulé trop long pour recevoir le bit de stop
// RCREG1='*'; on ne peut pas ecrire dans RCREG !
// par contre on peut dans TXREG '*' en echo sur terminal
TXREG1='*'; /// echo sur terminal pour signaler erreur Frame FERR
_asm nop;
//It is not necessary to clear the FERR bit. Reading the next character from the FIFO buffer will
// advance the FIFO to the next character and the next corresponding framing error.
Registre = RCREG1; // lecture du reguistre pour effacer le defaut
// The FERR bit can be forced clear by clearing the SPEN bit of the RCSTAx register which resets the EUSART.
// why not ! mais c'est peut etre un peu trop VIRULENT ! .. à mon avis
RCSTA1.SPEN=0;
_asm nop;
RCSTA1.SPEN=1;
_asm nop;
}
corrigé whilef par while
Modifié en dernier par paulfjujo le mar. 22 déc. 2015 14:17, modifié 1 fois.
communication PC-PIC par USB-UART
Bonjour
Paul je ne vois rien.Pour:
Oerr débordement du buffer, tu passes bien de 0->1 CREN
Ferr erreur de synchronisation (bit stop a zéro au lieu de 1) pour ce bit ainsi que rx9d il faut bien sur les lire avant de lire RCREG puis revalidation du port.
Pour l’écriture du RCREG je ne peux pas sur un 184552 écrire dans ce registre
A+
Paul je ne vois rien.Pour:
Oerr débordement du buffer, tu passes bien de 0->1 CREN
Ferr erreur de synchronisation (bit stop a zéro au lieu de 1) pour ce bit ainsi que rx9d il faut bien sur les lire avant de lire RCREG puis revalidation du port.
Pour l’écriture du RCREG je ne peux pas sur un 184552 écrire dans ce registre
A+
communication PC-PIC par USB-UART
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
maï a écrit :Bonjour
Paul je ne vois rien.Pour:
Oerr débordement du buffer, tu passes bien de 0->1 CREN
OUI !
Pour l’écriture du RCREG je ne peux pas sur un 184552 écrire dans ce registre
A+
Pour mon PIC18F47J53
En mode debug MikroC on peut ecrire dans RCREG2 .. mais je pense que c'est juste dans une case memoire du debugger et non dans l'UART
car le test suivant, en reel avec le hardware , me donnes en retour RCREG=0 ..donc l'ecriture ne passe pas
=> erreur Datasheet !
Code : Tout sélectionner
txt=&TEXTE[0];
Etat= UART2_Assign_To_PPS() ;
if (Etat==2) Drapeaux.PPS=1; else Drapeaux.PPS=0;
UART2_Init(115200);
Delay_ms(200);
UART2_Write(CLS);
Delay_ms(500);
c3=RCREG2; // vide buffer
c3=RCREG2;
RCREG2=99; // test ecriture dans RCREG2
_asm nop;
c3=RCREG2; // et relecture
_asm nop;
RCREG2=12; // test ecriture dans RCREG2
_asm nop;
c4=RCREG2; // et relecture
_asm nop;
UART2_Write_CText("\r\nRecupere c3 et c4 pour affichage contenu : ");
ByteToStr(c3,txt);
UART2_Write_Text(txt);
UART2_Write(TAB);
ByteToStr(c4,txt);
UART2_Write_Text(txt);
CRLF2();
14:16:20.093> Recupere c3 et c4 pour affichage contenu : 0 0
communication PC-PIC par USB-UART
communication PC-PIC par USB-UART
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bon la simulation d'erreur est bizarre . J'ia pas trop compris à mon avis .
je suis passé en mode 7N1 . et j'envoie des caractères * quand j'en envoie 18 ça me mes le message d'erreur sur le LCD ; mais la réaction est plutôt aléatoire !
Voici mon code:
je suis passé en mode 7N1 . et j'envoie des caractères * quand j'en envoie 18 ça me mes le message d'erreur sur le LCD ; mais la réaction est plutôt aléatoire !
Voici mon code:
Code : Tout sélectionner
/*##################################################################################
Programme de test pour liaison UART-USB sur carte EasyPIC_V7 avec PC
Fait par Jérémy pour FantasPic.fr
- Version du "21-12-2015"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC à 8MHZ, Quartz extrene de 8Mhz, PLL désactivée
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
- manuel et schéma de la carte : http://www.mikroe.com/downloads/get/1711/easypic_v7_manual_v104c.pdf
#################################################################################*/
#define BP PORTD.B0
// Connections de l'écran LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin connections LCD
// Déclaration des variables utilisées -------------------------------------------
char Rx_buffer[16] ;
int Registre, Flag_Data_OK=0, i=0, Flag_Erreur=0;
// Fin des varaibles----------------------------------------------------------------
// Prototypes ---------------------------------------------------------------------
// FIN Prototypes
// Début Interruption---------------------------------------------------------------
void interrupt (){
if ((PIR1.RC1IF) && (RC1IE_bit)) // On check le FLAG de l'INT et si elle est autorisée
{
Registre=RCREG1; // On enregsitre le buffer, qui a pour effet de RAZ le flag RC1IF
if (OERR1_bit) // Gestion des erreurs ici over run erreur est traité
{ // saturation du buffer. 2 bit stockées une 3ieme recue.
CREN1_bit = 0; // Remise à zéro de CREN1 pour effacer l'erreur
Flag_Erreur = 1;
_asm nop;
CREN1_bit = 1;
_asm nop;
}
while (FERR1_bit) // Framing Error
{ // Il s'agit du temps ecoulé trop long pour recevoir le bit de stop
TXREG1='*'; // On indique une erreur par l'affichage d'un echo '*'
Flag_Erreur = 1;
Registre = RCREG1;
}
if ((Registre == 13) || (i>=16)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
{
RC1IE_bit = 0; // On interrompt la recetpion le temps de l'affichage
Flag_Data_OK=1; // On léve le drapeau pour indiqué que le mot est fini
}
else
{
Rx_buffer[i]= Registre; // On enregistre la lettre à l'emplacement de l'index dans le buffer
i++; // On incremente l'index pour la lettre suivante
}
}
}
// Fin Interruption ----------------------------------------------------------------
//##################################################################################
//######################### PROGRAMME PRINCIPAL #########################
//##################################################################################
void main() {
ANSELB = 0x00; // Configure le PORTB en digital pour le LCD
ANSELC = 0x00; // PORTB en digital
ANSELD = 0x00; // PORTB en digital
TRISB = 0x00; // PORTB en sortie
TRISC = 0x00; // PORTC en sortie
TRISD = 0xFF; // PORTD en entrée
//----- config. interrutpion ------------------------------------------------------
INTCON.GIE = 1; // Activation Global des INT
INTCON.PEIE = 1; // Active l'INT sur periphérique
PIE1.RC1IE = 1; // Active l'INT sur reception EUSART
PIR1.RC1IF = 0; // bit=0 --> buffer vide
//PIE1.TX1IE = 0; // Active l'INT sur l'émission EUSART
//PIR1.TX1IF = 1; // bit=0 --> buffer plein
//---------------------------------------------------------------------------------
UART1_Init(57600); // Initialisation de l'UART
delay_ms(100); // Petite pause
Lcd_Init(); // Initialisation du LCD
Lcd_Cmd (_LCD_CLEAR); // On efface l'écran
Lcd_Cmd (_LCD_CURSOR_OFF);// On arrete le clignotement du curseur
delay_ms(100); // Petite pause
//####################### BOUCLE INFINIE ####################################
while (1)
{
if (Flag_data_OK==1) // Si la drapeau de fin de trame, on affiche le mot stocker dans le buffer
{
for (;i<=15;i++) // On comble le reste de la ligne avec des espaces
Rx_buffer[i] = ' ';
Lcd_Out (2, 1, Rx_buffer); // on ecrit sur le LCD
Flag_data_OK = 0; // on reame notre drapeau
i = 0; // on raz l'index
RC1IE_bit = 1; // On autoriser l'INT
}
if (((BP==1) && (UART1_Tx_Idle() == 1))) // Check le BP et le buffer
{
UART1_Write_Text("Hello World !"); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
while (BP==1); // Anti rebond
i=0; // Pour le test l'appui sur l'emission efface l'ecran
Lcd_Cmd (_LCD_CLEAR);
}
if (((Flag_Erreur==1) && (UART1_Tx_Idle() == 1))) // Check le BP et le buffer
{
UART1_Write_Text("Erreur"); // Envoie du texte
Lcd_Out (1, 1, "Erreur");
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
Flag_Erreur=0;
delay_ms(1000);
Lcd_Cmd (_LCD_CLEAR);
}
}
}
//##################################################################################
//######################### PROGRAMME SECONDAIRE #########################
//##################################################################################
communication PC-PIC par USB-UART
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 117 invités