Pic 16F877 avec LCD 16*2

Fermé
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 - 30 mai 2014 à 15:25
falcon67120 Messages postés 2 Date d'inscription samedi 11 juillet 2015 Statut Membre Dernière intervention 11 juillet 2015 - 11 juil. 2015 à 13:45
Bonjour,

le schema c'est un pic 16f877 relié a 2 resistances variable et 2 barregprahe et un LCD 16*2 pour donner le niveau d'un fluide sur 2 bacs
le programme que j'ai utiliser pour les 2 barregraphes est le suivants :
unsigned int niv_bac1;
unsigned int niv_bac2;
unsigned char i,j;
unsigned int niveaux[8] = {127, 254, 382, 510, 638, 776, 894, 1022};

unsigned char VnDuNiveau(unsigned int val) {
unsigned char i = 0;
while (i < sizeof(niveaux)) {
if (val < niveaux[i])
return i;
else i++;
}
}




void main() {
// Configuration des pins 2 et 3 en analogique

TRISA = 0xFF; // programmtion du PORTA en entrée
TRISB = 0; // programmtion du PORTB en sortie
TRISC = 0; // programmtion du PORTC en sortie
TRISD = 0; // programmtion du PORTD en sortie
OPTION_REG.NOT_RBPU = 0;

do {
adcon0=0x80;
niv_bac1= Adc_Read(0); // lecture du niveau de fluide du bac1
//portB=niv_bac1>>2; //Affichage en binaire du niveau de fluide
j= VnDuNiveau(niv_bac1);

switch ( j ) {
case 0:
// Code
portB = 0x01;
break;

case 1:
// Code
portB = 0x03;
break;
case 2:
// Code
portB = 0x07;
break;

case 3:
// Code
portB = 0x0F;
break;
case 4:
// Code
portB = 0x1F;
break;
case 5:
// Code
portB = 0x3F;
break;
case 6:
// Code
portB = 0x7F;
break;
case 7:
// Code
portB = 0xFF;
break;

}



adcon0=0x88; //du bac1 sur le portB
niv_bac2= Adc_Read(1); // lecture du niveau de fluide du bac2



//PORTC = niv_bac2>>2; //Affichage en binaire du niveau de fluide
//du bac2 sur le portC
j= VnDuNiveau(niv_bac2);

switch ( j ) {
case 0:
// Code
portC = 0x01;
break;

case 1:
// Code
portC = 0x03;
break;
case 2:
// Code
portC = 0x07;
break;

case 3:
// Code
portC = 0x0F;
break;
case 4:
// Code
portC = 0x1F;
break;
case 5:
// Code
portC = 0x3F;
break;
case 6:
// Code
portC = 0x7F;
break;
case 7:
// Code
portC = 0xFF;
break;

}













} while(1);
}
voila et je cherche le programme pour le LCD pour afficher le resultat des barregraphe
qui peut m'aider svp , je suis pas programateur
Merci D'avance



A voir également:

13 réponses

creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
30 mai 2014 à 22:16
de l'aide svp
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
30 mai 2014 à 23:26
de l'aide SVP
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
31 mai 2014 à 14:41
up up
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 31/05/2014 à 16:09
Bonjour,

Tout d'abord, ce n'est pas programmateur mais programmeur. Programmateur c'est ce que tu trouves dans ta machine à laver.

Sinon en quoi pouvons-nous t'aider ? Qu'est-ce que tu as commencé à faire (n'hésite pas à poster ton code) ? Qu'est-ce qui te bloque ? Est-ce la partie électronique (donc algorithmique) ? Ou la partie programmation ?

Et merci d'attendre un minimum avant de faire des "up". On répond aux posts sur notre temps libre et gratuitement...

Google is your friend
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
1 juin 2014 à 00:25
jai jamais fait de programation , j'ai juste eseyé des example sur le mikroC for pic mais sa ne marche pas , (example dans l'index )
si quelqun pourrait me trouver le code , ou un schema qui ressemble a celui la avec lle code c'est ça que je recherche
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 juin 2014 à 01:17
On n'est pas là pour faire à ta place...
C'est un forum d'entraide. Donc on est ok pour t'aider mais pas pour faire.
Si tu ne sais pas programmer, je te conseille d'apprendre : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c

Cdlt,
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
1 juin 2014 à 18:43
j'ai pas dit de faire le travaille a ma palce ,
si y'a une personne qui conne un schema qui ressemble a celui la avec le code qui me le passe c tout , j'ai pas demander de faire des recherche pour moi , car j'ai fait des recherche mais rien
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 juin 2014 à 21:53
si y'a une personne qui conne un schema qui ressemble a celui la avec le code qui me le passe c tout
C'est ce qu'on appelle ici "faire ton travail". Si tu préfères, on n'est pas là pour te donner la réponse toute faite...
Sinon vu ton exo, cela relève plus de l'électronique que du langage C.
J'ai bien peur que personne puisse t'aider ici. Je te conseille peut-être un forum plus spécialisé...
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
1 juin 2014 à 22:49
ah d'accord
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
1 juin 2014 à 18:51
// Lcd pinout settings

sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD0_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;

// Pin direction
sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
j'ai commancer avec ça mais que faire ensuite ?
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
2 juin 2014 à 16:52
j'ai fait un tout autre programme sa marche mais sur les barregraph led sa fait marcher les 7 premiere led alors que moi jai configurer les 8 premiere et sur le lcd sa affiche des chiffre bizzare voila l'image :

et voila le nouveau code programme :


float niv_bac1;
float niv_bac2;
unsigned char i,j;
float niveaux[8] = {127, 255, 383, 511, 639, 777, 895, 1023};
sbit LCD_RS at RD1_bit ;
sbit LCD_EN at RD0_bit ;
sbit LCD_D4 at RD4_bit ;
sbit LCD_D5 at RD5_bit ;
sbit LCD_D6 at RD6_bit ;
sbit LCD_D7 at RD7_bit ;

sbit LCD_RS_Direction at TRISD1_bit ;
sbit LCD_EN_Direction at TRISD0_bit ;
sbit LCD_D4_Direction at TRISD4_bit ;
sbit LCD_D5_Direction at TRISD5_bit ;
sbit LCD_D6_Direction at TRISD6_bit ;
sbit LCD_D7_Direction at TRISD7_bit ;



char niveau1[4];
char niveau2[4];
unsigned char VnDuNiveau(float val) {
unsigned char i = 0;
while (i <= sizeof(niveaux)) {
if (val <= niveaux[i])
return i;
else i++;
}
}




void initialisation(){
TRISA = 0xFF; // programmtion du PORTA en entrée
TRISB = 0; // programmtion du PORTB en sortie
TRISC = 0; // programmtion du PORTC en sortie
TRISD = 0; // programmtion du PORTD en sortie
OPTION_REG.NOT_RBPU = 0;
lcd_init() ;
lcd_cmd(_lcd_clear) ;
lcd_cmd(_lcd_cursor_off) ;
lcd_out(1,1,"Bac1: ") ;
lcd_out(2,1,"Bac2: ") ;
adc_init() ;
portd=0X00 ;

}

void main() {
initialisation() ;
OPTION_REG.NOT_RBPU = 0;

do {
adcon0=0x80;
niv_bac1= Adc_Read(0); // lecture du niveau de fluide du bac1

j= VnDuNiveau(niv_bac1);

switch ( j ) {
case 0:
// Code
portB = 0x00;
break;

case 1:
// Code
portB = 0x01;
break;
case 2:
// Code
portB = 0x03;
break;

case 3:
// Code
portB = 0x07;
break;
case 4:
// Code
portB = 0x0F;
break;
case 5:
// Code
portB = 0x1F;
break;
case 6:
// Code
portB = 0x3F;
break;
case 7:
// Code
portB = 0x7F;
break;
case 8:
// Code
portB = 0xFF;
break;
}

floattostr(niv_bac1,niveau1) ;
lcd_out(1,6,niveau1) ;

adcon0=0x88;
niv_bac2= Adc_Read(1); // lecture du niveau de fluide du bac2

j= VnDuNiveau(niv_bac2);

switch ( j ) {
case 0:
// Code
portC = 0x00;
break;

case 1:
// Code
portC = 0x01;
break;
case 2:
// Code
portC = 0x03;
break;

case 3:
// Code
portC = 0x07;
break;
case 4:
// Code
portC = 0x0F;
break;
case 5:
// Code
portC = 0x1F;
break;
case 6:
// Code
portC = 0x3F;
break;
case 7:
// Code
portC = 0x7F;
break;
case 8:
// Code
portC = 0xFF;
break;

}


floattostr(niv_Bac2,niveau2) ;
lcd_out(2,6,niveau2) ;


} while(1);
}
je ne comprend pas pourquoi y a que les 7 premiere leds qui marche ?
merci pour l'aide
0
falcon67120 Messages postés 2 Date d'inscription samedi 11 juillet 2015 Statut Membre Dernière intervention 11 juillet 2015
11 juil. 2015 à 11:20
Bonjour

voila le programme complet en Mikroc Pro v 6.0.0
Cordialement

/*******************************************************************************
  • Niveau citerne avec led & LCD *
  • Microcontrôleur 16F877A *
  • quartz 8Mhz *
  • fusible par defaut *
  • Compilateur MickroC Pro V 6.0.0 *
  • le 10 Juillet 2015 à 16H00 *
                                                                                                                                                              • /


float niv_bac1;
float niv_bac2;
float niveaux[9] = {127, 254, 382, 510, 638, 776, 894, 1022 ,1149}; // Sortie PORTB & PORTC
// 0 1 2 3 4 5 6 7 8
unsigned char i,j;

sbit LCD_EN at RD1_bit ;
sbit LCD_RS at RD0_bit ;
sbit LCD_D4 at RD4_bit ;
sbit LCD_D5 at RD5_bit ;
sbit LCD_D6 at RD6_bit ;
sbit LCD_D7 at RD7_bit ;

sbit LCD_EN_Direction at TRISD1_bit ;
sbit LCD_RS_Direction at TRISD0_bit ;
sbit LCD_D4_Direction at TRISD4_bit ;
sbit LCD_D5_Direction at TRISD5_bit ;
sbit LCD_D6_Direction at TRISD6_bit ;
sbit LCD_D7_Direction at TRISD7_bit ;

char niveau1[4];
char niveau2[4];
unsigned char VnDuNiveau(float val)
{
unsigned char i = 0;
while (i <= sizeof(niveaux))
{
if (val <= niveaux[i])
return i;
else i++;
}
}
void initialisation()
{
TRISA = 0xFF; // programmtion du PORTA en entrée
TRISB = 0; // programmtion du PORTB en sortie
TRISC = 0; // programmtion du PORTC en sortie
TRISD = 0; // programmtion du PORTD en sortie
OPTION_REG.NOT_RBPU = 0;
lcd_Init() ;
lcd_Cmd(_LCD_CLEAR) ;
lcd_Cmd(_LCD_CURSOR_OFF) ;
lcd_Out(1,1,"Bac1: ") ;
lcd_Out(2,1,"Bac2:") ;

ADC_Init(); // Initialize ADC module with default settings
}

void main()
{
initialisation() ;
OPTION_REG.NOT_RBPU = 0;
do
{ // *************************** niveau bac1 ***********************************

ADCON0=0x80; // du bac1 sur le portB
niv_bac1= ADC_Read(0); // lecture du niveau de fluide du bac1
j= VnDuNiveau(niv_bac1); // Affichage en binaire du niveau de fluide du bac1 sur le portB

switch (j)
{
case 0:
PORTB = 0x00;
break;

case 1:
PORTB = 0x01;
break;

case 2:
PORTB = 0x03;
break;

case 3:
PORTB = 0x07;
break;

case 4:
PORTB = 0x0F;
break;

case 5:
PORTB = 0x1F;
break;

case 6:
PORTB = 0x3F;
break;

case 7:
PORTB = 0x7F;

break;

case 8:
PORTB = 0xFF;
break;
}

floattostr(niv_bac1,niveau1) ;
lcd_Out(1,7,niveau1) ; // Affichage du niveau de fluide du bac1 sur le portB

// *************************** niveau bac2 ***********************************

ADCON0=0x88; // du bac2 sur le portC
niv_bac2= ADC_Read(1);
j= VnDuNiveau(niv_bac2); // lecture du niveau de fluide du bac2

switch (j)
{
case 0:
PORTC = 0x00;
break;

case 1:
PORTC = 0x01;
break;

case 2:
PORTC = 0x03;
break;

case 3:
PORTC = 0x07;
break;

case 4:
PORTC = 0x0F;
break;

case 5:
PORTC = 0x1F;
break;

case 6:
PORTC = 0x3F;
break;

case 7:
PORTC = 0x7F;
break;

case 8:
PORTC = 0xFF;
break;
}
floattostr(niv_Bac2,niveau2) ; // lecture du niveau de fluide du bac2
lcd_Out(2,7,niveau2) ; // Affichage du niveau de fluide du bac2 sur le portC
} while(1);
}
0
Utilisateur anonyme
2 juin 2014 à 17:03
Bonjour

Ton tableau niveaux a 8 éléments, donc l'indice rendu par VnDuNiveau va de 0 à 7.
Donc le case 8 de ton affichage n'est jamais exécuté.
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
2 juin 2014 à 18:15
mais de 0 a 7 sa fait 8 cas
comment activer la 8eme led ?
0
Utilisateur anonyme
2 juin 2014 à 21:11
De 0 à 7, ça fait bien 8 cas.
Mais de 'case 0' à 'case 8', ça en fait 9.
Quant à tes leds, de 'toutes éteintes' , '1 allumée'... jusqu'à 8 allumées, ça fait bien 9 cas aussi.
Donc ce qui cloche, c'est ton tableau qui n'a que 8 éléments : il devrait en avoir 9 tel que ton programme est écrit.
Je précise 'tel qu'il est écrit' car en fait, le dernier élément étant la pleine échelle du convertisseur (1023), tu pourrais t'en passer.
0
creaturemal Messages postés 121 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 15 juin 2015 8
2 juin 2014 à 23:11
je peut me passer de quoi ?
0
Utilisateur anonyme
3 juin 2014 à 07:49
Du dernier élément de ton tableau : c'est toujours le même, il n'apporte aucune information.
0
falcon67120 Messages postés 2 Date d'inscription samedi 11 juillet 2015 Statut Membre Dernière intervention 11 juillet 2015
11 juil. 2015 à 13:45
Bonjour

voila le schéma avec leds & lcd
Cordialement

0