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
Calculez un checksum avec un tableau de char ?
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
re,
Je pense que j'ai pas la passion des PIC mais pas le DON, mais alors vraiment pas le don ! tant pis ce sera pour une autre vie
J'essaye d'être le plus précis possible à chaque fois , mais c'est pas évident , car je fais tellement de test ! dur dur de tout dire par écrit.
Sans vouloir vous contredire, ma méthode fonctionne très bien.
Quand les données sont les bonnes ça fonctionne parfaitement. Pour le XOR c'est la notice qui le dit :
J'arrive le configurer tout et tout ......
Mais j'essaye de simuler les envois de plusieurs données maintenant , et notamment les valeurs ADC que j'essaye de récupérer étant donné que la aussi je galère .
Bref je galère de partout et du coup rien ne va !
Je pense que j'ai pas la passion des PIC mais pas le DON, mais alors vraiment pas le don ! tant pis ce sera pour une autre vie
J'essaye d'être le plus précis possible à chaque fois , mais c'est pas évident , car je fais tellement de test ! dur dur de tout dire par écrit.
Sans vouloir vous contredire, ma méthode fonctionne très bien.
Quand les données sont les bonnes ça fonctionne parfaitement. Pour le XOR c'est la notice qui le dit :
J'arrive le configurer tout et tout ......
Mais j'essaye de simuler les envois de plusieurs données maintenant , et notamment les valeurs ADC que j'essaye de récupérer étant donné que la aussi je galère .
Bref je galère de partout et du coup rien ne va !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Calculez un checksum avec un tableau de char ?
Calculez un checksum avec un tableau de char ?
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Ben oui mais j'ai fais ca !!!
Les 2 ADC fonctionnement très bien .
Je récupère mes deux valeurs nickel . Je les envoi en uart par mon cordon ( non relié au module radio pour le moment ), et je les visualise très bien sur l"ordi.
Les valeurs sont parfaites.
J'arrive aussi a envoyer des valeurs par voie radio nickel !!
Bon bref !!!!
Les 2 ADC fonctionnement très bien .
Je récupère mes deux valeurs nickel . Je les envoi en uart par mon cordon ( non relié au module radio pour le moment ), et je les visualise très bien sur l"ordi.
Les valeurs sont parfaites.
J'arrive aussi a envoyer des valeurs par voie radio nickel !!
Bon bref !!!!
Calculez un checksum avec un tableau de char ?
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Jérémy a écrit :..
Sans vouloir vous contredire, ma méthode fonctionne très bien.
Tu as raison
Code : Tout sélectionner
UART1_Remappable_Write(0x02^0x00^0x02^Joystick_G_DG^Joystick_G_HB); //CS
j'ai testé dans les 2 cas, avec un tableau ou en direct ..fonctionne aussi ..
Je ne pensais pas que le compilateur puisse s'en debrouiller, vu que dans certains cas, il faut decouper sa
fonction ou calculs en sous elements avec parentheses.
Meme si on a pas le resultat intermediaire du CS dans une variable , on peut effectivement le visualiser
au format hexadecimal sur un terminal.
comme quoi, on en apprend tous les jours .. et c'est pas fini!
Calculez un checksum avec un tableau de char ?
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
l'énervement est redescendu !
Mon problème réglè mais sans comprendre exactement le pourquoi du comment. Il faut rajouter une temporisation après avoir lu ADRESH ! allez savoir pourquoi
Voila un programme qui fonctionne parfaitement, avec 4 lectures analogiques:
J'ai voulus continuer à faire mon programme principal, mais c'est pas évident sans avoir tout les éléments. Je vais donc avancer doucement. Maintenant je sais envoyer la valeur de mes potars par voie radio, je peux donc contrôler mon robot à distance.
Alors je vais essayer de le faire avancer et tourner. Il y a déjà pas mal de travail rien que la , car c'est pas si simple que ça . Il s'agit d'un robot à 6 roues. il n'y à pas de direction , il se pilote comme un char d'assaut , on avance d'un cote ou de l'autre pour tourner et les deux en même temps pour aller tout droit.
https://www.gotronic.fr/art-chassis-wil ... -12400.htm
l'énervement est redescendu !
Mon problème réglè mais sans comprendre exactement le pourquoi du comment. Il faut rajouter une temporisation après avoir lu ADRESH ! allez savoir pourquoi
Voila un programme qui fonctionne parfaitement, avec 4 lectures analogiques:
Code : Tout sélectionner
// PROGRAMME pour la télécommande-radio du robot
// DS du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/40001844D.pdf
/*
Fosc = 64Mhz
UART1 = 57600 bauds
UART2 = 57600 bauds
*/
#define RESET LATC.B3 // Sortie
#define CONFIG LATD.B0 // Sortie
#define CTS LATC.B4 // Sortie
#define RTS PORTC.B5 // Entrée
#define DATA_REQ LATD.B2 // Sortie
#define DATA_IND PORTD.B3 // Entrée
#define TRX_DIS LATD.B1 // Sortie
#define LED_R LATC.B2 // Sortie led rouge
#define LED_V LATC.B1 // Sortie led verte
#define BP PORTE.B0 // Entree pour BP
#define ADC_RD5 0b00011101 // Defini le ADPCH = RD5
#define ADC_RD7 0b00011111 // Defini le ADPCH = RD7
#define ADC_RC0 0b00010000 // Defini le ADPCH = RC0
#define ADC_RA7 0b0000111 // Defini le ADPCH = RA7
//################################## Variables ##############################################
char i ;
char Joystick_D_HB, Joystick_D_DG, Joystick_G_HB, Joystick_G_DG;
char Test;
//--- UART
char Reception_UART1, Reception_UART2, Index_Buff1, Index_Buff2, Buffer1_plein, Buffer2_plein;
char Valeur, Commande_Mode_OK, Parametre_OK, RESET_OK, TEST_OK;
Buffer_UART1[30] ;
Buffer_UART2[30] ;
//################################## PROTOTYPE ##############################################
void Lecture_Potar();
void Envoi_Potar_TOR();
//##############################################################################
//------------------------ INTERRUPTION -----------------------------
void interrupt(){
//----------------------- UART 1 -----------------------------
if((RC1IF_bit==1) && (RC1IE_bit==1)) {
Reception_UART1 = UART1_Read(); // On récupere et stock la donnée
switch (Valeur){
case 0: if (Reception_UART1 == 0x02){ // reception du Start signal
Valeur = 1 ;
}
else
Valeur = 0;
break;
// Numéro de la commande recue
case 1: if (Reception_UART1 == 0x49) // Parametre OK
Valeur = 2;
else if (Reception_UART1 == 0x81) // Reception d'un message
Valeur = 10;
else if (Reception_UART1 == 0x44) // Command_MODE OK
Valeur = 20;
else if (Reception_UART1 == 0x40) // ACK_OK ou NON_ACK
Valeur = 30;
else if (Reception_UART1 == 0x99){ // TEST_OK
TEST_OK = 1 ;
Valeur = 0;
}
else
Valeur = 0;
break;
case 2: if (Reception_UART1 == 0x01) // Nombre bytes
Valeur = 3;
else
Valeur = 0;
break;
case 3: if (Reception_UART1 == 0x00) //data
Valeur = 4;
else
Valeur = 0;
break;
case 4: if (Reception_UART1 == 0x4A){ // checksum 0x02 0x49 0x01 0x00 0x4A
Parametre_OK = 1; // Je léve le FLAG
}
Valeur = 0;
break;
case 20: if (Reception_UART1 == 0x01) // Command_MODE OK
Valeur = 21;
else
Valeur = 0;
break;
case 21: if (Reception_UART1 == 0x10) // Command_MODE OK
Valeur = 22;
else
Valeur = 0;
break;
case 22: if (Reception_UART1 == 0x57){ //Command_MODE OK : 0x02 0x44 0x01 0x10 0x57
Commande_Mode_OK = 1;
}
Valeur = 0;
break;
default: Valeur = 0;
}
}
//----------------------- UART 2 -----------------------------
if((RC2IF_bit==1) && (RC2IE_bit==1)) {
Reception_UART2 = UART2_Read(); // On récupere et stock la donnée
if (Reception_UART2 == 13){ // Verifie fin de message(Carriage Return) ou Buffer plein
Index_Buff2 = 0;
}
else{
Buffer_UART2[Index_Buff2] = Reception_UART2;
Index_Buff2++;
}
}
}
#include "Initialisation_AMB8626.h"
//#################################################################################################
//######################################### MAIN ########################################
//#################################################################################################
void main() {
// RAZ des broches
LATA = LATB = LATC = LATD = LATE = 0;
// registres des I/O
TRISA = 0xEF; // RA4 en sortie pour liaison
TRISB = 0xDF; // RB5 en sortie Pour UART-TX2
TRISC = 0xA1; // En sortie RC1 et RC2 pour led test, RC3 et RC4 pour liaison AMB et RC6 pour Tx1
TRISD = 0xF8; // En sortie RC0, RC1 et RC2 pour liaison AMB
TRISE = 0xFF; // Tout en entrée
// registre analogiques
ANSELA = 0x80; // RA7 en analogique
ANSELC = 0x01; // RC0 en analogique
ANSELD = 0xA0; // RD5 et RD7 en analogique
ANSELB=ANSELE = 0x00;
// Registre des Pull-UP
WPUA = 0x0F; // RA0, RA1, RA2 et RA3 en Pull UP
WPUB = 0x0F; // RB0, RB1, RB2 et RB3 en Pull UP
WPUE = 0x01; // RE0 en pull up pour BP
WPUC = WPUD = 0x00;
//--------------------------- 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
RX1PPS = 0x17 ; // RC7->EUSART1:RX1;
RC6PPS = 0x09; // RC6->EUSART1:TX1;
RX2PPS = 0x0F; // RB7->EUSART2:RX2;
RB5PPS = 0x0B; // RB5->EUSART2:TX2;
Lock_IOLOCK(); // On verouille les PPS
// ----------------- Initialisation UART ----------------------------------
//----- UART2
UART2_Remappable_Init(57600);
RC2IE_bit = 1; // Active les Interruptions sur Rx UART 2
RC2IF_bit = 0; // RAZ flag
//----- UART1
UART1_Remappable_Init(57600);
RC1IE_bit = 1; // Active les Interruptions sur Rx UART 2
RC1IF_bit = 0; // RAZ flag
// J'active l'UART 1 au départ
UART_Set_Active(&UART1_Remappable_Read, &UART1_Remappable_Write, &UART1_Remappable_Data_Ready, &UART1_Remappable_Tx_Idle);
//------------------------------ INTERRUPTION -------------------------------------
//----- GLOBAL
INTCON.PEIE = 1 ; // On active les INT périphériques
INTCON.GIE = 1 ; // On active toutes les INT
// ----------------- Initialisation de la lecture analogique/numérique ----------------------------------
ADC_Init();
ADFM_bit = 0; // Justification à gauche. ainsi je transforme la lcture sur 10 bits en 8 bits et jignore les petits chiffres
TRISD.B5 = TRISD.B7 = 1; // met RD5 et RD7 en entrée
ADPCH = 0b011101; // Lecture de RD5 par défaut
Initialisation_AMB8626(); // Se trouve dans un Header a dé-commenter pour un changement de la config
// 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){
Lecture_Potar(); // Je récupere mes valeurs de potars
Envoi_Potar_TOR();
delay_ms(50);
}
}
//#################################################################################################
//############################### PROGRAMME SECONDAIRE ###################################
//#################################################################################################
// Cette fonction envoie au module radio les valeurs des potars pour les moteurs
void Envoi_Potar_TOR(){
//Envoi d'un message
UART1_Remappable_Write(0x02); // Start
UART1_Remappable_Write(0x00); // Commande
UART1_Remappable_Write(0x04); // Nbe de DATA
UART1_Remappable_Write(Joystick_G_DG); // DATA
UART1_Remappable_Write(Joystick_G_HB); // DATA
UART1_Remappable_Write(Joystick_D_DG); // DATA
UART1_Remappable_Write(Joystick_D_HB); // DATA
UART1_Remappable_Write(0x02^0x00^0x04^Joystick_G_DG^Joystick_G_HB^Joystick_D_DG^Joystick_D_HB); //CS
}
void Lecture_Potar(){
ADPCH = ADC_RD5; // On change de broche pour lire la suivante ici RD5
delay_us(50); // Stabilisation du changement de channel
ADCON0.ADGO = 1; // lancement de la conversion
while (ADCON0.ADGO); // On attend la fin de la conversion
Joystick_G_DG = ADRESH; // On enregistre le résultat
delay_us(50); // On marque une pause, je sais pas pourquoi mais sans elle ca bug
ADPCH = ADC_RD7; // On change de broche pour lire la suivante ici RD7
delay_us(50);
ADCON0.ADGO = 1;
while (ADCON0.ADGO);
Joystick_G_HB = ADRESH;
delay_us(50);
ADPCH = ADC_RC0; // On change de broche pour lire la suivante ici RC0
delay_us(50);
ADCON0.ADGO = 1;
while (ADCON0.ADGO);
Joystick_D_DG = ADRESH;
delay_us(50);
ADPCH = ADC_RA7; // On change de broche pour lire la suivante ici RA7
delay_us(50);
ADCON0.ADGO = 1;
while (ADCON0.ADGO);
Joystick_D_HB = ADRESH;
}
J'ai voulus continuer à faire mon programme principal, mais c'est pas évident sans avoir tout les éléments. Je vais donc avancer doucement. Maintenant je sais envoyer la valeur de mes potars par voie radio, je peux donc contrôler mon robot à distance.
Alors je vais essayer de le faire avancer et tourner. Il y a déjà pas mal de travail rien que la , car c'est pas si simple que ça . Il s'agit d'un robot à 6 roues. il n'y à pas de direction , il se pilote comme un char d'assaut , on avance d'un cote ou de l'autre pour tourner et les deux en même temps pour aller tout droit.
https://www.gotronic.fr/art-chassis-wil ... -12400.htm
Calculez un checksum avec un tableau de char ?
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Jérémy a écrit :....
Mon problème réglè mais sans comprendre exactement le pourquoi du comment. Il faut rajouter une temporisation après avoir lu ADRESH ! allez savoir pourquoi .....
ce n'est effectivement pas clairement explicite dans la datasheet;
mais j'avais déja rencontré ce probleme avec un 18F46K22
Là, la datasheet explains :
17.2.5 DELAY BETWEEN CONVERSIONS
After the A/D conversion is completed or aborted, a
2 TAD wait is required before the next acquisition can
be started. After this wait, the currently selected
channel is reconnected to the charge holding capacitor
commencing the next acquisition.
Calculez un checksum avec un tableau de char ?
Calculez un checksum avec un tableau de char ?
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Gérard a écrit :Source du message Tu as mis quoi comme tempo entre 2 acquisitions?
Code : Tout sélectionner
ADPCH = ADC_RD5; // On change de broche pour lire la suivante ici RD5
delay_us(50); // Stabilisation du changement de channel
ADCON0.ADGO = 1; // lancement de la conversion
while (ADCON0.ADGO); // On attend la fin de la conversion
Joystick_G_DG = ADRESH; // On enregistre le résultat
delay_us(50); // On marque une pause, je sais pas pourquoi mais sans elle ca bug
ADPCH = ADC_RD7; // On change de broche pour lire la suivante ici RD7
delay_us(50);
ADCON0.ADGO = 1;
while (ADCON0.ADGO);
Joystick_G_HB = ADRESH;
J'ai mis 50µs après un chargement de channel, car le PIC repasse par Vss entre deux changement il faut donc recharger , d’après ce que j'ai compris.
Et ensuite j'ai re-mis une tempo de 50µs pour lire la valeur dans ADRESH , alors que rien n'est indiqué sur la DS à ce sujet( ou du moins je ne l'ai pas vu .
Calculez un checksum avec un tableau de char ?
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Jérémy a écrit :Et ensuite j'ai re-mis une tempo de 50µs pour lire la valeur dans ADRESH , alors que rien n'est indiqué sur la DS à ce sujet( ou du moins je ne l'ai pas vu .
voir post#16
ce delay aditionnel est bien intercalé entre 2 acquisitions !
nota: pas vu non plus dans la DS du 18F47K40
de plus ,microchip preconise, de ne pas relire immediatement le bit ainsi armé :
ADCON0.ADGO = 1; // lancement de la conversion
_asm NOP; <- rajout
_asm NOP;
while (ADCON0.ADGO); // On attend la fin de la conversion
ce n'est peut etre pas indispensable sur tous les PIC,mais ça mange pas de pain (ou une miette !)..
CHAR :
Beau chassis mecanique en effet .. mais quand meme pas donné .
Calculez un checksum avec un tableau de char ?
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
J'ai effectué ta préconisation Paul !
En effet ça mange pas de pain et ça fonctionne encore.
Pour le châssis oui , il est de très bonne qualité. J’espère vous dévoilez une vidéo rapidement, quand il roulera. Pour piloter les moteurs j'ai pris cette carte : https://www.gotronic.fr/art-commande-sa ... -11575.htm
En effet ça mange pas de pain et ça fonctionne encore.
Pour le châssis oui , il est de très bonne qualité. J’espère vous dévoilez une vidéo rapidement, quand il roulera. Pour piloter les moteurs j'ai pris cette carte : https://www.gotronic.fr/art-commande-sa ... -11575.htm
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 41 invités