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
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
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) ;
}
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
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
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
Un tout grand merci et joyeux noel à vous tous
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+