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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Calculez un checksum avec un tableau de char ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#11 Message par Jérémy » mar. 2 janv. 2018 14:09 lien vers la Data-Sheet : Cliquez ici

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 :cry:

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 :
AMB8626_MA_3_8.pdf


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.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Calculez un checksum avec un tableau de char ?
satinas
Amateur
Amateur
Messages : 185
Enregistré en : novembre 2015

#12 Message par satinas » mar. 2 janv. 2018 14:11 lien vers la Data-Sheet : Cliquez ici

Arrête de tout mélanger, teste puis valide la transmission, ensuite ajoute l'ADC.

Calculez un checksum avec un tableau de char ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#13 Message par Jérémy » mar. 2 janv. 2018 14:27 lien vers la Data-Sheet : Cliquez ici

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 !!!!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Calculez un checksum avec un tableau de char ?
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 784
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#14 Message par paulfjujo » mar. 2 janv. 2018 15:12 lien vers la Data-Sheet : Cliquez ici

Jérémy a écrit :..
Sans vouloir vous contredire, ma méthode fonctionne très bien.



oops 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
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#15 Message par Jérémy » jeu. 4 janv. 2018 08:38 lien vers la Data-Sheet : Cliquez ici

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:

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_HBJoystick_D_DGJoystick_G_HBJoystick_G_DG;
 
char Test;

//--- UART
 
char Reception_UART1Reception_UART2Index_Buff1Index_Buff2Buffer1_pleinBuffer2_plein;
 
char ValeurCommande_Mode_OKParametre_OKRESET_OKTEST_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 ;
                     }
                     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 ;
                        
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 ;       // On active les INT périphériques
    
INTCON.GIE  ;        // 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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Calculez un checksum avec un tableau de char ?
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 784
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#16 Message par paulfjujo » jeu. 4 janv. 2018 10:38 lien vers la Data-Sheet : Cliquez ici

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 ?
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 626
Âge : 59
Enregistré en : septembre 2015
Localisation : Alsace

#17 Message par Gérard » jeu. 4 janv. 2018 21:20 lien vers la Data-Sheet : Cliquez ici

Jérémy :
Tu as mis quoi comme tempo entre 2 acquisitions?
Vachement bien ton châssis de robot.

Paul :
(trop flemmard pour chercher), ça fait combien 2TAD?

Bonne nuit.
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Calculez un checksum avec un tableau de char ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#18 Message par Jérémy » jeu. 4 janv. 2018 22:21 lien vers la Data-Sheet : Cliquez ici

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 :furieux: .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Calculez un checksum avec un tableau de char ?
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 784
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#19 Message par paulfjujo » ven. 5 janv. 2018 10:59 lien vers la Data-Sheet : Cliquez ici

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 :furieux: .



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
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#20 Message par Jérémy » ven. 5 janv. 2018 11:49 lien vers la Data-Sheet : Cliquez ici

J'ai effectué ta préconisation Paul !

En effet ça mange pas de pain et ça fonctionne encore. Merci !

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités