Vai al contenuto
PLC Forum


Hd 44780 Capriccioso


papamaik

Messaggi consigliati

salve a tutti

ho realizzato per la mia imbarcazione un circuito che con un pic 16f876 controlla le funzioni del motore: gasolio, giri, temperatura e li visualizza su un display 16x2.

non è la prima volta che utilizzo questi componenti per usi disparati, ma questa volta il display si comporta in modo strano, infatti all'accensione a volte va bene altre attiva tutti i pixel della prima riga e nientaltro.

ho reistallato il sw,; ho cambiato il display, ma tutto come prima

qualcuno mi può aiutare?

Link al commento
Condividi su altri siti


Di solito quando vedi solo la prima riga con "i quadrati pieni" è un problema di inizializazzione se a volte va a volte no potrebbe essere causato dalle temporizzazioni nella procedura dei comandi iniziali.

(Ho escluso flat di collegamento lunghi posizionamento particolare dove potrebbero esserci disturbi ecc..)

Link al commento
Condividi su altri siti

Confermo qunato scritto da accacca, a suo tempo ci ho perso parecchio tempo per venirne a capo.

Mi faceva impazzire perchè se facevo girare il programma tramite ICD era tutto perfetto, non appena lo facevo girare in free running iniziavano i problemi. Mi ha messo sulla strada giusta il fatto che quando il processore lavora con l'ICD è rallentato.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

vi ringrazio per l'attenzione

Il programma in pic basic è, almeno per la parte interessata, il copia incolla di altre applicazioni peraltro funzionanti

se può servire allego il listato:

'* : Recepisce i dati di serbatoio,temperatura motore,
'* : pressione olio, contagiri e li visualizza su display
'* : se salpancora attivo visualizza metri catena *
'****************************************************************
include "modedefs.bas"
define osc 4
'DEFINIZIONE PARAMETRI LCD
Define LCD_DREG PORTB
Define LCD_DBIT 0 'I dati sui primi 4 bit della porta B
Define LCD_BITS 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 4 'RB4 = RS
Define LCD_EREG PORTB
Define LCD_EBIT 5 'RB5 = E
Define LCD_LINES 2 'Display 16x2
Define LCD_COMMANDUS 2000
Define LCD_DATAUS 50
'DEFINIZIONE PARAMETRI ANALOGICI
Define ADC_BITS 8 ' 8 bit di definizione porta analogica
Define ADC_CLOCK 1 ' Set clock source (3=rc)(verificare)
Define ADC_SAMPLEUS 1 ' Set sampling time in uS (sostituire 1 con 50)
'DEFINIZIONE PORTE I/O
TRISA = %11111111 ' Set portA tutti Inputs
TRISB = %00000000 ' Set portB
TRISC = %11111000 ' Set portC
ADCON1 = %00000010 ' Set portA come Analogica
'ASSEGNAZIONE I/O
Pickup var portc.1 ' Input da sensore giri motore ( a massa)
Beep var portc.2 ' Output cicalino allarme
SalpOn var portc.3 ' Input salpancora acceso
GoUp var portc.4 ' Input comando a salpare
Reed var portc.5 ' Input sensore conteggio catena
'ASSEGNAZIONE VARIABILI
RPM var word 'Sensore Contagiri
GAS VAR byte 'Sensore Livello Gasolio
GASO VAR Byte 'Livello Gasolio
TEM VAR byte 'Sensore Temperatura Motore
TEMP VAR BYTE 'Temperatura Motore
PRS var byte 'Sensore pressione olio
PRESS VAR BYTE 'Pressione olio
metri VAR BYTE ' mem metri salpancora
alm var bit ' memoria allarme
conta var byte ' conteggio reed
mem var bit ' mem fronte di salita reed
soglGAS var byte ' mem soglia min livello gasolio
soglTEM var byte ' mem soglia MAX temperatura motore
soglPRS var byte ' mem soglia min pressione olio
'********************** P R O G R A M M A *******************
mem=0
metri=0
'read 0,metri
alm=0
beep=1
pause 300 ' all'avvio il cicalino si attiva
Lcdout $fe, 1 'SCHERMATA INIZIALE
lcdout $fe, $80+2," CHECK " 'Scrivi primo rigo
pause 500
lcdout $fe, $c0+2," AVVIAMENTO" 'Scrivi secondo rigo
pause 3000
beep=0 ' dopo 4 sec. spegne il beep e toglie la videata iniziale
conta =0
ciclo:
if SalpOn then 'se salpancora NON attivo
ADCIN 0, GAS 'mette il valore di AN0 in GAS (gasolio)
ADCIN 1, TEM 'mette il valore di AN1 in TEM (temperatura)
ADCIN 2, PRS 'mette il valore di AN2 in PRS (pressione)
'decodifica gli impulsi dell'alternatore per RpM
count pickup,2000,RPM 'Legge gli impulsi in 1 sec e li mette in rpm
RPM=RPM/40+1 'trasforma gli impulsi in giri/min
if RPM <5 then RPM=0 ' a motore spento (<500giri) visualizzerà 0 RpM
'decodifica valori per Gasolio
if gas >185 AND NOT ALM then
gaso=20
gosub allarme
else
if gas <=185 and gas >177 then gaso =30
if gas <=177 and gas >170 then gaso =35
if gas <=170 and gas >158 then gaso =40
if gas <=158 and gas >145 then gaso =45
if gas <=145 and gas >135 then gaso =50
if gas <=135 and gas >120 then gaso =55
if gas <=120 and gas >116 then gaso =60
if gas <=116 and gas >100 then gaso =65
if gas <=100 and gas >90 then gaso =70
if gas <=90 and gas >70 then gaso =75
if gas <=70 and gas >50 then gaso =80
if gas <=50 and gas >33 then gaso =85
if gas =<33 then gaso=90
Lcdout $fe, 1 ' Pulisci schermo
lcdout $fe, $80+1,"GASOLIO ",#GASO," Lt."' Scrivi primo rigo
pause 500
lcdout $fe, $c0+1,#RPM,"00 Giri/min." 'Scrivi secondo rigo
pause 2500
'decodifica valori di temperatura
' Lcdout $fe, 1 ' Pulisci schermo
' lcdout $fe, $80+1,"TEMP. ",#TEMP," ^C" ' Scrivi primo rigo
' lcdout $fe, $c0+1,#RPM,"00 Giri/min." 'Scrivi secondo rigo
' pause 2500
'decodifica valori di pressione
' Lcdout $fe, 1 ' Pulisci schermo
' lcdout $fe, $80+1,"PRESS. ",#PRESS," BAR" ' Scrivi primo rigo
' lcdout $fe, $c0+1,#RPM,"00 Giri/min." 'Scrivi secondo rigo
' pause 500
endif
else 'ALTRIMENTI PASSA AL CICLO DEL SALPANCORA
if not reed and not mem then
mem=1
conta = conta+1
else
if reed and mem then
mem=0
endif
endif
if GoUp then 'se non è attiva la salita
if conta >2 then
metri = metri +1
conta=0
'write 0,metri
endif 'ogni tre impulsi incrementa di 1 mt
else 'se non attiva la salita
if conta >2 then
metri = metri -1
conta=0 'ogni tre impulsi decrementa di 1 mt
if metri<3 then
metri=0
'write 0,metri
endif
endif
endif
Lcdout $fe, 1 'Pulisci schermo
lcdout $fe, $80+1,"CATENA ANCORA " 'Scrivi primo rigo
pause 500
lcdout $fe, $c0+3, #METRI," metri" 'Scrivi secondo rigo
pause 500
endif
Goto Ciclo
allarme:
beep=1
pause 8000
beep=0
alm=1
return
Link al commento
Condividi su altri siti

...arrivo tardi....

Io non conosco pic di basic ho qualche ricordo e non posso essere di molto aiuto

guardando il tuo codice non trovo la procedura che ti abbiamo segnalato (o almeno io non riesco a vederla) quella che inizializza il display.

Se c'è già ti chiedo scusa in anticipo se non c'è puoi aggiungerla e aggiungere il codice dove chiami questa procedura

forse utilizzi una libreria pronta per gestire lcd ?

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...