Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Lcd 16x2 i2c

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Lcd 16x2 i2c

Messaggioda Foto UtenteInventor » 22 mar 2015, 2:23

ciao ragazzi, sto cercando di portare avanti un progettino con pic16f887 per una tesina universitaria. La tesina consiste nel visualizzare su display lcd 16x2 la temperatura acquisita da un sensore. Il linguaggio da utilizzare è l'assembly. E' da un po di giorni che dopo aver letto il datasheet del controllore HD44780U e datasheet del PIC non riesco propio a configurare il display. Quest'ultimo connesso ad un modulino che utilizza il controller PCF8574T.
Il problema è che non riesco a capire l'ordine dei bit nel byte che devo inviare in i2c. perché se non sbaglio devo avere questa sequenza: 0 RS R/W E DB7 DB6 DB5 DB4 per il primo nibble e 0 RS R/W E DB3 DB2 DB1 DB0 per il secondo nibble.
Però non sono sicuro, specialmente della posizione dell'enable. Qualcuno che ci ha lavorato può aiutarmi? Grazie
Avatar utente
Foto UtenteInventor
45 1 5
Frequentatore
Frequentatore
 
Messaggi: 164
Iscritto il: 22 feb 2009, 13:28

0
voti

[2] Re: Lcd 16x2 i2c

Messaggioda Foto UtenteWALTERmwp » 22 mar 2015, 3:55

Ciao Foto UtenteInventor, comunque il PCF8574 non è un "controller", si tratta di un "Remote 8-bit I/O expander for I2C-bus".
Inventor ha scritto:Il problema è che non riesco a capire l'ordine dei bit nel byte che devo inviare in i2c.
tieni presente che il pin 4 (PCF8574) è il meno significativo, mentre il pin 12 (PCF8574) è il più significativo.

Se spedisci la variabile
Codice: Seleziona tutto
char controllo;
il bit meno significativo corrisponde a
Codice: Seleziona tutto
0x01
o, se preferisci
Codice: Seleziona tutto
b'00000001'
quindi, con l'assegnazione
Codice: Seleziona tutto
controllo=0x01;
o
Codice: Seleziona tutto
movlw   b'00000011'
movwf   controllo
metti a "1" la prima uscita quando spedisci la variabile.
Questo è l'ordine che devi rispettare e mettere in relazione al collegamento che hai realizzato tra le uscite del PCF8574 e gli ingressi del HD44780U.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8989
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[3] Re: Lcd 16x2 i2c

Messaggioda Foto UtenteInventor » 22 mar 2015, 11:09

Grazie della risposta. Ho provato come dici tu ha seguire l'ordine dei bit; per come dici tu allora il byte dovrebbe essere DB7 DB6 DB5 DB4 X E R/W RS per il primo nibble e di conseguenza anche il secondo nibble.
Premetto che l'interfaccia i2c per il display è una di quelle complete:
http://www.dx.com/p/lcd1602-adapter-board-w-iic-i2c-interface-black-works-with-official-arduino-boards-216865#.VQ6E5OEYErU
Però di fatto anche così a me non funziona.
Posto il codice così spero si capisca meglio. Credo di aver configurato tutto bene però magari mi sbaglio

Codice: Seleziona tutto
list      p=16f887        ; direttiva che definisce il tipo di processore
        #include   "p16f887.inc"   ; file che contiene le definizioni dei simboli

    __CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _BOR_OFF & _PWRTE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF


TMR0_PERIOD            equ      (.256 - .39)  ; we use tmr0 to generate a periodic interrupt every 10 ms
DISP_ADDR            equ      0x27

        udata
i2cAddr         res      .1





RST_VECTOR   CODE   0x0000
         pagesel   start   ; imposta la pagina della memoria di programma in
                            ; cui si trova l'indirizzo della label start per non ricadere nelle prime 4 locazioni
         goto   start   ; salta all'indirizzo indicato dalla label start

;*******************************************************************************
; Programma principale                                                         |
; La direttiva CODE dichiara una sezione di codice da allocare in ROM.         |
; Non viene specificato un indirizzo esplicito, il linker successivamente      |
; assegnerà un indirizzo assoluto di inizio per la sezione (codice rilocabile) |
;*******************************************************************************

MAIN      CODE

start

        pagesel delay
        call delay

       bcf      STATUS, RP1
      bsf      STATUS, RP0     ;bank 1
;------------------------------------------------------------------------------
      bsf      TRISC, 3
      bsf      TRISC, 4
        bcf     TRISA, 7
      clrf   SSPSTAT
      movlw   0x9
      movwf   SSPADD
;------------------------------------------------------------------------------
      bcf      STATUS, RP0     ;bank0
      movlw   0x38
      movwf   SSPCON

START_IIC
      bcf      PIR1, SSPIF         ; beginning of transaction
      bsf      STATUS, RP0     ;bank1 -------------------------------------
      bsf      SSPCON2, SEN      ; initiate start
      bcf      STATUS, RP0     ;bank0 -------------------------------------
      call   WAIT

      movlw DISP_ADDR
        banksel i2cAddr
        movwf i2cAddr
      bcf STATUS, C
      rlf i2cAddr, w ;con rlf il bit di carry (0--> operazione di scrittura) va al primo posto di i2cAddr
        pagesel SEND_W_ON_IIC
      call   SEND_W_ON_IIC
      bsf      STATUS, RP0     ;bank1 -------------------------------------
      btfsc   SSPCON2, ACKSTAT   ;ACK received from slave? if yes skip
      goto    NO_ACK            ;if no, end transaction
      bcf      STATUS, RP0     ;bank0 -------------------------------------

        pagesel SendI2C
      call SendI2C

;next   goto    next

;------------------------------------------------------------------------------
      bsf      STATUS, RP0     ;already at bank1 --------------------------
NO_ACK   bsf      SSPCON2, PEN      ;initiate STOP
      bcf      STATUS, RP0     ;bank0 -------------------------------------
      call   WAIT
      goto   START_IIC            ;try again...

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

SEND_W_ON_IIC
      movwf   SSPBUF            ;begin transmission
WAIT   btfss   PIR1, SSPIF         ;send completed? if Yes skip next
      goto   WAIT
      bcf      PIR1, SSPIF         ;yes, clear flag
      return

;configurazione iniziale richiesta da dasheet
SendI2C
    movlw   B'00110100';Set 8 bit operation R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel delay
    call delay
   movlw   B'00110000'   ; Set 8 bit operation R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC

     movlw   B'00110100';Set 8 bit operation R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel delay
    call delay
   movlw   B'00110000'   ;Set 8 bit operation R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC

     movlw   B'00110100';Set 8 bit operation R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel delay
    call delay
   movlw   B'00110000'   ;Set 8 bit operation R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC



;--------------------Set to 4 bit operation -----------------------------------
;SendI2C
   movlw   B'00100100';0010 Set 4 bit operation R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw   B'00100000'   ;0010 Set 4 bit operation R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC

;--------------------Function set 1st nibble---------------------------------
   movlw  B'00100100'   ;0010 Function set 1st nibble R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00100000'   ;0010 Function set 1st nibble R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
;--------------------Function set 2nd nibble---------------------------------
   movlw B'10000100'   ;1000 Function set 1st nibble R/S =0 E=1 -->011000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'10000100'   ;1000 Function set 1st nibble R/S =0 E=0 -->001000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel

;off

   ;1st nibble---------------------------------
   movlw  B'00000100'   ;0010 Function set 1st nibble R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00000000'   ;0010 Function set 1st nibble R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
    ;2nd nibble---------------------------------
   movlw B'10000100'   ;1000 Function set 1st nibble R/S =0 E=1 -->011000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'10000000'   ;1000 Function set 1st nibble R/S =0 E=0 -->001000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel

;clear

   ;1st nibble---------------------------------
   movlw  B'00000100'   ;0010 Function set 1st nibble R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00000000'   ;0010 Function set 1st nibble R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
    ;2nd nibble---------------------------------
   movlw B'00010100'   ;1000 Function set 1st nibble R/S =0 E=1 -->011000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00010000'   ;1000 Function set 1st nibble R/S =0 E=0 -->001000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel


;entrymode

   ;1st nibble---------------------------------
   movlw  B'00000100'   ;0010 Function set 1st nibble R/S =0 E=1 -->010010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00000000'   ;0010 Function set 1st nibble R/S =0 E=0 -->000010
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
    ;2nd nibble---------------------------------
   movlw B'01110100'   ;1000 Function set 1st nibble R/S =0 E=1 -->011000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'01110100'   ;1000 Function set 1st nibble R/S =0 E=0 -->001000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel






;--------------------Display ON, Cursor On, Cursor Blinking 1st nibble-----
   movlw B'00000100'   ;0000 Display ON, Cursor On, Cursor Blinking R/S =0 E=1 -->010000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00000000'   ;0000 Display ON, Cursor On, Cursor Blinking R/S =0 E=0 -->000000
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel

;--------------------Display ON, Cursor On, Cursor Blinking 2nd nibble-----
   movlw B'11110100'   ;1111 Display ON, Cursor On, Cursor Blinking R/S =0 E=1 -->011111
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'11110000'   ;1111 Display ON, Cursor On, Cursor Blinking R/S =0 E=0 -->001111
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel




mdel   ;routine di ritardo
loop4   movlw      0x5
      movwf      0x22
      decfsz      0x23,1
      goto       loop4
      
      return



delay    ;routine di ritardo di 10 ms per tempi di attesa display
        movlw TMR0_PERIOD
      banksel TMR0
      movwf TMR0
        bcf INTCON,2    ;azzera flag overflow
cicla
        btfss   INTCON,T0IF   ;testa se bit TOIF ha generato overflow (Settato a 1)
      goto cicla
        bcf   INTCON,T0IF   ;azzera bit TOIF (flag owerflow) per prossimo conteggio

      return
    end

Avatar utente
Foto UtenteInventor
45 1 5
Frequentatore
Frequentatore
 
Messaggi: 164
Iscritto il: 22 feb 2009, 13:28

1
voti

[4] Re: Lcd 16x2 i2c

Messaggioda Foto UtenteWALTERmwp » 23 mar 2015, 2:02

Ho dato un'occhiata allo "Adapter Board" che utilizzi, al datasheet del PC8574 e ho letto il codice che hai inserito; presupponendo che qualcosa possa essermi sfuggito sarebbe utile che tu fornissi indicazioni in merito a quanto segue così, magari, mi dai una mano ad inquadrare meglio la situazione:

i) di questo codice, o di una parte di esso, hai già avuto modo di verificarne la funzionalità ?

ii) per quale motivo inserisci lo "shift" sul valore dell'indirizzo ?
Codice: Seleziona tutto
rlf i2cAddr, w

iii) per quale motivo all'interno della funzione
Codice: Seleziona tutto
call SendI2C
non viene verificata la presenza del bit di acknowledge che lo slave deve inviare (almeno così mi sembra) ?

iv) dai commenti riportati non mi appare evidente la posizione e l'ordine che avresti associato alle uscite; mi riferisco quindi a quanto riportato negli statement con il trasferimento della costante espressa in bit(s) come ad esempio
Codice: Seleziona tutto
movlw    B'00110100'   ;Set 8 bit operation R/S =0 E=1 -->010010

v) per quanto riguarda i byte(s) inviati tramite i2c al modulo LCD, all'interno della routine "SendI2C", quale funzione, ognuno di essi, rispettando l'ordine sequenziale, dovrebbero assolvere ?

vi) qual è il clock che stai utilizzando ?

vii) la routine di ritardo "mdel" a quale tempo dovrebbe corrispondere secondo i tuoi calcoli ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8989
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[5] Re: Lcd 16x2 i2c

Messaggioda Foto UtenteInventor » 23 mar 2015, 15:13

allora, ho riletto e modificato un po di codice e commenti: effettivamente a volte cambio il codice ma non i commenti, quindi risulta difficile capirci qualcosa. Rispondo alle tue domande così vediamo di capirci meglio:

i)ho avuto modo di vedere all'università (10 minuti) con l'oscilloscopio che effettivamente riesco a spedire il primo byte: quello dell'indirizzo e l'ack del nono bit

ii) per quale motivo inserisci lo "shift" sul valore dell'indirizzo ?

ii) lo shift a destra lo faccio perché so che nell'i2c il primo bit del primo byte corrisponde a R/W, pertanto uno 0 simboleggia un write da parte del PIC. Sbaglio?

iii) per quale motivo all'interno della funzione
Codice: Seleziona tutto
call SendI2C

non viene verificata la presenza del bit di acknowledge che lo slave deve inviare (almeno così mi sembra) ?

iii) ogni byte che inivio devo sempre verificare il bit ack?

iv) dai commenti riportati non mi appare evidente la posizione e l'ordine che avresti associato alle uscite; mi riferisco quindi a quanto riportato negli statement con il trasferimento della costante espressa in bit(s)

iv)spero che ora sia più chiaro il codice

v) per quanto riguarda i byte(s) inviati tramite i2c al modulo LCD, all'interno della routine "SendI2C", quale funzione, ognuno di essi, rispettando l'ordine sequenziale, dovrebbero assolvere ?

v)l'ordine di invio dei byte segue lo schema citato dal datasheet del controller HD44780, pag 46.
E il fatto di commutare ogni volta la linea dell'enebale lo intuita sempre da quel datasheet, sbaglio?

vi) qual è il clock che stai utilizzando ?

vi)supponendo che abbia fatto tutto come si deve il clock dell'i2c è di 100kHz

vii) la routine di ritardo "mdel" a quale tempo dovrebbe corrispondere secondo i tuoi calcoli ?

vii)la routine mdel effettua un ritardo che non ho letto da nessuna parte #-o . E' di circa 6 us.

allego il nuovo codice, sperando di risolvere qualcosa. Grazie per la tua pazienza

Codice: Seleziona tutto
list      p=16f887        ; direttiva che definisce il tipo di processore
        #include   "p16f887.inc"   ; file che contiene le definizioni dei simboli

;************************************************************************
; Configuration bits                                                    |
; I bit di configurazione (impostazioni dell'hardware settate in fase    |
; di programmazione del dispostitivo).                                  |
; sono definiti tramite una direttiva nel codice.                      |
; Impostazioni importanti:                                              |
; - Clock interno   (di default 4MHz; fist=1MHz-->T=1us)                |
; - Wathcdog timer disattivato (_WDT_OFF).                              |
;************************************************************************

    __CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _BOR_OFF & _PWRTE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

;****************************************
; Definizioni costanti                  |
;****************************************


TMR0_PERIOD            equ      (.256 - .39)  ; we use tmr0 to generate a periodic interrupt every 10 ms
DISP_ADDR            equ      0x27          ;indirizzo del modulo slave i2c

;****************************************************************************************
; La direttiva UDATA (uninitialized data) dichiara una sezione di dati da allocare in   |
; RAM, in un qualunque banco. In questo modo si possono avere strutture di dimensioni   |
; maggiori (la RAM condivisa tra i banchi e'solo di 16 byte), con lo svantaggio di dover|
; settare il banco prima di ogni accesso. Anche in questo caso il codice è rilocabile.   |
; Dichiarando due sezion i con label diverse, il linker può posizionarle                |
; in due banchi diversi.                                                               |
; NOTA: i valori a 16 bit sono memorizzati in formato Little Endian                     |
;****************************************************************************************


        udata
i2cAddr         res      .1    ;riservo un byte per indirizzo per indirizzo slave

;*******************************************************************************
; Vettore di reset                                                             |
; Il vettore di reset contiene l'istruzione che viene eseguita per prima dopo  |
; un reset del microcontrollore. La direttiva CODE dichiara una sezione di     |
; codice da allocarein ROM. Viene specificato esplicitamente l'indirizzo 0000, |
; in quanto il  vettore di reset deve trovarsi in questa posizione             |
;(codice non rilocabile).La label non è necessaria, ma è utilizzata            |
; per chiarezza del codice.                                                    |
;*******************************************************************************


RST_VECTOR   CODE   0x0000
         pagesel   start   ; imposta la pagina della memoria di programma in
                            ; cui si trova l'indirizzo della label start per non ricadere nelle prime 4 locazioni
         goto   start   ; salta all'indirizzo indicato dalla label start

;*******************************************************************************
; Programma principale                                                         |
; La direttiva CODE dichiara una sezione di codice da allocare in ROM.         |
; Non viene specificato un indirizzo esplicito, il linker successivamente      |
; assegnerà un indirizzo assoluto di inizio per la sezione (codice rilocabile) |
;*******************************************************************************

MAIN      CODE

start

        banksel TRISC
      bsf      TRISC, 3      ;bit 3 e 4 del portc com input per i2c
      bsf      TRISC, 4
        bcf     TRISA, 7      ;spi_ss (se impostato a zero seleziono i2c)
      clrf   SSPSTAT
      movlw   .9            ;clock 100kHz (di default il clock del PIC è 4 MHz)
      movwf   SSPADD
;------------------------------------------------------------------------------
      banksel SSPCON
      movlw   B'00101000'          ;module enabled, I2C master: Fosc/(4 *(SSPADD+1))
      movwf   SSPCON

START_IIC
         bcf      PIR1, SSPIF         ; reset interrupt flag
      banksel SSPCON2
      bsf      SSPCON2, SEN      ; initiate start
      btfsc   SSPCON2, SEN        ;aspetto che SEN vada a 0: start condition terminata
      goto    $-1

      movlw DISP_ADDR
        banksel i2cAddr
        movwf i2cAddr
      bcf STATUS, C
      rlf i2cAddr, w ;con rlf il bit di carry (0--> operazione di scrittura) va al primo posto di i2cAddr
        pagesel SEND_W_ON_IIC
      call   SEND_W_ON_IIC
      banksel SSPCON2
      btfsc   SSPCON2, ACKSTAT   ;ACK received from slave? if yes skip
      goto    NO_ACK            ;if no, end transaction

        pagesel SendI2C
      call SendI2C


;------------------------------------------------------------------------------
      banksel SSPCON2
NO_ACK   bsf      SSPCON2, PEN      ;initiate STOP
      banksel WAIT
      call   WAIT
      goto   START_IIC            ;try again...

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

SEND_W_ON_IIC
      movwf   SSPBUF            ;begin transmission
WAIT   btfss   PIR1, SSPIF         ;send completed? if Yes skip next
      goto   WAIT
      bcf      PIR1, SSPIF         ;yes, clear flag
      return

;configurazione iniziale richiesta da dasheet
SendI2C
    movlw   B'00100011';Set 8 bit operation R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel delay
    call delay
   movlw   B'00000011'   ;Set 8 bit operation R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC


     movlw   B'00100011';Set 8 bit operation R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel delay
    call delay
   movlw   B'00000011'   ;Set 8 bit operation R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC


     movlw   B'00100011';Set 8 bit operation R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel delay
    call delay
   movlw   B'00000011'   ;Set 8 bit operation R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC



;--------------------Set to 4 bit operation -----------------------------------
;SendI2C
   movlw   B'00100010';0010 Set 4 bit operation R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw   B'00000010'   ;0010 Set 4 bit operation R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC

;--------------------Function set 1st nibble---------------------------------
   movlw  B'00100010'   ;0010 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00000010'   ;0010 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
;--------------------Function set 2nd nibble---------------------------------
   movlw B'00101000'   ;1000 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00001000'   ;1000 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel

;off

   ;1st nibble---------------------------------
   movlw  B'00100000'   ;0010 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00000000'   ;0010 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
    ;2nd nibble---------------------------------
   movlw B'00101000'   ;1000 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00001000'   ;1000 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel

;clear

   ;1st nibble---------------------------------
   movlw  B'00100000'   ;0010 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00000000'   ;0010 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
    ;2nd nibble---------------------------------
   movlw B'00101001'   ;1000 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00001001'   ;1000 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel


;entrymode

   ;1st nibble---------------------------------
   movlw  B'00100000'   ;0010 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw  B'00000000'   ;0010 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
    ;2nd nibble---------------------------------
   movlw B'00100111'   ;1000 Function set 1st nibble R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00000111'   ;1000 Function set 1st nibble R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel






;--------------------Display ON, Cursor On, Cursor Blinking 1st nibble-----
   movlw B'00100000'   ;0000 Display ON, Cursor On, Cursor Blinking R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00000000'   ;0000 Display ON, Cursor On, Cursor Blinking R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel

;--------------------Display ON, Cursor On, Cursor Blinking 2nd nibble-----
   movlw B'00101111'   ;1111 Display ON, Cursor On, Cursor Blinking R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00001111'   ;1111 Display ON, Cursor On, Cursor Blinking R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
;--------------------Entry Mode, Increment cursor position, No display shift 1st nibble-----
   movlw B'00100000'   ;0000 Entry Mode, Increment cursor position, No display shift R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00000000'   ;0000 Entry Mode, Increment cursor position, No display shift R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
;--------------------Entry Mode, Increment cursor position, No display shift 2nd nibble-----
   movlw B'00100110'   ;0110 Entry Mode, Increment cursor position, No display shift R/S =0 E=1
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'00000110'   ;0110 Entry Mode, Increment cursor position, No display shift R/S =0 E=0
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
;----------------------------------------------------------------------------------------



;--------------------H 1st nibble-------------------------------------------------------
;   movlw 0x14   ;0100 'H' R/S =0 E=1 -->010100
;   call   SEND_W_ON_IIC
;   movlw 0x34   ;0100 'H' R/S =1 E=1 -->110100
;   call   SEND_W_ON_IIC
;   movlw 0x24   ;0100 'H' R/S =1 E=0 -->100100
;   call   SEND_W_ON_IIC

;--------------------H 2nd nibble-------------------------------------------------------
;   movlw 0x18   ;1000 'H' R/S =1 E=0 -->101000
;   call   SEND_W_ON_IIC
;   movlw 0x38   ;1000 'H' R/S =1 E=1 -->111000
;   call   SEND_W_ON_IIC
;   movlw 0x28   ;1000 'H' R/S =1 E=0 -->101000
;   call   SEND_W_ON_IIC

;----------------------------------------------------------------------------------------
;---------------------------------------S------------------------------------------------
;--------------------S 1st nibble--------------------------------------
loop
   movlw B'00100101'
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'01100101'
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'01000101'
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
;--------------------2nd nibble----------------------------------------
   movlw B'00100011'
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'01100011'
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel
   movlw B'01000011'
    pagesel SEND_W_ON_IIC
   call   SEND_W_ON_IIC
    pagesel mdel
    call mdel



    goto loop

mdel
loop4   movlw      0x5
      movwf      0x22
      decfsz      0x22,1
      goto       loop4

      return



delay    ;routine di ritardo di 10 ms per tempi di attesa display
        movlw TMR0_PERIOD
      banksel TMR0
      movwf TMR0
        bcf INTCON,2    ;azzera flag overflow
cicla
        btfss   INTCON,T0IF   ;testa se bit TOIF ha generato overflow (Settato a 1)
      goto cicla
        bcf   INTCON,T0IF   ;azzera bit TOIF (flag owerflow) per prossimo conteggio

      return
    end
Avatar utente
Foto UtenteInventor
45 1 5
Frequentatore
Frequentatore
 
Messaggi: 164
Iscritto il: 22 feb 2009, 13:28

0
voti

[6] Re: Lcd 16x2 i2c

Messaggioda Foto UtenteWALTERmwp » 24 mar 2015, 2:54

Il codice si capisce per quello che è; se i commenti sono scoordinati sorge il dubbio che il programma possa essere stato scritto, per come lo si legge, in modo non intenzionale.
Inventor ha scritto:i)ho avuto modo di vedere all'università (10 minuti)(...)
concorderai sul fatto che non è certo sufficiente per verificare il corretto funzionamento.
Inventor ha scritto:ii) lo shift a destra lo faccio perché so che nell'i2c (...)
corretto, però ti sei confuso(ma in questa risposta), lo shift è a sinistra.
Inventor ha scritto:iii) ogni byte che inivio devo sempre verificare il bit ack?
si, e ti suggerisco di leggere o di rileggere il datasheet del PCF8574 (pag.8); se poi qualcosa non ti è chiaro chiedi.
Inventor ha scritto:iv)spero che ora sia più chiaro il codice
non ho ancora guardato il codice del Post [5] ma spero tu abbia evidenziato le eventuali aggiunte o variazioni; gli darò un'occhiata.
Inventor ha scritto:v)l'ordine di invio dei byte segue lo schema (...)
forse non sono stato esplicito ma avevo inteso domandarti se mi puoi elencare, per ogni byte che invii nel corso della esecuzione della routine "SendI2C" la funzione associata; può darsi sia più chiaro nel nuovo codice, diversamente te lo richiedo.
Inventor ha scritto:vi)supponendo che abbia fatto tutto come si deve il clock dell'i2c è di 100kHz
avrei dovuto specificarlo ma mi riferisco al clock applicato al microcontrollore.
Inventor ha scritto:vii)la routine mdel (...)
lo accertiamo quando rispondi alla (vi).

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8989
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[7] Re: Lcd 16x2 i2c

Messaggioda Foto UtenteInventor » 24 mar 2015, 10:30

si, e ti suggerisco di leggere o di rileggere il datasheet del PCF8574 (pag.8); se poi qualcosa non ti è chiaro chiedi.

hai ragione, ogni byte devo verificare il bit ack. la cosa che non mi è molto chiara è: ogni byte che spedisco deve essere sempre preceduto dal byte di indirizzo dello slave più R/W ?
avrei dovuto specificarlo ma mi riferisco al clock applicato al microcontrollore.

si scusami, il clock del micro è di default 4MHz e io non lo modificato.

Sei riuscito a trovare il datasheet di quel modulo i2c? io no! mi farebbe molto comodo perché non riesco ancora oggi a capire come dal byte che inivio dal micro lui me lo spedisca al dispaly (lsb e msb)
Avatar utente
Foto UtenteInventor
45 1 5
Frequentatore
Frequentatore
 
Messaggi: 164
Iscritto il: 22 feb 2009, 13:28

0
voti

[8] Re: Lcd 16x2 i2c

Messaggioda Foto UtenteWALTERmwp » 24 mar 2015, 15:58

Inventor ha scritto:ogni byte che spedisco deve essere sempre preceduto dal byte di indirizzo dello slave più R/W ?
no, ri-leggi il datasheet del PCF8574 (pag.7), e se qualcosa non è comprensibile chiedi ancora.
Inventor ha scritto:Sei riuscito a trovare il datasheet di quel modulo i2c? io no!
no, faccio riferimento sempre al datasheet del PCF8574.
Inventor ha scritto:mi farebbe molto comodo perché non riesco ancora oggi a capire come dal byte che inivio dal micro lui me lo spedisca al dispaly (lsb e msb)
... tornerò sulla questione.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8989
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 35 ospiti