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
Lcd 16x2 i2c
Moderatore:
Paolino
8 messaggi
• Pagina 1 di 1
0
voti
[2] Re: Lcd 16x2 i2c
Ciao
Inventor, comunque il PCF8574 non è un "controller", si tratta di un "Remote 8-bit I/O expander for I2C-bus".
Se 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
tieni presente che il pin 4 (PCF8574) è il meno significativo, mentre il pin 12 (PCF8574) è il più significativo.Inventor ha scritto:Il problema è che non riesco a capire l'ordine dei bit nel byte che devo inviare in i2c.
Se spedisci la variabile
- Codice: Seleziona tutto
char controllo;
- Codice: Seleziona tutto
0x01
- Codice: Seleziona tutto
b'00000001'
- Codice: Seleziona tutto
controllo=0x01;
- Codice: Seleziona tutto
movlw b'00000011'
movwf controllo
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.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8989
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
[3] Re: Lcd 16x2 i2c
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
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
1
voti
[4] Re: Lcd 16x2 i2c
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 ?
iii) per quale motivo all'interno della funzione
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
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
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
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.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8989
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
[5] Re: Lcd 16x2 i2c
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) 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) ogni byte che inivio devo sempre verificare il bit ack?
iv)spero che ora sia più chiaro il codice
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)supponendo che abbia fatto tutto come si deve il clock dell'i2c è di 100kHz
vii)la routine mdel effettua un ritardo che non ho letto da nessuna parte
. E' di circa 6 us.
allego il nuovo codice, sperando di risolvere qualcosa. Grazie per la tua pazienza
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
. 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
0
voti
[6] Re: Lcd 16x2 i2c
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.
Saluti
concorderai sul fatto che non è certo sufficiente per verificare il corretto funzionamento.Inventor ha scritto:i)ho avuto modo di vedere all'università (10 minuti)(...)
corretto, però ti sei confuso(ma in questa risposta), lo shift è a sinistra.Inventor ha scritto:ii) lo shift a destra lo faccio perché so che nell'i2c (...)
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:iii) ogni byte che inivio devo sempre verificare il bit ack?
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:iv)spero che ora sia più chiaro il codice
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:v)l'ordine di invio dei byte segue lo schema (...)
avrei dovuto specificarlo ma mi riferisco al clock applicato al microcontrollore.Inventor ha scritto:vi)supponendo che abbia fatto tutto come si deve il clock dell'i2c è di 100kHz
lo accertiamo quando rispondi alla (vi).Inventor ha scritto:vii)la routine mdel (...)
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8989
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
[7] Re: Lcd 16x2 i2c
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)
0
voti
[8] Re: Lcd 16x2 i2c
no, ri-leggi il datasheet del PCF8574 (pag.7), e se qualcosa non è comprensibile chiedi ancora.Inventor ha scritto:ogni byte che spedisco deve essere sempre preceduto dal byte di indirizzo dello slave più R/W ?
no, faccio riferimento sempre al datasheet del PCF8574.Inventor ha scritto:Sei riuscito a trovare il datasheet di quel modulo i2c? io no!
... tornerò sulla questione.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)
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8989
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
8 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 10 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
