Je rencontre un probléme qui me tape sur le système. Avant de tout modifier ( surtout el PIC) je lance cette bouteille à la mer.
Pour faire ma télécommande de robot , je dois utiliser deux platines. C'est deux platines communiquent entre elles par UART.
L'une d'elle "la platine radio" doit aussi communiquer par UART avec le module radio. J'ai donc besoin d'utiliser les deux UART sur ce PIC.
Le PPS c'est bien beau et pratique pour le faire le typon, mais si ca complique la chose et ca c'est chiant.
Voila 3 jours que je tourne en rond et impossible d'avoir le comportement que je souhaite avec ces maudits UART.
J'exclue les problèmes HARD, car ça fonctionne très bien quand j’enlève un UART, ou que j'utilise mon câble USB/RS232.
Le but est de pouvoir émettre et recevoir sur les deux UART de ce PIC. Mon plus gros problème se trouve dans la reception et non à l’émission.
Je sais par exemple qu'il faut activé l'UART avec lequel on veut travailler ! pas pratique du coup ça, pour surveiller une reception sur les deux UART en même temps ! mais bon soite.
J'ai essayé différentes méthode pour faire le réglage PPS .
Voici un programme simplifié :
Code : Tout sélectionner
// PROGRAMME pour la télécommande-radio du robot
// DS du PIC 18F47K740 : http://ww1.microchip.com/downloads/en/DeviceDoc/40001844D.pdf
/*
Fosc = 64Mhz
UART1 = 9600 bauds
UART2 = 9600 bauds
*/
#define LED_R LATC.B2 // Sortie led rouge
#define LED_V LATC.B1 // Sortie led verte
//################################## Variables ##############################################
unsigned char i,Cpt_Point_milieu=0 ;
//----- UART
unsigned char Reception_UART1, Reception_UART2, Valeur, Valeur2,Reseau ;
unsigned char Commande_Mode_OK, Parametre_OK, RESET_OK, F_Message_OK, F_Test;
unsigned char Index_Buff1, Long_Buff1;
unsigned int XOR;
char Buffer_UART1[50];
//##############################################################################
//------------------------ INTERRUPTION -----------------------------
void interrupt(){
//----------------------- UART 1 -----------------------------
if((RC1IF_bit==1) && (RC1IE_bit==1)) {
Reception_UART1 = UART1_Remappable_Read(); // On récupere la donnée
}
//----------------------- UART 2 -----------------------------
if((RC2IF_bit==1) && (RC2IE_bit==1)) {
Reception_UART2 = UART2_Read(); // On récupere et stock la donnée
//Reception_UART2 = UART2_Remappable_Read();
LED_R = ~LED_R;
switch (Valeur2){
case 0: if (Reception_UART2 == 0x02) Valeur2 = 1;
else Valeur2 = 0;
break;
case 1: if (Reception_UART2 == 0x99) Valeur2 = 2;
else Valeur2 = 0;
break;
case 2: if (Reception_UART2 == 0xFF)
LED_V = ~LED_V;
Valeur2 = 0;
break;
}
}
}
//#################################################################################################
//######################################### MAIN ########################################
//#################################################################################################
void main() {
// Disable comparator
CM1CON0 = 0;
CM2CON0 = 0;
// registre des LATx à 0
LATA = LATB = LATC = LATD = LATE = 0;
// registre analogiques
ANSELA = 0b10000000; // RA7 en analogique
ANSELB = 0; // Tout en numérique
ANSELC = 0b00000001; // RC0 en analogique
ANSELD = 0b10100000; // RD5 et RD7 en analogique
ANSELE = 0; // Tout en numérique
// registres des I/O
TRISA = 0b11101111; // RA4 en sortie pour liaison
TRISB = 0b11011111; // RB5 en sortie Pour UART-TX2
TRISC = 0b10100001; // En sortie RC1 et RC2 pour led test, RC3 et RC4 pour liaison AMB et RC6 pour Tx1
TRISD = 0b11111000; // En sortie RC0, RC1 et RC2 pour liaison AMB
TRISE = 0b11111111; // Tout en entrée
// Registre des Pull-UP
WPUA = 0x0F; // RA0, RA1, RA2 et RA3 en Pull UP
WPUB = 0x0F; // RB0, RB1, RB2 et RB3 en Pull UP
WPUC = 0 ;
WPUD = 0;
WPUE = 0x01; // RE0 en pull up pour BP
// ----------------- Initialisation de la lecture analogique/numérique ----------------------------------
ADC_Init();
delay_ms(10);
ADFM_bit = 0; // Justification à gauche. ainsi je transforme la lecture sur 10 bits en 8 bits et j'ignore les petits chiffres
TRISD.B5 = TRISD.B7 = TRISA.B7 = TRISC.B0 = 1; // met RA7, RC0,RD5 et RD7 en entrée
ADPCH = 0b011101; // Lecture de RD5 par défaut
//******************************************************************************************************
//******************************************************************************************************
//******************************************************************************************************
//--------------------------- PPS --------------------------------------------------
// Séquence de déverouillage des PPS page 218 de la DS
INTCON.GIE = 0; // On désactive les INT
Unlock_IOLOCK(); // On deverouille les PPS
RB5PPS = 0x0B; // RB5->EUSART2:TX2 = 0x0B;
RX2PPS = 0x0F; // RB7->EUSART2:RX2 = 0x0F;
RX1PPS = 0x17 ; // RC7->EUSART1:RX1;
RC6PPS = 0x09; // RC6->EUSART1:TX1;
Lock_IOLOCK(); // On verouille les PPS
//----- UART1
UART1_Remappable_Init(9600);
delay_ms(100);
RC1IF_bit = 0; // RAZ flag
RC1IE_bit = 1; // Active les Interruptions sur Rx UART 1
//UART_Set_Active(&UART1_Remappable_Read, &UART1_Remappable_Write, &UART1_Remappable_Data_Ready, &UART1_Remappable_Tx_Idle);
//----- UART2
UART2_Init(9600);
//UART2_Remappable_Init(9600);
delay_ms(100);
RC2IF_bit = 0; // RAZ flag
RC2IE_bit = 1; // Active les Interruptions sur Rx UART 2
//UART_Set_Active(&UART2_Remappable_Read, &UART2_Remappable_Write, &UART2_Remappable_Data_Ready, &UART2_Remappable_Tx_Idle);
//------------------------------ INTERRUPTION -------------------------------------
//----- GLOBAL
INTCON.PEIE = 1 ; // On active les INT périphériques
INTCON.GIE = 1 ; // On active toutes les INT
// séquence de clignotement au demarrage (3 fois)
for (i=0;i<=5;i++){
LED_R = ~LED_R ;
delay_ms(100);
}
//#################################################################################################
//############################### BOUCLE PRINCIPALE #####################################
//#################################################################################################
while(1){
/*
delay_ms(2000);
UART_Set_Active(&UART2_Remappable_Read, &UART2_Remappable_Write, &UART2_Remappable_Data_Ready, &UART2_Remappable_Tx_Idle);
delay_ms(2000);
UART_Set_Active(&UART1_Remappable_Read, &UART1_Remappable_Write, &UART1_Remappable_Data_Ready, &UART1_Remappable_Tx_Idle);
*/
}
}
Dans ce programme j'ai tout essayé en terme de switch d'uART .
L'uart 1 est branché sur RC6 et RC7, ce qui est les broches par défaut de cet UART, donc techniquement je n'ai pas besoin de le remapper . avec un simple UART1_Init();, ce devrait le faire.
L'UART2 lui est remapper donc il faut que j'affecte les PIN. mais ça ne fonctionne pas .
J'ai essaye de remapper les deux, aucun , juste un puis juste l'autre etc ..... rien n'y fait .
J’ai active un UART puis l'autre puis aucun ... rien.
Avez-vous des infos sur comment bien initialiser le PPS et les UART en particulier ?
Si je ne remappe pas l'UART1 suis je opbligé d'activer l'UART21 pour l'utiliser ?
Mon probléme n'est pas facile a comprendre j'en suis conscient ! mais la moindre info sur le remappage des broches pourraient mettre utile .
Concrètement voila ce que je remarque. Je fais clignoter le led rouge quand je reçois un Caractère dans l'UART2 , si je reçois 3 bon caractères j'allume la led verte.
Ma led rouge clignote bien mais ne passe jamais au vert ! donc les caractères reçus ne sont pas bon je pense .
Les deux platine fonctionnement en 9600 bauds, et l'alimentation et les masses sont communes ainsi que les niveaux.
MA platine écran envoie toutes les 500ms via son UART1 les caractères ( 0x02 0x99 0xFF) . cet envoie est vérifie par le cordon sur le PC aucun probléme la dessus.
JE ne sais plus quoi faire a part changer de PIC, pour retourner sur un PIC18F46K22 qui a deux UART hard....
Merci de m'avoir lu !