Problème Initialisation LCD GDM1601C
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Problème Initialisation LCD GDM1601C



  1. #1
    GearsGL

    Problème Initialisation LCD GDM1601C


    ------

    Bonjour,

    Je tente d'initialiser un LCD GDM 1601C (datasheet: http://www.xmocular.com/upload_img/2007110149304469.pdf) via l'utilisation d'un PIC16F819 (datasheet: http://oap.sourceforge.net/datasheets/PIC16F819.pdf) câblé en mode 4bits (R/W à 0V fixe) en langage assembleur.

    Le câblage est réalisé comme suit :
    - D4 à D7 sur RB4 à RB7
    - RS sur RB1
    - E sur RB2

    J'ai écris une routine (inspiré de celle-ci : http://meteosat.pessac.free.fr/Cd_el...Pic/cramer.zip) permettant théoriquement l'initialisation du LCD mode 4bits jusqu'à l'effacement de l'affichage, cependant, rien ne se passe. Seul la moitié de la ligne de l'afficheur est grisée (par défaut à l'allumage), rien de plus.

    J'aimerais savoir si ma routine est correcte, et digne de fonctionner. Normalement, toute la partie configuration du PIC est correcte mais reste cependant à être confirmée.

    Je vous joins entièrement mon fichier .asm :
    Code:
    	
    	LIST		p=16F819
    	#INCLUDE	<p16F819.inc>
    	
    	__CONFIG	_CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _BODEN_OFF & _MCLR_OFF & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_IO
    
    		;- - - - - - - - - - - -;
    		; ASSIGNATIONS ;
    		;- - - - - - - - - - - -;
    
    OPTIONVAL	EQU		B'00000000'	; valeur registre option, Resistance pull-up ON, Interrupt flanc descendant RB0
    OSCCONVAL	EQU 	        B'01100100'	; F=4MHZ stable
    ADCON1VAL	EQU		B'00000110'	; config A/D PortA = toutes en digitales
    DIRPORTA	        EQU		B'11111011'	; config I/O PortA = RA2 en sortie, reste en entrées
    DIRPORTB	        EQU		B'00001001'	; config I/O PortB = RB7 à 4 + RB1 et RB2 en sorties, reste en entrées
    LCD_DATA		EQU		PORTB
    
    		;- - - - - - - - - -;
    		;    DEFINES   ;
    		;- - - - - - - - - -;
    
    #DEFINE	E			PORTB,2
    #DEFINE	RS			PORTB,1
    
    
    		;- - - - - - - - - -;
    		;   MACROS   ;
    		;- - - - - - - - - -;
    
    BANK0	macro					; passer en banque 0
    		bcf		STATUS,RP0
    		bcf		STATUS,RP1	
    		endm
    
    BANK1	macro					; passer en banque 1
    		bsf		STATUS,RP0	
    		bcf		STATUS,RP1
    		endm
    
    
    		;- - - - - - - - - - -;
    		;   VARIABLES  ;
    		;- - - - - - - - - - -;
    
    	CBLOCK 	0x020				; début de la zone variables
    		Char, temp1, temp2, temp3, Temp
    	ENDC						; fin de la zone
    
    		;- - - - - - - - - - - - - - - - -;
    		;  DEMARRAGE RESET  ;
    		;- - - - - - - - - - - - - - - - -;
    
    	org 		0x000 				; adresse de départ après reset
      	goto    	INIT	
    
    		;- - - - - - - - - - - - -;
    		; INITIALISATIONS ;
    		;- - - - - - - - - - - - -;
    
    INIT
    	clrf		PORTA				; sorties portA à 0
    	clrf		PORTB				; sorties portB à 0
    
    	BANK1						; sélectionne la banque 1
    
    	movlw	OPTIONVAL			; charge masque OPTIONVAL
    	movwf	OPTION_REG			; initialiser registre OPTION_REG
    
    	movlw	OSCCONVAL			; charge masque OSCCONVAL
    	movwf	OSCCON				; initialise registre OSCCON
    
    	clrf 		OSCTUNE				; center frequency (a verif)
    
    	movlw	ADCON1VAL			; charge masque ADCON1VAL
    	movwf	ADCON1				; initialise registre ADCON1
    
    	movlw	DIRPORTA				; charge masque DIRPORTA
    	movwf	TRISA				; initialise registre TRISA
    
    	movlw	DIRPORTB				; charge masque DIRPORTB
    	movwf	TRISB				; initialise registre TRISB
    
    
    	; Boucle0 effacement RAM BANK1 (32octets)
    	movlw	0xA0					; initialisation pointeur
    	movwf	FSR					; pointeur d'adressage indirect
    DEL_RAM1
    	clrf		INDF					; effacer ram banque 1
    	incf		FSR,f					; pointer sur adresse suivante
    	btfss	FSR,7				; tester si fin zone atteinte (>=80)
    	goto		DEL_RAM1				; non, boucler
    	btfss	FSR,6				; tester si fin zone atteinte (>=C0)
    	goto		DEL_RAM1				; non, boucler
    
    	BANK0						; repasser banque 0
    
    	; Boucle1 effacement RAM BANK0 (96octets)
    	movlw	0x20					; initialisation pointeur
    	movwf	FSR					; pointeur d'adressage indirect
    DEL_RAM0
    	clrf		INDF					; effacer ram banque 0
    	incf		FSR,f					; pointer sur adresse suivante
    	btfss	FSR,7				; tester si fin zone atteinte (>=80)
    	goto		DEL_RAM0				; non, boucler
    
    	goto		START				; sauter au programme principal
    
    		;- - - - - - - - - - - - - - - - - - -;
    		; PROGRAMME PRINCIPAL  ;
    		;- - - - - - - - - - - - - - - - - - -;
    
    START
    	
    	call		LCD_INIT
    	
    	bsf		RS					; mode *envoi caractères*
    	movlw	0x41					; envoi du caractère 'A'
    	call		SEND_Data
    boucle:
    	bsf		PORTA,2
    	goto		boucle
    	
    		;- - - - - - - - - - - - - - - - - - -;
    		;     INITIALISATION LCD    ;
    		;- - - - - - - - - - - - - - - - - - -;
    
    LCD_INIT:
    	bcf		E					; efface toutes lignes de contrôles
    	bcf		RS
    		
    	call		Temp40ms
    	call		Temp40ms
    
    	movlw	0x0f					
    	andwf	LCD_DATA,f			; efface emplacement donnée
    	movlw	0x30					; initialisation LCD en mode 8-bits (obligatoire)
    	iorwf	LCD_DATA,f			; envoi quartet au LCD
    	call		E_PULSE				; valide la commande plusieurs fois 
    	call		Temp40ms
    	call		E_PULSE
    	call		Temp40ms
    	call		E_PULSE
    
    	movlw	0x0f
    	andwf	LCD_DATA,f			; efface emplacement donnée
    	movlw	0x20					; initialisation LCD en mode *4-bits*
    	iorwf	LCD_DATA,f			; envoi quartet au LCD
    	call		E_PULSE				; valide la commande
    	call		Temp41µs
    	call		Temp40ms
    
    	
    	movlw	0x20					; mode *4-bits* au LCD, 1 ligne, caractère 5*8
    	call		SEND_Data				; routine d'envoi de donnée par mode 4-bits (maintenant utilisable, car LCD en mode 4-bits)
    	call		Temp41µs
    	call		Temp40ms
    
    	movlw	0x08					; affichage *ON*, curseur *ON*, clignotement du curseur *ON*
    	call		SEND_Data
    	call		Temp41µs
    	call		Temp40ms
    
    	movlw	0x18					; déplacement du *curseur* vers la *droite*
    	call		SEND_Data
    	call		Temp41µs
    	call		Temp40ms
    	
    	movlw	0x01					; effacement du LCD
    	call 		SEND_Data				
    	call		Temp1640µs
    	call		Temp40ms
    	
    	return
    
    		;- - - - - - - - - - - - - - - - - - -;
    		;       SOUS-ROUTINES       ;
    		;- - - - - - - - - - - - - - - - - - -;
    		
    E_PULSE:
    	nop							; est-ce nécessaire ? à tester
    	nop
    	bsf		E
    	nop							; tempo de 0.5µs (supérieur à 450ns)
    	nop
    	nop
    	bcf		E
    	nop
    	nop
    	return	
    
    SEND_Data:
    	movwf	Char					; stocke caractère de W à Char pour traitement
    	call		Temp1640µs
    	call		Temp1640µs
    	call		Temp1640µs
    	
    	movlw	0x0f					
    	andwf	LCD_DATA,f			; efface emplacement donnée (nécessaire car utilisation d'un 'ior' après)
    	movf	Char,w
    	andlw	0xF0					; masque quartet faible
    	iorwf	LCD_DATA,f			; envoi quartet au LCD (sans toucher au sorties utilisées par d'autres éventuels périphériques)
    	call		E_PULSE				; valide la (demi) donnée
    	
    	movlw	0x0f
    	andwf	LCD_DATA,f			; efface emplacement donnée
    	swapf	Char,w				; inverse les quartets
    	andlw	0xF0					; masque quartet fort (précédemment inversé avec le faible, donc toujours même masque)
    	iorwf	LCD_DATA,f			; envoi quartet au LCD
    	call		E_PULSE				; valide la (demi) donnée
    	return
    		
    Temp41µs:						; tempo de 164 cycles
    	movlw	d'53'					; nb cycles = 3*var + 5
    	movwf	temp1
    loop:
    	decfsz	temp1,f
    	goto		loop	
    	return	
    		
    Temp1640µs:						; tempo de 6685 cycles (idéal = 6560)
    	movlw	d'40'					; nb cycles = var(164+3) + 5 ; (le call est déjà compté dans le 164 cycles)
    	movwf	temp2
    loop1:
    	call		Temp41µs
    	decfsz	temp2,f
    	goto		loop1
    	return
    
    Temp40ms:
    	movlw	d'24'
    	movwf	temp3
    loop2:
    	call		Temp1640µs
    	decfsz	temp3,f
    	goto		loop2
    	return
    
    	END 							; directive fin de programme
    Je vous remercie d'avance,
    GearsGL

    -----

  2. #2
    GearsGL

    Re : Problème Initialisation LCD GDM1601C

    Up
    PS : J'ai volontairement rajouter des temporisations en guise de test après chaque envoi de commande. Je ne vois vraiment pas d'où le problème pourrait venir, un petit coup de main serait très appréciable.
    J'ai essayé mainte et mainte façon de savoir d'où le problème venait, je n'ai rien trouvé. Peut-être une mauvaise configuration des pins du PIC ? J'aurais besoin d'un coup de main pour confirmer que tout les registres nécessaires au bon fonctionnement du PIC sont tous configurés de la bonne manière. Quoi qu'il en soit, j'ai essayé de changer un peu partout de place les commandes RS et E, mais en vain. L'horloge du pic est une horloge interne, normalement cadencés à 4Mhz. (les tempos sont normalement bonnes car testées avec l'allumage d'un témoin (led rouge)).
    L'initialisation du pic jusqu'à son effacement est-il sencé effacer la moitié de ligne grisée par défaut sur l'afficheur ?

    Merci beaucoup pour vos futures réponses,
    GearsGL

  3. #3
    GearsGL

    Re : Problème Initialisation LCD GDM1601C

    EDIT : J'ai essayé avec la méthode BusyFlag, en ajoutant la sortie R_W selon la même méthode décrite ici (http://meteosat.pessac.free.fr/Cd_el...Pic/cramer.zip), et le busyflag demeure toujours à 1 après l'envoi de 3x la commande FunctionSet "8bits" = 0x30.

Discussions similaires

  1. Problème initialisation Lcd + Pic 16F877
    Par polkii dans le forum Électronique
    Réponses: 8
    Dernier message: 30/03/2010, 22h53
  2. Initialisation LCD (KS0073)
    Par _Flo_ dans le forum Électronique
    Réponses: 2
    Dernier message: 12/09/2009, 10h42
  3. Initialisation LCD Bit Enable ???
    Par invited72f7053 dans le forum Électronique
    Réponses: 3
    Dernier message: 20/07/2006, 10h17
  4. Initialisation d'un LCD
    Par Toufinet dans le forum Électronique
    Réponses: 12
    Dernier message: 24/05/2006, 20h30
  5. problème initialisation radiateur
    Par invitece50d5be dans le forum Dépannage
    Réponses: 0
    Dernier message: 31/12/2005, 11h34
Découvrez nos comparatifs produits sur l'informatique et les technologies.