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

Problème contrôle lcd sur 16f1937
pooshy
Membre
Membre
Messages : 5
Enregistré en : mars 2016

#1 Message par pooshy » ven. 25 mars 2016 12:17

Bonjour,
Je code avec xc8 sur le 16f1937.
J'ai décidé d'utiliser une librairie pour commander mon lcd. (4x20 en mode 4 bits).
une simulation sur PROTEUS me ramène à l'erreur : "controller received command whilst busy".
Autrement dit, il reçoit des commandes alors qu'il est occupé.
La librairie fonctionne pourtant bien sur le 16f877.
Quelqu'un a déjà rencontré se problème sur se pic ?

Câblage :

PORTD[0-3] sur data[4-7]
PORTD(4) sur RS
PORTD(5) sur RW
PORTD(6) sur EN

Ci-joint le code :

main.c

Code : Tout sélectionner

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "lcd2/lcd.h" //Librairie LCD

#define _XTAL_FREQ 8000000

#pragma config WDTE = OFF

int main(int argc, char** argv) {
   
    TRISD=0b00000000; 
    ANSELD=0b00000000;
    LATD=0b00000000;
   
    __delay_ms(1000);

    lcd_init();
   
    for(;;)
    {
    }
}



lcd.h

Code : Tout sélectionner

/* write a byte to the LCD in 4 bit mode */

extern void lcd_write(unsigned char);

/* Clear and home the LCD */

extern void lcd_clear(void);

/* write a string of characters to the LCD */

extern void lcd_puts(const char * s);

/* Go to the specified position */

extern void lcd_goto(unsigned char pos);
   
/* intialize the LCD - call before anything else */

extern void lcd_init(void);

extern void lcd_putch(char);

/*   Set the cursor position */

#define   lcd_cursor(x)   lcd_write(((x)&0x7F)|0x80)


lcd.c

Code : Tout sélectionner

#ifndef _XTAL_FREQ
 // Unless specified elsewhere, 8MHz system frequency is assumed
 #define _XTAL_FREQ 8000000
#endif


#include   <xc.h>
#include   "lcd.h"

#define   LCD_RS RD4
#define   LCD_RW RD5
#define LCD_EN RD6

#define LCD_DATA   LATD

#define   LCD_STROBE()   ((LCD_EN = 1),(LCD_EN=0))

/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{
   __delay_us(40);
   LCD_DATA = ( ( c >> 4 ) & 0x0F );
   LCD_STROBE();
   LCD_DATA = ( c & 0x0F );
   LCD_STROBE();
}

/*
 *    Clear and home the LCD
 */

void
lcd_clear(void)
{
   LCD_RS = 0;
   lcd_write(0x1);
   __delay_ms(2);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
   LCD_RS = 1;   // write characters
   while(*s)
      lcd_write(*s++);
}

/* write one character to the LCD */

void
lcd_putch(char c)
{
   LCD_RS = 1;   // write characters
   lcd_write( c );
}


/*
 * Go to the specified position
 */

void
lcd_goto(unsigned char pos)
{
   LCD_RS = 0;
   lcd_write(0x80+pos);
}
   
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
   char init_value;

   init_value = 0x3;
   TRISC=0;
   TRISD=0;
   LCD_RS = 0;
   LCD_EN = 0;
   LCD_RW = 0;
   
   __delay_ms(15);   // wait 15mSec after power applied,
   LCD_DATA    = init_value;
   LCD_STROBE();
   __delay_ms(5);
   LCD_STROBE();
   __delay_us(200);
   LCD_STROBE();
   __delay_us(200);
   LCD_DATA = 2;   // Four bit mode
   LCD_STROBE();

   lcd_write(0x28); // Set interface length
   lcd_write(0xF); // Display On, Cursor On, Cursor Blink
   lcd_clear();   // Clear screen
   lcd_write(0x6); // Set entry Mode
}


Merci et bonne journée.

Problème contrôle lcd sur 16f1937
mazertoc
Passionné
Passionné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#2 Message par mazertoc » ven. 25 mars 2016 18:04

Bienvenue pooshy.
Je ne connais pas Proteus ni le C, alors tu vas devoir attendre un peu . . .

Problème contrôle lcd sur 16f1937
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#3 Message par Guest » sam. 26 mars 2016 07:54

Bonjour

je suis un peu entonné que cela fonctionne avec un 16F877 pourquoi:

Busy est un bit du contrôleur LCD que l'on lit en réception pour savoir si le contrôleur est libre de toutes activités pour écrit ou lire une nouvelle donnée
hors dans ta librairie aucune trace de cette fonction.
La seule chose que l'on trouve c'est cette fonction plus ou moins bizarre

Code : Tout sélectionner

LCD_STROBE()   ((LCD_EN = 1),(LCD_EN=0))
cette fonction STROBE est importante car c'est elle qui valide les données présentent sur le port du LCD et cette validation ne doit pas être fait n'importe comment.

Je ne sais pas d'ou tu sorts cette librairie mais je te conseil d'utiliser celle de XC8 -> XLCD ou la tu as la fonction busy sous la version V1.32 de XC8 car sous la nouvelle version v1.37 elle n'y est plus :P
Sinon attend le retour de jeremy et je posterais ma propre librairie qui n'utilise pas busy mais une tempo

si tu es pressé met quelques NOP dans la fonction STROBE ;)

A+

Problème contrôle lcd sur 16f1937
pooshy
Membre
Membre
Messages : 5
Enregistré en : mars 2016

#4 Message par pooshy » sam. 26 mars 2016 11:42

Bonjour,

La librairie proviens de la version 9.82 d'hitech. J'ai rajouté plusieurs NOP dans la fonction STROBE mais sans changement.
J'ai zieuté un peu la librairie Xlcd, elle semble concerner uniquement la famille des 18f.
Je serais effectivement intéressé par ta propre librairie à tempo.
Merci et à bientôt

Problème contrôle lcd sur 16f1937
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » sam. 26 mars 2016 15:23

tu as un petit problème au niveau de l'int en mode 4 bits l'instruction set est de 0X28
je m'explique

voici un petit bout de mon fichier entete .h

Code : Tout sélectionner

/* Fonction Set divers definitions */
#define QUATRE_BIT        0             /* 4-bit Interface   */
#define HUIT_BIT          16            /* 8-bit Interface   */
#define LIGNE1            0             /* LCD  1 LIGNE      */
#define LIGNE2            8             /* LCD 2 LIGNES ET + */
#define TAILLE_5X7        0             /* MATRICE 5x7       */
#define TAILLE_5X10       4             /* MATRICE 5x10      */   

#define SET               32 | (QUATRE_BIT) | (LIGNE2) | (TAILLE_5X7)

ici on est en 4bits 2lignes ou plus et avec une taille caractère de 5X7 c'est un OU logique (32+0+8+0) on a bien 40 soit 0X28 en hexa donc a l'int il faut lui envoyer set mais sur 4 bits donc en premier le poids fort 2 puis le poids faible 8 et comme ils sont dur d'oreille répéter cela 3 fois uniquement le set . Si tu veux t'amuser fait de même avec les autres jeux instruction du LCD

PS: fait quand même un essai avec la lib de XC8

A+

Problème contrôle lcd sur 16f1937
patou149
Débutant
Débutant
Messages : 35
Enregistré en : octobre 2015

#6 Message par patou149 » sam. 26 mars 2016 16:34

Bonjour,

Juste pour information, sur les versions de XC8 > 1.35 il est possible de retrouver les librairies "plib" en téléchargant et en installant le fichier "PIC18F Legacy Peripheral Libraries v1.0 - Windows" que l'on trouve sur le site de Microchip.
microchip


A+

Problème contrôle lcd sur 16f1937
pooshy
Membre
Membre
Messages : 5
Enregistré en : mars 2016

#7 Message par pooshy » sam. 26 mars 2016 16:38

Je t'avoue que je ne me suis jamais trop posé de question sur le mode de communication du lcd.
Si tu as une datasheet sous le coude je suis preneur.
C'est donc à l'initialisation qu'il faut lui indiquer le mode de fonctionnement.
je ne comprend pas trop ton dernier message.
Dans le code d'initialisation,il y a bien la ligne: lcd_write(0x28);
Certe on ne lui envois l'info qu'une fois mais d'après se que tu m'indiques l'init est bien fait en mode 4 bits sur 2lignes ou+.

Problème contrôle lcd sur 16f1937
patou149
Débutant
Débutant
Messages : 35
Enregistré en : octobre 2015

#8 Message par patou149 » sam. 26 mars 2016 16:39

bonjour,

Les fichiers que j'utilise pour des pic 18 mais cela doit fonctionner pour des 16f

lcd.zip


a+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Problème contrôle lcd sur 16f1937
pooshy
Membre
Membre
Messages : 5
Enregistré en : mars 2016

#9 Message par pooshy » sam. 26 mars 2016 16:40

Merci pour cette information patou.

Problème contrôle lcd sur 16f1937
patou149
Débutant
Débutant
Messages : 35
Enregistré en : octobre 2015

#10 Message par patou149 » sam. 26 mars 2016 18:24

Avec un 16f1937 il faut utiliser les registres LAT pour écrire sur un port et donc au lieu de :

Code : Tout sélectionner

#define   LCD_RS RD4    


il faut écrire :

Code : Tout sélectionner

#define LCD_RS  LATDbits.LATD4   


idem pour les autres.


Retourner vers « Langage C »

Qui est en ligne

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