Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 11 dicembre 05, 17:25   #1 (permalink)  Top
User
 
Data registr.: 04-06-2005
Residenza: Genova
Messaggi: 46
visualizzatore seriale su lcd

Spero di non essero OT eventualmente chiedo scusa.

Ho trovato questo compilatore basic interessante (Mikrobasic) ed ho provato a tirare giu un terminale seriale su lcd.

Il problema e' questo:
ho preso gli esempi dell'help che riguardano la ricezione e la trasmissione della usart con pic16f628a + max232 ed e' andato tutto a buon fine;
ho preso poi l'esempio della visualizzazione su lcd anche questo OK.

Ho provato a metterli insieme per fare un terminalino seriale su lcd allego dunque il mikrolistato:

program lcd_serial
main:

dim received_byte as byte
Lcd_Init(PORT ' initialize LCD connected to portb
lcd_cmd( LCD_CLEAR) ' send command to LCD "clear display"
lcd_cmd( LCD_CURSOR_OFF) ' send command cursor off
lcd_out(1,1,"data") ' print txt to LCD, 1nd row, 1st column
Usart_Init(4800) ' Initialize USART module
while true
if Usart_Data_Ready = 1 then ' If data is received
received_byte = Usart_Read ' Read received data
' Usart_Write(received_byte) ' Send data via USART
lcd_out(2,1,Usart_Read) ' print gps data to LCD, 2nd row, 1st column
end if
wend

end.

A questi punti mi appare "data" sulla prima riga fin qua tutto ok ma quando mando una stringa dal tool usart terminal di mikrobasic mi scrive un serie di caratteri strani sulla prima riga (anziche' la seconda) subito dopo la scritta data.
Cortesemente qualcuno mi puo' dire dove sbaglio
E' la prima volta che programmo con questo SW ma gari e' una banalita'.

P.S. Ho provato anche a sostituire la variabile Usart_Read con received_byte (per essere sicuri del contenuto del buffer seriale) ma ottengo una sfilza di caratteri indecifrabili e partono sempre dalla riga 1.
Ho notato che se mando un solo carattere qualsiasi in un punto dell'LCD appare se ne metto 2 no.
aduri non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 18:38   #2 (permalink)  Top
UserPlus
 
L'avatar di davidea
 
Data registr.: 24-08-2004
Residenza: palermo (pa)
Messaggi: 846
Invia un messaggio via MSN a davidea
partiamo dal concetto che non conosco quel linguaggio, ma ti dico cio' che penso possa essere che non va!, potrei anche dire delle fesserie, quindi prendimi con le pinze!

intanto la routine (tranne che non incrementi in automatico la posizione, dovrebbe scrivere sempre sullo stesso punto 2,1

assumendo che tu hai settato la seriale a 4800, (bit di parita?, quanti bit invia?) e che e' settata correttamente,
il dato che hai in ingresso, e' dello stesso tipo di quello in uscita? ossia, ricevi un char, e mandi un char? o ricevi un dato magari in due byte, e lo mandi come unico byte e quindi la routine impazzisce?
perche' non provi a fare un ciclo if, che scriva sull' lcd una stringa nota "carattere ricevuto correttamente" quando riceve un carattere scelto da te?

qualcosa di simile ad

if received_byte = "C" then lcd_out(2,1,"carattere C ricevuto")

in modo da esser sicuro che il carattere venga ricevuto correttamente!
se lo ricevi correttamente, poi puoi provare

if received_byte = "C" then lcd_out(2,1,received_byte)

io non userei la funzione Usart_Read , perche' non so' se e' un buffer, che una volta letto, non contiene piu' niente!
__________________
73 de davidea!!!
davidea non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 18:51   #3 (permalink)  Top
User
 
Data registr.: 04-06-2005
Residenza: Genova
Messaggi: 46
Innanzitutto grazie della risposta.
La prima routine della lettura della seriale l'ho adattata dall'esempio
presente nei samples del compilatore esso trasmetteva al pic una stringa e non un carattere da un terminale tipo hyperterminal di windows ed il pic ritrasmetteva il contenuto del buffer trasferito nella nuova variabile received_byte (cosicche' il rischio di avere il buffer vuoto e' scongiurato)
e tutto funzionava.
Io ho modificato il programma non ritrasmettendo la stringa dal pic al pc
perche' il pin tx usart e' occupato per la gestione dell'lcd e d'altronde mi sembrava inutile.
aduri non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 20:24   #4 (permalink)  Top
User
 
Data registr.: 26-10-2005
Residenza: Modena
Messaggi: 765
ciao' volevo informarti che in rete tale progetto e' gia' vechio di anni, sia con connessione seriale che parallela, e funzia volendo pure su un LCD 16x2.

Tra l'altro il basic o simili nn sono proprio gli ideali x questi scopi.

Ah, un ultima cosa (giusto x le persone che come me non usano sistemi operativi Microsoft): funziona su quasi tutti i sistemi operativi
power83 non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 20:26   #5 (permalink)  Top
UserPlus
 
L'avatar di davidea
 
Data registr.: 24-08-2004
Residenza: palermo (pa)
Messaggi: 846
Invia un messaggio via MSN a davidea
Citazione:
Originalmente inviato da aduri
Innanzitutto grazie della risposta.
.
.
.
.
Io ho modificato il programma non ritrasmettendo la stringa dal pic al pc
perche' il pin tx usart e' occupato per la gestione dell'lcd e d'altronde mi sembrava inutile.
penso che allora il problema sia li!!!

Citazione:
Originalmente inviato da aduri
lcd_out(1,1,"data") ' print txt to LCD, 1nd row, 1st column
Usart_Init(4800) ' Initialize USART module
tu prima scrivi sul display, e la routine di inizializzazione del display va' a buon fine,
poi inizializzi la seriale, e allora il pin che prima usavi per il display viene rimappato alla seriale, e da allora in poi son dolori!!!

per provare, inverti le due righe,
prima inizializza la seriale e poi scrivi data
se e' come penso, non dovresti veder spuntare piu' neanche quello!!
__________________
73 de davidea!!!
davidea non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 21:15   #6 (permalink)  Top
UserPlus
 
L'avatar di davidea
 
Data registr.: 24-08-2004
Residenza: palermo (pa)
Messaggi: 846
Invia un messaggio via MSN a davidea
a proposito, visto che stai usando il 16f628, fai programmazione in circuit o ogni volta lo levi e lo metti nel programmatore?
se fai incircuit, che programmatore usi?
__________________
73 de davidea!!!
davidea non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 22:27   #7 (permalink)  Top
User
 
Data registr.: 04-06-2005
Residenza: Genova
Messaggi: 46
Niente da fare ho provato a fare come hai detto tu ed anche a customizzare i pins per liberare rb2(tx usart) ma fa lo stesso errore.
Nella terminal del pc (che riceve anche lui il dato) tronca la stringa alla terza lettera.

Io uso il programmatore di NE e sposto il pic pero' per non rovinare i piedini
lo piazzo su uno zoccolo cosi' eventualmente si rovinano i terminali dello zoccolo.

Per rispondere all'altro amico io sto esercitandomi per cui cerco di non copiare per quanto possibile ma di prendere spunti.
Comunque non mi dispiacerebbe se mi mandaste qualche link in c o basic.

Allego il file modificato:



program lcd_serial
dim received_byte as byte
main:
' Lcd_Init(PORT ' initialize LCD connected to portb
Lcd_Config(PORTB,0,3,0,7,6,5,4) ' pins custom
lcd_cmd( LCD_CLEAR) ' send command to LCD "clear display"
lcd_cmd( LCD_CURSOR_OFF) ' send command cursor off
lcd_out(1,1,"GPS data") ' print txt to LCD, 1nd row, 1st column
Usart_Init(4800) ' Initialize USART module
while true
if Usart_Data_Ready = 1 then ' If data is received
received_byte = Usart_Read ' Read received data
Usart_Write(received_byte) ' Send data via USART
lcd_out(2,1,"data:") ' print gps data to LCD, 2nd row, 1st column
lcd_out(2,7,received_byte) ' print gps data to LCD, 2nd row, 1st column
end if
wend
end.
aduri non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 23:08   #8 (permalink)  Top
UserPlus
 
L'avatar di davidea
 
Data registr.: 24-08-2004
Residenza: palermo (pa)
Messaggi: 846
Invia un messaggio via MSN a davidea
Citazione:
Originalmente inviato da aduri
Niente da fare ho provato a fare come hai detto tu ed anche a customizzare i pins per liberare rb2(tx usart) ma fa lo stesso errore.
Nella terminal del pc (che riceve anche lui il dato) tronca la stringa alla terza lettera.

.
ceh vuol dire nella terminal del pc??

il dato (da cio' che ho capito proviene da un gps), viene mandato contemporaneamente sia al pic che al pc?
se si' e' strano che ti venga troncata la stringa al 3 carattere, da cio' che ricordo io il gps da' delle stringhe belle linghe!

Citazione:
Originalmente inviato da aduri

Per rispondere all'altro amico io sto esercitandomi per cui cerco di non copiare per quanto possibile ma di prendere spunti.
Comunque non mi dispiacerebbe se mi mandaste qualche link in c o basic.
spiacente, sto tentando di iniziare pure io, in c!

Citazione:
Originalmente inviato da aduri

Allego il file modificato:
program lcd_serial
dim received_byte as byte
main:
' Lcd_Init(PORT ' initialize LCD connected to portb
Lcd_Config(PORTB,0,3,0,7,6,5,4) ' pins custom
lcd_cmd( LCD_CLEAR) ' send command to LCD "clear display"
lcd_cmd( LCD_CURSOR_OFF) ' send command cursor off
lcd_out(1,1,"GPS data") ' print txt to LCD, 1nd row, 1st column
Usart_Init(4800) ' Initialize USART module
while true
if Usart_Data_Ready = 1 then ' If data is received
received_byte = Usart_Read ' Read received data
Usart_Write(received_byte) ' Send data via USART
lcd_out(2,1,"data:") ' print gps data to LCD, 2nd row, 1st column
lcd_out(2,7,received_byte) ' print gps data to LCD, 2nd row, 1st column
end if
wend
end.
ti ricordo che non conosco il linguaggio:

prima inizializzi l' lcd e poi configuri i pin? non dovrebbe essere al contrario?
nella configurazione ripeti 2 volte il valore 0....

io ho scaricato e installato picclite della hitech, e ho dato una lettura al manuale (350 pagine)
ma ancora non ho iniziato a provare niente, anche perche' dai comandi che ho visto nel manuale, ci sono solo funzioni matematiche.... non ho trovato niente per la lettura delle porte, continuero' a cercare....
sono ancora fortemente tentato di abbandonare i pic per passare ad atmega...

MICHELE??? ci sei , se ci sei batti un colpo!!!!!
__________________
73 de davidea!!!
davidea non è collegato   Rispondi citando
Vecchio 11 dicembre 05, 23:47   #9 (permalink)  Top
User
 
Data registr.: 04-06-2005
Residenza: Genova
Messaggi: 46
C'e' l'apice prima dell'inizializzazione quindi quella riga e' diventata un commento pero' mi sono accorto di una bestialita'.
Mi ha portato fuori strada il fatto che il terminale su pc visualizzava una stringa
ma sul lcd devo creare un buffer ad es. con un ciclo for/next perche' la seriale trasmette carattere per carattere cosi' ho fatto questo nuovo listato ma accetta solo 3 caratteri che vengono visualizzati in successione appena dopo il data (nella posiz 7 della seconda riga) e il cursore si posiziona dopo il "data" continuo a non capire.
allego il listato:
program lcd_serial

dim received_byte as byte
dim i as byte

main:

' Lcd_Init(PORT ' initialize LCD connected to portb
Lcd_Config(PORTB,0,3,1,7,6,5,4) ' pins custom
lcd_cmd( LCD_CLEAR) ' send command to LCD "clear display"
' lcd_cmd( LCD_CURSOR_OFF) ' send command cursor off
lcd_out(1,1,"GPS data") ' print txt to LCD, 1nd row, 1st column

Usart_Init(4800) ' Initialize USART module
while true

if Usart_Data_Ready = 1 then ' If data is received
received_byte = Usart_Read ' Read received data

Usart_Write(received_byte) ' Send data via USART

lcd_out(2,1,"data:") ' print gps data to LCD, 2nd row, 1st column

for i=0 to 10 'buffer
lcd_out(2,(7+i),received_byte) ' print gps data to LCD, 2nd row, 1st column
' lcd_cmd(LCD_CURSOR_ON) ' send command cursor on
Lcd_Cmd(Lcd_Move_Cursor_Right)
i=i+1
next i
end if
wend

end.


Se vuoi un bel tutorial c per pic vai sul sito di Fiser (http://www.jofi.it/fiser/page1.html
aduri non è collegato   Rispondi citando
Vecchio 12 dicembre 05, 01:09   #10 (permalink)  Top
UserPlus
 
L'avatar di protomax
 
Data registr.: 21-02-2005
Residenza: TURIN 45N 7E
Messaggi: 1.951
Invia un messaggio via MSN a protomax
Penso che il problema della perdita di caratteri sia dovuto al fatto che la lettura seriale (e' lenta) rispetto all'arrivo dei caratteri sulla stessa.

come vedo dal listato la lettura della seriale e' un "polling" sul byte che scarica un carattere dalla seriale, ora bisogna vedere se il compilatore e la routine che la gestisce fa' buffering sulla rs232, la soluzione piu' giusta sarebbe usare un'interrupt o meglio vedere se per ogni byte rx sulla seriale si ha a disposizione un evento (inserendo il codice all'interno di quell'evento e' possibile far si che non si abbia piu' la perdita di caratteri)

Altra soluzione e' quella di evitare di scrivere i caratteri mentre arrivano ma di incamerarli in un vettore e poi mandarli in stampa sul display tutti in una volta.
Nos so che tipo di gps sia ma in genere le stringhe che inviano possono essere lunghe una 30ina di caratteri e + oltretutto arrivano a raffica almeno 1 al secondo per la stringa di localizzazione

Quindi il pic deve far veloce a leggere e scrivere sul display
__________________
C'e' chi vola con l'elettronica e chi fa volare l'elettronica ... entrambi volano.
________________________________________________
ProtoMax proudly present: ProtoMeter 2
32bit ARM core + ZigBee Radio all in one Telemetry system
... Next on this forum

Ultima modifica di protomax : 12 dicembre 05 alle ore 01:14
protomax non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
Visualizzatore file dxf dwg filter Aeromodellismo Progettazione e Costruzione 4 12 giugno 06 11:54
Interfaccia seriale -> notebook senza porta seriale francyflyer Simulatori 4 10 marzo 06 17:48
Visualizzatore peppesci Simulatori 5 11 febbraio 05 09:25



Tutti gli orari sono GMT +2. Adesso sono le 11:49.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002