Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

pic16f690 e display 2x8

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] pic16f690 e display 2x8

Messaggioda Foto Utentematteo92 » 11 ago 2012, 18:37

Buonasera, il mio problema almeno in apparenza è molto semplice: non riesco a gestire un display 2x8. Penso sia un problema software (inizializzazione) visto che il display rimane per metà spento e l'altra metà acceso. Purtroppo dopo numerosi tentativi sono arrivato ad un punto morto, non so più dove sbattere la testa. Vi sarei molto grato se qualcuno riuscisse a capire dove sbaglio o almeno a darmi qualche dritta.
Lo schema elettrico è il seguente:

Immagine.jpg
Immagine.jpg (114.21 KiB) Osservato 1594 volte


Sono solo un po perplesso sulla numerazione dei piedini del display, ma allego anche il suo schema:

20111014123627.jpg
20111014123627.jpg (167.17 KiB) Osservato 1594 volte


Se può servire sono riuscito a recuperare il datasheet del controller che comunque è compatibile con lo standard hitachi (HD44780) https://docs.google.com/open?id=0B7cdFHs0n1-NTmJvYVd1ZTVyZzg

Dimenticavo la cosa più importante, il codice:

Codice: Seleziona tutto
PROCESSOR       16f690
                RADIX           HEX
                INCLUDE         "P16F690.INC"
                __CONFIG      0x3FFF


;Linee di controllo dell'LCD

LCD_RS          equ     RC0       ;Register Select
LCD_E           equ     RC1       ;Lcd Enable

;LCD data line bus

LCD_DB4         equ     RC2       ;LCD data line DB4
LCD_DB5         equ     RC3       ;LCD data line DB5
LCD_DB6         equ     RC4     ;LCD data line DB6
LCD_DB7         equ     RC5     ;LCD data line DB7


SET_EN           MACRO
                bsf  PORTA,LCD_E
                 ENDM

CLEAR_EN         MACRO
                bcf  PORTA,LCD_E
                 ENDM

EN_STROBE            MACRO
                SET_EN
                nop
                CLEAR_EN
                 ENDM




            ;Alloca nella memoria registri lo spazio per le variabili utilizzate dal programma

tmpLcdRegister   equ   h'7F'
   d1   equ   h'20'
   d2   equ   h'21'
   d3   equ    h'22'
   d4   equ   h'23'
   d5   equ   h'24'

ORG 0x00
goto start

;----------------------------------------------
            ;routine
delay
         ;9993 cycles
   movlw   0xCE
   movwf   d1
   movlw   0x08
   movwf   d2
delay_0
   decfsz   d1, f
   goto   $+2
   decfsz   d2, f
   goto   delay_0

         ;3 cycles
   goto   $+1
   nop

         ;4 cycles (including call)
   return
;--------------------------------------------------

;--------------------------------------------------

delayy
         ;4999993 cycles
   movlw   0x2C
   movwf   d3
   movlw   0xE7
   movwf   d4
   movlw   0x0B
   movwf   d5
delayy_0
   decfsz   d3, f
   goto   $+2
   decfsz   d4, f
   goto   $+2
   decfsz   d5, f
   goto   delayy_0

         ;3 cycles
   goto   $+1
   nop

         ;4 cycles (including call)
   return
;---------------------------------------------------
                ;Inizio programma

         
start
                bsf     STATUS,RP0      ;Seleziona il banco di registri 1

            movlw   b'00000000'       ;Configura le linee della porta C
                movwf   TRISC

                bcf     STATUS,RP0      ;Seleziona il banco di registri 0
               
            ;Inizializza il display LCD

                call    LcdInit

                ;Posiziona il cursore dell'LCD in posizione 0,0

                movlw   0x00
                call    LcdLocate

                ;Visualizza "HELLO" sul display LCD

                movlw   'H'
                call    LcdSendData

                movlw   'E'
                call    LcdSendData

                movlw   'L'
                call    LcdSendData

                movlw   'L'
                call    LcdSendData

                movlw   'O'
                call    LcdSendData

                        ;Blocca il programma su se stesso in un loop
                        ;infinito
foreverLoop
            nop

                goto    foreverLoop


;**********************************************************************
; Inizializza il display LCD
; Questa funzione deve essere chiamata prima di ogni altra funzione
; di gestione dell'LCD
;**********************************************************************

LcdInit
                bcf     PORTC,LCD_E     ;Disabilita l'LCD
                bcf     PORTC,LCD_RS    ;Mette l'LCD in modo comando
;---------------------------------
call   delayy
;---------------------------------

                ; Invia all'LCD la sequenza di reset


                bsf     PORTC,LCD_DB4
                bsf     PORTC,LCD_DB5
                bcf     PORTC,LCD_DB6
                bcf     PORTC,LCD_DB7

                EN_STROBE

;----------------------------------------------------------
call   delay
;--------------------------------

                EN_STROBE
;----------------------------------
call   delay
;------------------------------------
                EN_STROBE
;------------------------------------
call   delay
;-----------------------------------
                        ;--------------------------------

                bcf     PORTC,LCD_DB4
                bsf     PORTC,LCD_DB5
                bcf     PORTC,LCD_DB6
                bcf     PORTC,LCD_DB7

                EN_STROBE
;--------------------------------
call   delay
;-------------------------------
                ;Configura il bus dati a 4 bit

                movlw   0x28
                ;movlw   0x2C
                call    LcdSendCommand

                ;Entry mode set, increment, no shift

                movlw   0x06
                ;movlw   0x09
                call    LcdSendCommand

                ;Display ON, Curson OFF, Blink OFF

                movlw   0x0C
                ;movlw   0x07
                call    LcdSendCommand

                movlw   0x01
                call    LcdSendCommand

                return


;**********************************************************************
; Clear LCD
;**********************************************************************

LcdClear
                movlw   0x01
                call    LcdSendCommand
;-----------------------------
call delay
;------------------------------

                ;DD RAM address set 1st digit

                movlw   0x80
                call    LcdSendCommand

                return

;**********************************************************************
; Locate cursor on LCD
; W = D7-D4 row, D3-D0 col
;**********************************************************************

LcdLocate
                movwf   tmpLcdRegister+0

                movlw   0x80
                movwf   tmpLcdRegister+1

                movf    tmpLcdRegister+0,W
                andlw   0x0F
                iorwf   tmpLcdRegister+1,F

                btfsc   tmpLcdRegister+0,4
                bsf     tmpLcdRegister+1,6

                movf    tmpLcdRegister+1,W
                call    LcdSendCommand

                return


;**********************************************************************
; Send a data to LCD
;**********************************************************************

LcdSendData

                bsf     PORTC,LCD_RS
                call    LcdSendByte
                return

;**********************************************************************
; Send a command to LCD
;**********************************************************************

LcdSendCommand
                bcf     PORTC,LCD_RS
                call    LcdSendByte
                return

;**********************************************************************
; Send a byte to LCD by 4 bit data bus
;**********************************************************************

LcdSendByte
                ;Save value to send

                movwf   tmpLcdRegister

                ;Invia i quattro bit piu' significativi

                bcf     PORTC,LCD_DB4
                bcf     PORTC,LCD_DB5
                bcf     PORTC,LCD_DB6
                bcf     PORTC,LCD_DB7

                btfsc   tmpLcdRegister,4
                bsf     PORTC,LCD_DB4
                btfsc   tmpLcdRegister,5
                bsf     PORTC,LCD_DB5
                btfsc   tmpLcdRegister,6
                bsf     PORTC,LCD_DB6
                btfsc   tmpLcdRegister,7
                bsf     PORTC,LCD_DB7

                EN_STROBE
;----------------------------
call delay
;----------------------------

                ;Send lower four bits

                bcf     PORTC,LCD_DB4
                bcf     PORTC,LCD_DB5
                bcf     PORTC,LCD_DB6
                bcf     PORTC,LCD_DB7

                btfsc   tmpLcdRegister,0
                bsf     PORTC,LCD_DB4
                btfsc   tmpLcdRegister,1
                bsf     PORTC,LCD_DB5
                btfsc   tmpLcdRegister,2
                bsf     PORTC,LCD_DB6
                btfsc   tmpLcdRegister,3
                bsf     PORTC,LCD_DB7

                EN_STROBE
;----------------------------
call   delay
;-----------------------------

                END


Per chi vuole scaricarlo per leggerlo meglio metto il link https://docs.google.com/open?id=0B7cdFHs0n1-NR3hnRXZwM1M5MGc

Ringrazio in anticipo tutti coloro vorranno aiutarmi.
Avatar utente
Foto Utentematteo92
71 1 3
New entry
New entry
 
Messaggi: 80
Iscritto il: 21 gen 2010, 18:19

1
voti

[2] Re: pic16f690 e display 2x8

Messaggioda Foto Utenterusty » 11 ago 2012, 19:35

perché setti e azzeri PORTA, LCD_E e non PORTC, LCD_E? PORTA non mi pare collegata a nulla :?

Codice: Seleziona tutto
SET_EN           MACRO
                bsf  PORTA,LCD_E
                 ENDM

CLEAR_EN         MACRO
                bcf  PORTA,LCD_E
                 ENDM
Avatar utente
Foto Utenterusty
4.077 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

0
voti

[3] Re: pic16f690 e display 2x8

Messaggioda Foto Utentematteo92 » 11 ago 2012, 20:33

Grazie mille, ho corretto l'errore. Purtroppo però non è cambiato nulla; deve esserci qualcos'altro che non quadra.
Avatar utente
Foto Utentematteo92
71 1 3
New entry
New entry
 
Messaggi: 80
Iscritto il: 21 gen 2010, 18:19

2
voti

[4] Re: pic16f690 e display 2x8

Messaggioda Foto UtentePaolino » 18 ago 2012, 16:54

Non ho letto tutto il codice, ma mi permeto di darti un piccolo suggerimento. Prova a dare un'occhiata a questo articolo ed a quest'altro. Spero ti possano servire come guida. Anche se gli esempi sono in C (ah, puoi usare SDCC anche con PIC16F690), puoi comunque verificare se il metodo che hai seguito torna.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,0k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4193
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[5] Re: pic16f690 e display 2x8

Messaggioda Foto Utentematteo92 » 19 ago 2012, 19:27

Grazie per le risposte.
Avevo già fatto tesoro della guida prima di cimentarmi in questo lavoro.
Avatar utente
Foto Utentematteo92
71 1 3
New entry
New entry
 
Messaggi: 80
Iscritto il: 21 gen 2010, 18:19

0
voti

[6] Re: pic16f690 e display 2x8

Messaggioda Foto Utenteelmorokk » 1 set 2012, 20:41

levami una curiosità, ma alimenti tutto assieme???
Quando fornisci alimentazione al PIC, la fornisci istantaneamente anche al dispaly????
perché secondo me non hai rispettato le tempistiche di inizializzazione, e neppure i comandi di inizializzazione stessa, prova a rivedere pagina 12 del datasheet che hai fornito...
Avatar utente
Foto Utenteelmorokk
0 1
 
Messaggi: 9
Iscritto il: 1 set 2012, 19:27


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti