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
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Pour ton LCD, tu ne crois pas qu'il serait bien temps de te mettre a debug ? une fois que tu vas goutter, tu seras comme ME impossible sans mon debug
J'ai essayé plusieurs fois , mais sa m'as saoulé, car il se passe un truc bizarre, le programme ouvre, et rentre dans un nouveau fichiers , avec les commandes ASM, et impossible d'en sortir.
j'avoue ne pas avoir trop creuser encore, car je n'en ai pas eu trop besoin disons !.
communication PC-PIC par USB-UART
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
tu ne t'y prends pas bien dans ce cas de figure, puisque Uart_read_Text... attendra jusqu'à ce que tu aies 20 caracteres ou renconté OK
Une gestion d'interruption ne doit pas etre bloquante .
RCIF suffit pour detecter l'interrupt, on peut y rajouter RC1IE pour verif si autorisé
precaution pour la suite .. si on rajoute d'autres sources d'interruptions..
On recupere le caractere dispo dans RCREG ( ayant causé l'interrupt !)
et on le range (via un index de position) dans le buffer..
Il faut par contre un delimiteur pour détecter la fin de transmission (ou validation)
ce peut etre le 'K' de "OK" (ou chosir CR =touche ENTER)
pour armer un flag qui sera utilisé dans le programme principal
il y a d'autres variantes pour gerer un buffer circulaire .. etc..
une alternative à l'interface utilisé sur ta carte (post #1)
un cordon USB/TTL liaison directe USB vers UART PIC
voir ICI
Code : Tout sélectionner
void interrupt (){
if (PIR1.RC1IF==1 && UART1_Data_Ready()){ // On check le FLAG de l'INT et le buffer
UART_Read_Text(Rx_buffer, "OK", 20); // On enregisre le text
Lcd_out (1, 1, Rx_buffer ); // On l'affiche
PIR1.RC1IF = 0; // On réarme
}
}
tu ne t'y prends pas bien dans ce cas de figure, puisque Uart_read_Text... attendra jusqu'à ce que tu aies 20 caracteres ou renconté OK
Une gestion d'interruption ne doit pas etre bloquante .
RCIF suffit pour detecter l'interrupt, on peut y rajouter RC1IE pour verif si autorisé
precaution pour la suite .. si on rajoute d'autres sources d'interruptions..
On recupere le caractere dispo dans RCREG ( ayant causé l'interrupt !)
et on le range (via un index de position) dans le buffer..
Il faut par contre un delimiteur pour détecter la fin de transmission (ou validation)
ce peut etre le 'K' de "OK" (ou chosir CR =touche ENTER)
pour armer un flag qui sera utilisé dans le programme principal
Code : Tout sélectionner
void interrupt (){
if (PIR1.RC1IF==1) && (RC1IE_bit)) // On check le FLAG de l'INT
{
// il manque ici
// la gestion des erreur OERR
// et FERR
c1=RCREG; // lecture registre UART
buffer[index]=c1;
index++;
// si on detect la fin de lmmessage par K ou si on atteint la fin du buffer
if ((c1=='K') || (index >=20))
{
buffer[index]=0; // terminateur de string
Index=0;
Flag_Data_OK=1;
RC1IE_bit=0; // *option pour bloquer la reception tant qu'on a pas utilisé le resulat du buffer
}
// PIR1.RC1IF = 0; // On réarme <- NON, c'est la lecture de RCREG qui efface ce drapeau
}
}
// ...init
char c1;
int index;
int Flag_Data_OK;
index=0;
Flag_Data_OK=0;
//... dans le main
while(1)
{
....
if (Flag_data_OK==1)
{
... affiche sur LCD ..
...etc ...
Flag_data_OK=0;
RC1IE_bit=1; // *option pour rearmer l'autorisation de reception
}
....
} // while
il y a d'autres variantes pour gerer un buffer circulaire .. etc..
une alternative à l'interface utilisé sur ta carte (post #1)
un cordon USB/TTL liaison directe USB vers UART PIC
voir ICI
communication PC-PIC par USB-UART
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
paulfjujo a écrit :Source du message une alternative à l'interface utilisé sur ta carte (post #1)
un cordon USB/TTL liaison directe USB vers UART PIC
voir ICI
J'en ai un , mais pour le moment restons sur la simplicité.
On recupere le caractere dispo dans RCREG ( ayant causé l'interrupt !)
Je comprends pas. Quand on envoie une chaine de caracteres ,on envoie octet par octet. Donc il y aura autant d'INT que de caractères ?
et on le range (via un index de position) dans le buffer..
La c'est l'index de position que je ne comprends pas ?
Il faut par contre un délimiteur pour détecter la fin de transmission (ou validation)
Ce n'est pas l'absence de réception qui peut faire office de détection de fin de transmission ? certainement pas fiable !
Pour resumer ton programme puis-je ecrire
- INT sur flag de réception de donnée. On sait qu'on reçoit car le RCREG1 à été rempli ( effacé automatiquement quand lu) page 119
- On enregistre le RCREG1 dans une variable (ici "c1"). Pourquoi pas directement dans le buffer ?
- On enregistre notre variable dans le tableau-buffer, en prenant soin de la placée suivant un index dans notre tableau-buffer pour les rangées dans l'ordre.
- on incrémente l'index pour passer a la data suivante
- Et on continu, continu , continu
- jusqu’à arriver à 20 ou sur un caractère particulier ( ici "K") bon faut pas qu'il y ai de "K" dans notre mot
- On remet l'index de notre tableau-buffer à 0 pour la trame suivante
- On met lève un drapeau, pour signifier qu'un mot est arrivé correctement !
- Option: on réarme pas l'INT si on pas traiter le mot dans le buffer.
- Après réception du la lettre "K" ou 20 caractères ( à définir), on traite notre drapeau de retour au programme principale. affichage du mot ou traitement.
communication PC-PIC par USB-UART
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Jérémy a écrit :Source du message Pourquoi pas directement dans le buffer ?
Car en lisant le registre on efface le buffer, donc on ne peut plus utiliser ce registre . La première chose à faire dans ce cas de figure , sera toujours d’enregistrer notre registre, à mon avis.
Rohhhh ca ne fonctionne pas .
Encore une maudite coquille c'est pas vrai ! je vais chercher avec le debugger , mais je sais pas m'en servir , enfin faudra bien que je m'y mette quiand les programmes vont devenir plus complexes .
En attendant voici mon programme .
Je n'ai que la premiere lettre d'un mot envoyé qui s'affiche .
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 "18-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 ------------------------------------------
int Rx_buffer[16] ;
int Registre, index=0, Flag_Data_OK=0, i;
// Fin des varaibles---------------------------------------------------------------
// Prototypes --------------------------------------------------------------------
// FIN Prototypes
// Début Interruption---------------------------------------------------------------
void interrupt (){
if ((PIR1.RC1IF==1) && (RC1IE_bit)) // On check le FLAG de l'INT et si elle est autorisée
{
Registre=RCREG1; // On lit et enregistre le registre UART qui a donné lieu à l'INT
Rx_buffer[index]=Registre; // On enregistre le registre dans le buffer
index++; // On incremente l'index pour la recept suivante
if ((Registre=='K') || (index >=16)) // Si on recoit la lettre "K" ou depasse la taille du buffer
{
Rx_buffer[index]=0; // On place un 0 pour indiqué la fin d'un string
Index=0; // On RAZ notre index
Flag_Data_OK=1; // On lève le flag, pou indiqué que le mot est complet
}
}
}
// 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(300); // 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 ((BP==1) && (UART1_Tx_Idle() == 1)) // Check le BP et le buffer
{
UART1_Write_Text("Hello World !"); // Envoie du texte
UART1_Write(10); // Envoie un CL
UART1_Write(13); // envoie un CR
while (BP==1); // Anti rebond
}
if (Flag_data_OK==1) // Si la drapeau de fin de trame, on affiche le mot stocker dans le buffer
{
Lcd_out (1, 1, "Rx_buffer=" );
Lcd_out (2, 1, Rx_buffer ); // On l'affiche
Flag_data_OK=0; // On RAZ le flag
}
}
}
//##################################################################################
//######################### PROGRAMME SECONDAIRE #########################
//##################################################################################
communication PC-PIC par USB-UART
communication PC-PIC par USB-UART
communication PC-PIC par USB-UART
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
probleme sur le test :
test plutot
Comment fais-tu ce test ... en bouclant 2 et 3 (TX et RX) DB9 ?
PAS BIEN !
Un vrai test , c'est en envoyant "Hello Worrld!" (ou n'importe quoi ! ) depuis un clavier (pas par le PIC sur lui meme)
il est alors correctement recu via l'interrupt et le rangement dans le buffer
et affiché sur le LCD.
Ou alors avec 2 montages identhiques ?
le 1er PIC envoye Hello World au 2em PIC
Qui le recoit et le renvoit au 1er PIC
probleme sur le test :
Code : Tout sélectionner
Registre=='K'
test plutot
Code : Tout sélectionner
if ( ( Registre==13) || ( Registre==10) || (index>=16))
Comment fais-tu ce test ... en bouclant 2 et 3 (TX et RX) DB9 ?
PAS BIEN !
Un vrai test , c'est en envoyant "Hello Worrld!" (ou n'importe quoi ! ) depuis un clavier (pas par le PIC sur lui meme)
il est alors correctement recu via l'interrupt et le rangement dans le buffer
et affiché sur le LCD.
Ou alors avec 2 montages identhiques ?
le 1er PIC envoye Hello World au 2em PIC
Qui le recoit et le renvoit au 1er PIC
communication PC-PIC par USB-UART
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Hello world, euhhh pardon Paul,
Je perd la tête car j'y suis depuis ce matin. et le fonctionnement est ératique et non prévisible .
Pour le hard, non j'ai connecté la carte EasypicV7 par un cordon USB d'un coté ( qui va sur le PC) et en embout carré style "imprimante" qui va sur ma carte .
schéma en page 17
En fait je galère je pense avec le registre et le buffer . je confonds un peu tout , en plus l'affichage sur LCD me facilite pas la tache .
En émission je n'ai aucun problème .
Pour la réception , j'utilise le logiciel de MikroC USART terminal dans tool .
J'ait un doute sur la fiabilité du logiciel qui plante régulièrement quand j’éteins ma carte .
Je perd la tête car j'y suis depuis ce matin. et le fonctionnement est ératique et non prévisible .
Pour le hard, non j'ai connecté la carte EasypicV7 par un cordon USB d'un coté ( qui va sur le PC) et en embout carré style "imprimante" qui va sur ma carte .
schéma en page 17
En fait je galère je pense avec le registre et le buffer . je confonds un peu tout , en plus l'affichage sur LCD me facilite pas la tache .
En émission je n'ai aucun problème .
Pour la réception , j'utilise le logiciel de MikroC USART terminal dans tool .
J'ait un doute sur la fiabilité du logiciel qui plante régulièrement quand j’éteins ma carte .
communication PC-PIC par USB-UART
communication PC-PIC par USB-UART
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
ok pou le 300 bauds . je mettais dis qu'ainsi y'aurait aucun loupé .
en fait je vois ce qui se passe sans le comprendre lol .
Je pense que mon code se bloque . car tout se passe bien , jusque je provoque volontairement du nombre de index . ca s’affiche bien, mais après je n'arrive plus à recevoir .
J'ai fais beaucoup de modifs aujourd'hui pour essayer de comprendre ...... mais avec les enfants dans les pattes, c'est un peu galère .Je vais bosser dur ce soir et cette nuit pour avancer un peu quand il seront au dodo et madame devant la télé .....
Le post en #22 tu l'as tésté ?
Si oui cela viendrais donc du logiciel ou dune combinaison de redemarrag/reset ..
en fait je vois ce qui se passe sans le comprendre lol .
Je pense que mon code se bloque . car tout se passe bien , jusque je provoque volontairement du nombre de index . ca s’affiche bien, mais après je n'arrive plus à recevoir .
J'ai fais beaucoup de modifs aujourd'hui pour essayer de comprendre ...... mais avec les enfants dans les pattes, c'est un peu galère .Je vais bosser dur ce soir et cette nuit pour avancer un peu quand il seront au dodo et madame devant la télé .....
j'ai testé à 2400 bauds .. 19200 bds .. OK
Le post en #22 tu l'as tésté ?
Si oui cela viendrais donc du logiciel ou dune combinaison de redemarrag/reset ..
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 45 invités