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
2xUART en mode PPS ?
-
Jérémy
Administrateur du site- Messages : 2727
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
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é :
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 !
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 !
2xUART en mode PPS ?
Bonjour Jérémy
Toujours ce problème avec MikroC et les uarts sur pps.
Je comprends pas pourquoi ils ont ajouté des fonctions uart spécifiques aux pps.
Les modules uart du pic se manipulent de la même façon, avec pps ou sans.
Conserve ta config pps, et utilise ces fonctions à la place des fonctions MikroC.
Avec ça il n'est plus nécessaire de faire des UART_Set_Active()
L'init est valable si FOSC = 64MHz
Toujours ce problème avec MikroC et les uarts sur pps.
Je comprends pas pourquoi ils ont ajouté des fonctions uart spécifiques aux pps.
Les modules uart du pic se manipulent de la même façon, avec pps ou sans.
Conserve ta config pps, et utilise ces fonctions à la place des fonctions MikroC.
Avec ça il n'est plus nécessaire de faire des UART_Set_Active()
L'init est valable si FOSC = 64MHz
Code : Tout sélectionner
void Uart1_Init(unsigned long baudrate)
{
BAUD1CON = 0x08; // uart, brg16=1
SP1BRG = 64000000/4/baudrate-1; // uart, speed
TX1STA = 0x24; // uart, tx on, brgh=1
RC1STA = 0x90; // uart on, rx on
}
void Uart2_Init(unsigned long baudrate)
{
BAUD2CON = 0x08; // uart, brg16=1
SP2BRG = 64000000/4/baudrate-1; // uart, speed
TX2STA = 0x24; // uart, tx on, brgh=1
RC2STA = 0x90; // uart on, rx on
}
char Uart1_Read(void)
{
return RC1REG;
}
char Uart2_Read(void)
{
return RC2REG;
}
void Uart1_Write(char c)
{
while (!PIR3bits.TX1IF) ;
TX1REG = c;
}
void Uart2_Write(char c)
{
while (!PIR3bits.TX2IF) ;
TX2REG = c;
}
2xUART en mode PPS ?
-
Jérémy
Administrateur du site- Messages : 2727
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonsoir Satinas ,
Merci 'avoir lu mon code.
J4ai mis ton code en lieu et place de celui de mikroC, mais rien ne fonctionne ! Je n’arrive même pas a faire fonctionner l'UART1 classique !
J'ai seulement remplacer le mot PIR3bits.TX1IF que ne comprends pas mon compilateur par TX1IF_bit qui est la même chose.
PS : je suis bien en 64Mhz
Merci 'avoir lu mon code.
J4ai mis ton code en lieu et place de celui de mikroC, mais rien ne fonctionne ! Je n’arrive même pas a faire fonctionner l'UART1 classique !
J'ai seulement remplacer le mot PIR3bits.TX1IF que ne comprends pas mon compilateur par TX1IF_bit qui est la même chose.
PS : je suis bien en 64Mhz
2xUART en mode PPS ?
Bonjour,
Connecte ton PC sur C6/C7 et vérifie ce premier programme. Si on appuie sur une touche, le pic renvoie la lettre suivante.
Ensuite essaie avec 2 ports série C6/C7 et B5/B7.
Si ça marche, tu peux passer aux interruptions.
Les bit RC1IF_bit et RC2IF_bit sont modifiés uniquement par le pic, pas la peine de les remettre à zéro dans le soft.
B7 sert pour la programmation, pourquoi l'utilises-tu ?
Connecte ton PC sur C6/C7 et vérifie ce premier programme. Si on appuie sur une touche, le pic renvoie la lettre suivante.
Code : Tout sélectionner
void main(void) // uart1 only
{
OSCCON1 = 0x60; OSCFRQ = 0x08; // FOSC = 64MHz
ANSELC = 0x00; // pins numériques
PPSLOCK = 0x55; // unlock PPS
PPSLOCK = 0xAA;
PPSLOCKED_bit = 0;
RC6PPS = 0x09; // TX1 -> RC6
RX1PPS = 0x17; // RX1 <- RC7
PPSLOCK = 0x55; // lock PPS
PPSLOCK = 0xAA;
PPSLOCKED_bit = 1;
Uart1_Init(9600); delay_ms(10);
while (1) {
if (RC1IF_bit) Uart1_Write(Uart1_Read()+1);
}
}
Ensuite essaie avec 2 ports série C6/C7 et B5/B7.
Code : Tout sélectionner
void main(void) // uart1 et uart2
{
OSCCON1 = 0x60; OSCFRQ = 0x08; // FOSC = 64MHz
ANSELB = ANSELC = 0x00; // pins numériques
PPSLOCK = 0x55; // unlock PPS
PPSLOCK = 0xAA;
PPSLOCKED_bit = 0;
RC6PPS = 0x09; // TX1 -> RC6
RX1PPS = 0x17; // RX1 <- RC7
RB5PPS = 0x0B; // TX2 -> RB5
RX2PPS = 0x0F; // RX2 <- RB7
PPSLOCK = 0x55; // lock PPS
PPSLOCK = 0xAA;
PPSLOCKED_bit = 1;
Uart1_Init(9600);
Uart2_Init(9600); delay_ms(10);
while (1) {
if (RC1IF_bit) Uart1_Write(Uart1_Read()+1);
if (RC2IF_bit) Uart2_Write(Uart2_Read()+2);
}
}
Si ça marche, tu peux passer aux interruptions.
Les bit RC1IF_bit et RC2IF_bit sont modifiés uniquement par le pic, pas la peine de les remettre à zéro dans le soft.
B7 sert pour la programmation, pourquoi l'utilises-tu ?
2xUART en mode PPS ?
2xUART en mode PPS ?
-
Jérémy
Administrateur du site- Messages : 2727
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Étant toujours sur la brèche j'ai pu testé ton code.
Malheureusement il ne fonctionne pas ! ou plutôt je n'arrive pas à le faire fonctionner.
Voila ou j'en suis ! Je penche pour un problème d'initialisation, le seul point ou je ne comprends pas tout . Surtout le Baud rate generator !
J'ai essayé également de faire un envoi tout simple de un caractère , et le résultat n'est pas bon non plus. Il me renvoie des 0xFF ou 0xEF des trucs du genre qui non rien a voir !
JE ne sais plus ou je cru lire que se PIC avait un buffer de deux bytes en réception ? l'erreur ne viendrais pas d’ici , je vais me replonger dans la DS
Malheureusement il ne fonctionne pas ! ou plutôt je n'arrive pas à le faire fonctionner.
Voila ou j'en suis ! Je penche pour un problème d'initialisation, le seul point ou je ne comprends pas tout . Surtout le Baud rate generator !
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
*/
#define LED_R LATC.B2 // Sortie led rouge
#define LED_V LATC.B1 // Sortie led verte
#define BP PORTE.B0 // Entree pour BP
//################################## Variables ##############################################
unsigned char i;
//----- UART
unsigned char Reception_UART1, Reception_UART2 ;
unsigned char F_Test;
//################################## PROTOTYPE ##############################################
void Uart1_Init(unsigned long);
char Uart1_Read(void);
void Uart1_Write(char);
//##############################################################################
//------------------------ INTERRUPTION -----------------------------
void interrupt(){
/*
//----------------------- UART 1 -----------------------------
if((RC1IF_bit==1) && (RC1IE_bit==1)) {
Reception_UART1 = Uart1_Read(); // On récupere la donnée
Uart1_Write( Reception_UART1);
LED_R = ~LED_R;
}
*/
}
//#################################################################################################
//######################################### MAIN ########################################
//#################################################################################################
void main() {
// Disable comparator
CM1CON0 = 0;
CM2CON0 = 0;
LATB.B1 = LATB.B2 = 0;
TRISC.B1 = TRISC.B2 = 0; // Sortie pour led verte et rouge
ANSELC = 0b00000000;
LED_R = LED_V = 0;
//******************************************************************************************************
//******************************************************************************************************
//******************************************************************************************************
PPSLOCK = 0x55; // unlock PPS
PPSLOCK = 0xAA;
PPSLOCKED_bit = 0;
RC6PPS = 0x09; // TX1 -> RC6
RX1PPS = 0x17; // RX1 <- RC7
PPSLOCK = 0x55; // lock PPS
PPSLOCK = 0xAA;
PPSLOCKED_bit = 1;
Uart1_Init(9600);
delay_ms(10);
//------------------------------ INTERRUPTION -------------------------------------
/*
RC1IE_bit = 1 ;
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){
if (RC1IF_bit) Uart1_Write(Uart1_Read()+1);
}
}
//#################################################################################################
//############################### PROGRAMME SECONDAIRE ###################################
//#################################################################################################
void Uart1_Init(unsigned long baudrate)
{
BAUD1CON = 0x08; // uart, brg16=1
SP1BRG = 64000000/4/baudrate-1; // uart, speed
TX1STA = 0x24; // uart, tx on, brgh=1
RC1STA = 0x90; // uart on, rx on
}
char Uart1_Read(void)
{
return RC1REG;
}
void Uart1_Write(char c)
{
while (!TX1IF_bit) ;
TX1REG = c;
}
J'ai essayé également de faire un envoi tout simple de un caractère , et le résultat n'est pas bon non plus. Il me renvoie des 0xFF ou 0xEF des trucs du genre qui non rien a voir !
JE ne sais plus ou je cru lire que se PIC avait un buffer de deux bytes en réception ? l'erreur ne viendrais pas d’ici , je vais me replonger dans la DS
2xUART en mode PPS ?
2xUART en mode PPS ?
-
Jérémy
Administrateur du site- Messages : 2727
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
J'ai enfin trouvé la coquille ! Cela aura le mérite de m'avoir fait bosser a fond la DS et la compréhension du fonctionnement de l'UART !
Il y a une coquille dans ton calcul de baud rate !
En effet avec un compteur de 16 bit ( BRG16 à 1) , BRGH à 1 et SYNC à 0 , la formule du SP1BRG est :
(Fosc / (4 x Baudrate) ) -1 = ( 64000000 / (4 x 9600)) - 1~= 1666
En initialisant avec :
Ça fonctionne enfin !
Pour la partie émission du moins ! Je continue à avancer grâce à ton aide précieuse. Par contre c'est bizarre que ça fonctionne bien chez toi
Il y a une coquille dans ton calcul de baud rate !
En effet avec un compteur de 16 bit ( BRG16 à 1) , BRGH à 1 et SYNC à 0 , la formule du SP1BRG est :
(Fosc / (4 x Baudrate) ) -1 = ( 64000000 / (4 x 9600)) - 1~= 1666
En initialisant avec :
Code : Tout sélectionner
void Uart1_Init(unsigned long baudrate)
{
BAUD1CON = 0b00001000; // ABDOVF=0; RCIDL=0; bit5=vide; SCKP=0; BRG16=1; bit2=vide; WUE=0; ABDEN=0
SP1BRG = 1666; // SP1BRG = SPBRGH + SPBRGL = (Fosc/(4*Baudrate))-1
TX1STA = 0b00100100; // CSRC=0; TX9=0; TXEN=1; SYNC=0; SENDB=0; BRGH=1; TRMT=0; TX9D=0
RC1STA = 0b10010000; // SPEN=1; RX9=0; SREN=0; CREN=1; ADDEN=0; FERR=0; OERR=0; RX9D=0
}
Ça fonctionne enfin !
Pour la partie émission du moins ! Je continue à avancer grâce à ton aide précieuse. Par contre c'est bizarre que ça fonctionne bien chez toi
2xUART en mode PPS ?
2xUART en mode PPS ?
-
Jérémy
Administrateur du site- Messages : 2727
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Code : Tout sélectionner
64000000/4/9600 - 1 cela donne 1665
Lol tu as raison ! je n'avais pas fait ton calcul à la calculatrice !
J'ai donc trouvé l'erreur , on se rapproche !
C'est le passage d'argument qui foire.
Pour bien faire au lieu d'ecrire
Code : Tout sélectionner
void Uart1_Init(unsigned long baudrate)
{
BAUD1CON = 0b00001000; // ABDOVF=0; RCIDL=0; bit5=vide; SCKP=0; BRG16=1; bit2=vide; WUE=0; ABDEN=0
SP1BRG =1666 ; // SP1BRG = SPBRGH + SPBRGL = (Fosc/(4*Baudrate))-1
TX1STA = 0b00100100; // CSRC=0; TX9=0; TXEN=1; SYNC=0; SENDB=0; BRGH=1; TRMT=0; TX9D=0
RC1STA = 0b10010000; // SPEN=1; RX9=0; SREN=0; CREN=1; ADDEN=0; FERR=0; OERR=0; RX9D=0
}
J'ai écris avec la formule au cas ou je désire changer le baudrate :
Code : Tout sélectionner
void Uart1_Init(unsigned long baudrate)
{
BAUD1CON = 0b00001000; // ABDOVF=0; RCIDL=0; bit5=vide; SCKP=0; BRG16=1; bit2=vide; WUE=0; ABDEN=0
SP1BRG = (64000000/(4*baudrate))-1; // SP1BRG = SPBRGH + SPBRGL = (Fosc/(4*Baudrate))-1
TX1STA = 0b00100100; // CSRC=0; TX9=0; TXEN=1; SYNC=0; SENDB=0; BRGH=1; TRMT=0; TX9D=0
RC1STA = 0b10010000; // SPEN=1; RX9=0; SREN=0; CREN=1; ADDEN=0; FERR=0; OERR=0; RX9D=0
}
et la ça coince, je ne reçois plus rien !
Il doit y avoir un erreur de cast non ? car SP1BRG est un word alors qu'on fait des calculs avec des longs ? comme faire un cast dans ce cas de figure ?
Qui est en ligne
Utilisateurs parcourant ce forum : Google [Bot] et 117 invités