Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC E DISPLAY LCD

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[101] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentechristianpalazzolo » 15 feb 2010, 17:49

ciao , volevo sapere se qualcuno potrrebbe consigliarmi un buon libro per la programmazione in C per driverare display usando PIC MICROCHIP.
Vi ringrazio ciao e grazie
Avatar utente
Foto Utentechristianpalazzolo
0 1
 
Messaggi: 3
Iscritto il: 7 apr 2009, 21:38

0
voti

[102] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentedemos81 » 6 set 2011, 22:28

salve! anchio sto provando a scrivere su un display LCD 16x2 con un PIC ma sto programmando in assembler, ho anche postato il listato che purtroppo non funge :( mi ha dato una mano DonJ (anche parecchio) a correggere alcune pecche ma ahimè continua a non funzionare; più rileggo il listato e più non riesco a capire cosa non funzioni. ho rivisto i collegamenti non so più quante volte. Qualcuno l'ha già fatto in assembler per confrontarci?
qualcuno sa se esiste un possibile test sui pin dell'LCD per verificare che non si sia guastata la logica interna o che altro?
grazie
Avatar utente
Foto Utentedemos81
1.479 1 6 8
Expert EY
Expert EY
 
Messaggi: 601
Iscritto il: 16 mar 2009, 20:56

0
voti

[103] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentetunderace » 15 set 2011, 21:19

demos81 ha scritto:salve! anchio sto provando a scrivere su un display LCD 16x2 con un PIC ma sto programmando in assembler, ho anche postato il listato che purtroppo non funge :( mi ha dato una mano DonJ (anche parecchio) a correggere alcune pecche ma ahimè continua a non funzionare; più rileggo il listato e più non riesco a capire cosa non funzioni. ho rivisto i collegamenti non so più quante volte. Qualcuno l'ha già fatto in assembler per confrontarci?
qualcuno sa se esiste un possibile test sui pin dell'LCD per verificare che non si sia guastata la logica interna o che altro?
grazie


Supponendo che tu abbia collegato:
DB7 con PORTB,7
DB6 con PORTB,6
DB5 con PORTB,5
DB4 con PORTB,4
E con PORTB,3
RW con PORTB,2
RS con PORTB,1

Devi per prima cosa programmare la Porta B Chiamando una routine simile:
Codice: Seleziona tutto
prog_port
   global   prog_port
   bsf   STATUS,RP0         ;Programmazione della porta A come uscite
   bcf   STATUS,RP1
   bcf   STATUS,IRP
   movlw   b'10000110'
   movwf   ADCON1
   movlw   b'00111000'
   movwf   TRISA
   movlw   b'00000000'         ;Qui è dove nella mia applicazione programmo         
   movwf   TRISB            ;la porta B come tutte uscite
   movlw   b'10111111'
   movwf   TRISC
   bsf   OPTION_REG,7
   bcf   STATUS,RP0
   return   

Ora prima di entrare nel Main devi inizializzare il display altrimenti non ti scrive nulla o ti scrive con una riga in nero.
Posto la mia routine di inizializzazione:
Codice: Seleziona tutto
reset_iniziale
      global      reset_iniziale
      call      prog_port      ;call che programma le porte
      clrf      time
      call      rit         ;è un ciclo di ritardo che dipende dalla variabile
      call      rit         ;time che se resettata, produce con rit un ritardo di circa 85ms
      call      rit         ;con il quarzo da 20MHz
      call      rit

      movlw      b'00000000'
      movwf      PORTB      ;Inizializzo la porta
      movlw      b'00001000'   ;e mando i comandi per inizializzare il display
      movwf      PORTB      ;per ricevere a 4 bit
      movlw      b'00101000'   ;
      movwf      PORTB
      call      rit
      movlw      b'00100000'   ;
      movwf      PORTB
      call      rit
      movlw      b'00000000'
      movwf      PORTB
      call      rit      


      movlw      b'00001100'   ;Ora che è inizializzato uso la mia routine imposta
      call      imposta      ;che invia il comando al display preventivamente caricato
                  ;in W in questo caso programmo il display senza cursore
                  ;se avessi precaricato W con b'00001110' avrei cursore lampeggiante
                  ;a forma di righetta. Se scrivo b'00001111' avrei cursore rettangolare
                  ;lampeggiante

      movlw      b'00000110'
      call      imposta
      
      movlw      b'00000001'   ;Qui pulisco il display e porto il cursore in alto a sinistra
      call      imposta
      call      rit
      return

Qui di seguito ti posto le routine di ritardo e imposta e scrittura che vedremo in seguito:
Codice: Seleziona tutto
;-------------------------------------------------------------------------------------------------
;               ROUTINE DEL DISPLAY e di RITARDO
;-------------------------------------------------------------------------------------------------
scrittura   
      movwf      lettera
      andlw      b'00000010'
      movwf      PORTB
      call      cip
      movf      lettera,0
      andlw      b'11110000'
      iorlw      b'00001010'
      movwf      PORTB
      call      cip
      bcf      PORTB,3
      call      cip
      movf      lettera,0
      movwf      temp
      rlf      temp
      rlf      temp
      rlf      temp
      rlf      temp
      movf      temp,0
      andlw      b'11110000'
      iorlw      b'00001010'
      movwf      PORTB
      call      cip
      bcf      PORTB,3
      clrf      PORTB
      call      cip
      movf      lettera,0
      return

      
imposta
      movwf      comando
      clrf      PORTB
      call      cip
      movf      comando,0
      andlw      b'11110000'
      iorlw      b'00001000'
      movwf      PORTB
      call      cip
      bcf      PORTB,3
      call      cip
      movf      comando,0
      movwf      temp
      rlf      temp
      rlf      temp
      rlf      temp
      rlf      temp
      movf      temp,0
      andlw      b'11110000'
      iorlw      b'00001000'
      movwf      PORTB
      call      cip
      bcf      PORTB,3
      clrf      PORTB
      call      cip
      movf      comando,0
      return   

rit
      movf      time,0
      movwf      count
rit1      incfsz      count,1
      goto       rit2
      return
rit2      nop
      nop
      call       crit
      goto      rit1

crit
      movlw      h'00'
      movwf      count1
crit1      incfsz      count1,1
      goto       crit2
      return
crit2      nop
      nop
      goto      crit1

cip
      movlw      h'10'
      movwf      count1
cip1      decfsz      count1,1
      goto       cip2
      return
cip2      nop
      nop
      goto      cip1

Le routine di ritardo sono spartane e buttate la senza calcoli. Possono essere modificate a seconda del
quarzo che usi. Io uso 20Mhz su un PIC16F873A.
Funzionano lo stesso anche su quarzi più piccoli solo che le lettere vengono scritte più lentamente.
Un'altra cosa, io uso un display 20x4 ma le cose vanno bene per qualsiasi taglio.

Ora, dopo aver inizializzato il display possiamo scrivere ciò che vogliamo hrazie alla routine scrittura.
Qui sotto un esempio:

Codice: Seleziona tutto
schermo_principale
      global      schermo_principale
      movlw      b'00000001'   ;Cancello tutto e porto
      call      imposta      ;il cursore in home
      call      rit      ;Lancio un ritardo perché l'operazione dura circa 40us
      
      movlw      ' '      ;scrivo uno spazio (0x20)
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      'L'      ;Scrivo L maiuscola
      call      scrittura
      movlw      'a'
      call      scrittura
      movlw      'p'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      'T'
      call      scrittura
      movlw      'i'
      call      scrittura
      movlw      'm'
      call      scrittura
      movlw      'i'
      call      scrittura
      movlw      'n'
      call      scrittura
      movlw      'g'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      'P'
      call      scrittura
      movlw      'l'
      call      scrittura
      movlw      'u'
      call      scrittura
      movlw      's'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      b'11000000' ;Porto il cursore nella seconda riga
      call      imposta
      movlw      '1'
      call      scrittura
      movlw      ')'
      call      scrittura
      movlw      'S'
      call      scrittura
      movlw      't'
      call      scrittura
      movlw      'a'
      call      scrittura
      movlw      'r'
      call      scrittura
      movlw      't'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      's'
      call      scrittura
      movlw      'e'
      call      scrittura
      movlw      's'
      call      scrittura
      movlw      's'
      call      scrittura
      movlw      'i'
      call      scrittura
      movlw      'o'
      call      scrittura
      movlw      'n'
      call      scrittura
      movlw      'e'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      b'10010100' ;Porto il cursore nella terza riga
      call      imposta
      movlw      '2'
      call      scrittura
      movlw      ')'
      call      scrittura
      movlw      'G'
      call      scrittura
      movlw      'e'
      call      scrittura
      movlw      's'
      call      scrittura
      movlw      't'
      call      scrittura
      movlw      'i'
      call      scrittura
      movlw      'o'
      call      scrittura
      movlw      'n'
      call      scrittura
      movlw      'e'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      't'
      call      scrittura
      movlw      'e'
      call      scrittura
      movlw      'm'
      call      scrittura
      movlw      'p'
      call      scrittura
      movlw      'i'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      b'11010100' ;;Porto il cursore nella quarta riga
      call      imposta
      movlw      '3'
      call      scrittura
      movlw      ')'
      call      scrittura
      movlw      'I'
      call      scrittura
      movlw      'm'
      call      scrittura
      movlw      'p'
      call      scrittura
      movlw      'o'
      call      scrittura
      movlw      's'
      call      scrittura
      movlw      't'
      call      scrittura
      movlw      'a'
      call      scrittura
      movlw      'z'
      call      scrittura
      movlw      'i'
      call      scrittura
      movlw      'o'
      call      scrittura
      movlw      'n'
      call      scrittura
      movlw      'i'
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      movlw      ' '
      call      scrittura
      return


Questa routine scrive sul display 40x4
Avatar utente
Foto Utentetunderace
10 1 3
 
Messaggi: 26
Iscritto il: 23 ago 2011, 16:04

0
voti

[104] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentetunderace » 15 set 2011, 21:35

Tentativo di invio foto
[img]file:///C:/Lap%20timing.jpg[/img]
Avatar utente
Foto Utentetunderace
10 1 3
 
Messaggi: 26
Iscritto il: 23 ago 2011, 16:04

0
voti

[105] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentedemos81 » 16 set 2011, 12:42

grazie!! finalmente col weekend senza lavorare mi metterò lì notte e giorno finché non la spunto!!
provo a adattare il tuo listato sul mio esercizio, un ultimo consiglio se ti è possibile..
c'è qualche tutorial o guida molto spartana per l'uso del debugger dell'MPLAb?
Avatar utente
Foto Utentedemos81
1.479 1 6 8
Expert EY
Expert EY
 
Messaggi: 601
Iscritto il: 16 mar 2009, 20:56

0
voti

[106] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentetunderace » 16 set 2011, 12:50

Io ho imparato tutti i segreti (o quasi) da solo e da autodidatta.
Quando hai dubbi sui comandi usa l'help sulla sezione MPASMsuit.
Con un po di pazienza riuscirai a fare di tutto.
Avatar utente
Foto Utentetunderace
10 1 3
 
Messaggi: 26
Iscritto il: 23 ago 2011, 16:04

Precedente

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite