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 ---
- 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 ---
Modérateur : Jérémy
Problème contrôle lcd sur 16f1937
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
lcd.h
lcd.c
Merci et bonne journée.
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
Problème contrôle lcd sur 16f1937
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
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
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+
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))
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
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
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
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
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
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+
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
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+
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
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+.
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
Problème contrôle lcd sur 16f1937
Problème contrôle lcd sur 16f1937
Avec un 16f1937 il faut utiliser les registres LAT pour écrire sur un port et donc au lieu de :
il faut écrire :
idem pour les autres.
Code : Tout sélectionner
#define LCD_RS RD4
il faut écrire :
Code : Tout sélectionner
#define LCD_RS LATDbits.LATD4
idem pour les autres.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 109 invités