Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal

Conversion int char

Démarré par Jeanmi, Décembre 24, 2019, 07:50:08 AM

« précédent - suivant »

Jeanmi

Bonjour

Dans la programmation de mon PIC, je récupère la valeur int() du convertisseur ADC, valeur entre 0 et 1024, je voudrais afficher cette valeur sur un écran LCD (je travaille sur une plaquette de développement MIKRO easy PIC 7), mon problème c’est que je dois envoyer une valeur type char() sur le LCD , mais ma valeur reçue est de type int().

J’ai essayé de transformer la int en char : valeurChar = char() valeurInt , mais cela ne fonctionne pas, je n’ai pas la même valeur lors de la conversion.

Je programme en C

Merci de votre aide, même si cela doit faire rire certain  :D

Jean-Michel

Yffig

#1
Bonjour JeanMi
T'inquiète pas, c'est comme ça qu'on apprend....en merdant d'abord
Comme tu utilises le matos des Serbes de MikroElektronika et leur MikroC, ça va être simple de t'expliquer:
L'ADC du PIC fournit 10 bits significatifs 0000 à  1023, ce qui nécessite plus d'un octet (ou char) pour être représenté => la donnée que tu vas lire est donc contenue dans un "double octet" , soit un unsigned (int) selon la syntaxe µC (cf. p13 du livret Quick Reference Guide for MikroC ou tu trouveras ça dans le help du compilateur).
Pour afficher sur un LCD1602, la chaîne de caractères ascii représentée par ta sortie ADC:
- tu affiches dans ton projet la liste des MikroE librairies à  droite,
- tu sélectionnes la bibliothèque Conversions (et tu l'inclus dans ton projet en la cochant)
- dans la liste des fonctions (tout en bas) tu as la fonction dont tu as besoin "WordToStr" qui va convertir ton unsigned en une chaine de 6 caractères ascii (5 chiffres décimaux pour 0000 à  65535 plus le caractère de fin de chaîne) dans un tableau d'au moins 6 caractères que tu auras créé auparavant dans ton code (l'exemple fourni par MC est assez explicite)
Et ensuite tu utilises les fonctions de la bib. LCD (là  je te laisse regarder l' exemple fourni pour cette bib.  tout en bas de la page LCD il est suffisamment clair et complet).
PS: si c'est un autre compilateur que tu utilises, à  toi de convertir ces infos dans la syntaxe de ton compilateur (je n'utilise que MikroC)
Amuse toi bien
Yffig



Jeanmi

Merci , mais j'ai toujours un problème, la valeur n'est pas bonne sur le LCD

voici mon code :                                                        /*
Jean-Michel Boucha

        Compilé pour: PIC18F45k22
        Compilateur: MikroC PRO
        IDE: MikroC PRO  7.6.0
*/

// GLOBALS

// CONFIGURATION BYTES

// CONSTANTS AND MASKS DEFINITION

        //Other definitions


#include <built_in.h>


// Lcd module connections
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;
// End Lcd module connections

char valeurAD[6];
unsigned int adc_rd;

void main() {
  ANSELA = 0x02;             // Configure RA1 pin as analog
  ANSELB = 0;                // Configure PORTB pins as digital
  ANSELC = 0;                // Configure PORTC pins as digital
  ANSELD = 0;                // Configure PORTD pins as digital
  ANSELE = 0;                // Configure PORTD pins as digital

  TRISA = 0x02;              // Set RA1 pin as input
  TRISC = 0x00;              // Set PORTC as output
  TRISD = 0x00;              // Set PORTD as output
  TRISE = 0x00;              // Set PORTD as output
  Lcd_Init();                        // Initialize Lcd
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
    do
    {
         adc_rd = Adc_Read(1);  // Lecture tension analogique
         
        WordToStr (adc_rd,valeurAD);

       Lcd_Out(1,1,valeurAD);      // Write text in first row
         
         

    }  while (1) ;
}

Jeanmi

#3
Ok , cela fonctionne maintenant

mais comment supprimer le premier caractère qui est "", je perds un chiffre sur le LCD

Par exemple : si la valeur es 1024, la première lettre di LCD est vide et si c'est 645, c'est les 2 premières qui sont vide


Merci

Yffig

#4
Re...
Déjà  tu dis que ta valeur n'est pas bonne... Elle devrait être quoi ?

Tu utilises ADC_Read: selon le help de la fonction, tu ne sais pas à  priori quelle est la valeur correspondant à  0x3F dans ton ADC (je pense que c'est Vdd = +5V environ mais j'en suis pas sûr.
Utilise dans ton initialisation ADC_Init_Advanced(_ADC_EXTERNAL_VREFL | _ADC_INTERNAL_FVRH1); (une seule fois, pas dans la boucle), FVRH1 est défini dans le help de la bib ADC
Ta valeur analogique correspondant à  0x3F sera alors de 1.023 V en entrée de l'ADC
Ensuite dans ta boucle utilise:
ADC_Get_Sample (1) ;
Ton LCD devrait t'indiquer 1023 quand tu as 1.023v en entrée... Il te reste à  gérer la virgule  ;)
Nota:
j’utilise toujours ces 2 fonctions plutôt que ADC_read qui refait l'init à  chaque fois,
Avec ta config 18F45K22, si tu as la PLL 4x (ie tu tournes à  32 MHz), la durée de ta conversion sera d'environ 60 µs (c'est ce que j'ai mesuré)
A plus !

Yffig




Yffig

#5
Concernant ton post de 10:19:44
Il t'appartient de jouer avec la bibliothèque Conversions, sans passer par l'ADC:
tu définis une constante en char, en unsigned , en float, etc. et tu t'amuses avec les fonctions de Conversions (en lisant bien toutes les explications pour chaque fonction, les exemples sont suffisamment parlants et indiquent le formatage réalisé par la fonction) puis tu affiches sur LCD et tu cherches à  comprendre ce qui se passe
Dans cette bibliothèque, tu as de quoi t'amuser parce que c'est à  toi d'apprendre (je te rassure, j'ai du faire pas mal d'exercices de ce genre) et tu as aussi les fonctions RTrim et LTrim qui peuvent t'être très utiles...Amuse toi avec...
Si tu as le EasyPic7, tu as le "sample" LM35.c et le projet associé en .mcppi qui est un bon exemple.
Bonne journée

Jeanmi

Un tout grand merci et joyeux noel à  vous tous

Curiosus

#7
Bonjour,

C'est le gros problème des langages de haut niveau, faire sans comprendre, après on sait plus quoi faire.

A voir comment fonctionne une conversion binaire vers ASCII, dans le langage ASM ça serait à  toi de la faire, ou moins ça te permettrais de comprendre....

Si tu commence comme ça,  bon courage par la suite..... 

je vous souhaite un joyeux Noà«l.

A+