BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   visualizzatore seriale su lcd (https://www.baronerosso.it/forum/circuiti-elettronici/16543-visualizzatore-seriale-su-lcd.html)

aduri 14 dicembre 05 20:29

Grazie a tutti mi siete stati molto utili.
Sono riuscito a mandare con successo la mia prima stringa da terminale
creando (come da voi consigliato) un vettore inviato poi in un secondo tempo all'lcd.
Effettivamente nel sito del compilatore c'e' molto materiale.

Per quello che riguarda Picclite ne ho sentito parlare molto bene anche della versione free e fino ad ora quello che ho fatto mi e' andato a buon fine.
Per usare il 16f628 con picclite in un forum ho visto questo messaggio:

All you need to do is to copy the 627 info in the pic.ini file into a new
section then change just the header to 628. Then you will be able to
select and program.

MSchiepp 14 dicembre 05 23:35

Citazione:

Originalmente inviato da aduri
All you need to do is to copy the 627 ...

Questo ti permette di creare un finto 628 che avrà le stesse limitazioni del 627 con l'unico vantaggio di poterlo dichiarare come un 628...

Se vuoi provare il PicLite ti passo il file di configurazione del 628... vero!!

Ciao,

Michele

sub53 16 dicembre 05 00:28

Citazione:

Originalmente inviato da aduri
Grazie a tutti mi siete stati molto utili.
Sono riuscito a mandare con successo la mia prima stringa da terminale
creando (come da voi consigliato) un vettore inviato poi in un secondo tempo all'lcd.
Effettivamente nel sito del compilatore c'e' molto materiale.

Per quello che riguarda Picclite ne ho sentito parlare molto bene anche della versione free e fino ad ora quello che ho fatto mi e' andato a buon fine.
Per usare il 16f628 con picclite in un forum ho visto questo messaggio:

All you need to do is to copy the 627 info in the pic.ini file into a new
section then change just the header to 628. Then you will be able to
select and program.



Per la mia esperienza il miglior compilatore è il Picbasicpro PBP, unico difetto è il costo elevato.
Se sei interessato ai GPS ti consiglio un ottimo simulatore, Nema Talker

http://www.sailsoft.nl/

Praticamente trasmette le stringhe Nmea che vuoi ed è totalmente configurabile.

Ciao,
Sub53

protomax 16 dicembre 05 00:46

Citazione:

Originalmente inviato da aduri
Grazie a tutti mi siete stati molto utili.
Sono riuscito a mandare con successo la mia prima stringa da terminale
creando (come da voi consigliato) un vettore inviato poi in un secondo tempo all'lcd.

Bene cosi'! Procedere piccoli passi ma continui testando i vari moduli senza mettere troppo e tutto insieme e' utile per capire e modificare il codice a seconda delle esigenze e dei problemi che ci si pongono di fronte

:wink: Ottimo lavoro

aduri 17 dicembre 05 19:10

Qualcuno sa' come utilizzare il debugger di Mikrobasic per dare a USART_DATA_ready =1 (attiva) in quanto anche selezionando add all non appare tra le variabili (sempre che sia considerata tale). :)
x MSchiepp se mi mandi il file del 628a per picclite mi fai una cortesia.:P
Io il gps ce l'ho gia e l'ho comprato in una fiera ma non ha visualizzatore
ed ha solo la seriale per poter essere collegato ad un portatile.
E' per questo motivo che volevo fare un visualizzatore lcd per l'ora UTC e latitudine + longitudine

MSchiepp 18 dicembre 05 11:03

Citazione:

Originalmente inviato da aduri
Qualcuno sa' come utilizzare il debugger di Mikrobasic...

Devi aggiungere nella finestra di watch il registro PIR1 e quindi assegnargli il valore 0x20 per settare il bit RCIF e simulare l'arrivo di un carattere; per simulare anche la ricezione devi caricare nel registro RCREG il valore del carattere del quale vuoi simulare la lettura.
Se mi mandi il tuo indirizzo e-mail ti mando i file per il compilatore C.

Ciao,
Michele

aduri 18 dicembre 05 19:47

Ti ringrazio stasera provero'.
Il mio indirizzo e' antonio.durighello£fastwebnet.it
sostituisci la £ con la chiocciola

aduri 18 dicembre 05 23:34

Ho fatto la simulazione e purtroppo ho notato dove e' l'arcano ma non riesco a risolverlo.
Il codice come e' adesso funziona se simulo via seriale solo una delle 6
stringhe che il mio gps spedisce e piu' precisamente la stringa $GPGGA, ora UTC, latitudine, N/S, longitudine , E/W , ......
Quindi funziona la prima parte dove avviene il riconoscimento della virgola (separatore campi) e dopo non funziona la parte di riconoscimento della stringa $GPGGA quindi lui legge qualunque stringa sbagliando la decodifica.

Qualcuno piu' esperto di me mi puo' dare una mano.

Ho commentato per quanto e' possibile il codice.

Nella prima parte ho customizzato i pins dell'lcd per liberare i pins della usart del pic.

Allego il listato:

program GPS
dim rxIndex as byte
dim rxDone as byte
dim rxGPSData as byte
dim rxDataGarbage as byte
dim conta as byte
dim GP as char[10]
dim sincro as char[7]
dim UTC as char[10]
dim Latitudine as char[10]
dim Longitudine as char[10]
'dim Altitudine as char[4]
dim NS as char[1]
dim EW as char[1]
'dim SatNum as char[4]
dim Ora as char[10]
dim NSLatitudine as char[11]
dim EWLongitudine as char[12]

'Questa e' la successione di stringhe del mio GPS
'$GPGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*00
'$GPGSV,3,1,09,01,30,312,00,02,24,112,00,04,28,063 ,00,05,77,128,00*73
'$GPGSV,3,2,09,06,15,209,00,14,38,269,00,20,10,000 ,00,25,13,309,00*77
'$GPGSV,3,3,09,30,58,254,00,,,,,,,,,,,,*4D
'$GPGGA,204620.999,4530.6671,N,00916.9484,E,0,00,5 0.0,101.9,M,,,,0000*32
'$GPRMC,204620.999,V,4530.6671,N,00916.9484,E,0.0, 0.0,250805,0.0,W*63

'Io analizzo solo la stringa
'$GPGGA,204620.999,4530.6671,N,00916.9484,E,0,00,5 0.0,101.9,M,,,,0000*32
' ora UTC lat N/S long E/W


main:
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
'VRCON = 7 ' I need to do that because I'm using the PORTA for lcd output
'CMCON = 7 ' same as above
USART_init(4800)
'Lcd_Config(PORTA,2,3,0,7,6,1,4)
Lcd_Cmd(LCD_CLEAR)
Lcd_Cmd(LCD_CURSOR_OFF)
lcd_out (1,1,"Attesa...")
inizio:
Ora = " "
GP = " "
sincro = " "
rem NSLatitudine = " "
rem EWLongitudine = " "
rem Altitudine = " "
rem SatNum = " "

if USART_Data_Ready=1 then
rxDataGarbage = USART_Read
end if
rxDone = 0
rxIndex = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
GP[rxIndex] = rxGPSData ' Nmea 183 sentence $GPGGA
if (rxGPSData=44) then ',
if (GP[0]=36) and (GP[1]=71) then '$ and G
if (GP[2]=80) and (GP[3]=71) then 'P and G
if (GP[4]=71) and (GP[5]=65) then 'G and A
rxDone = 1
else
goto inizio
end if
end if
end if
end if
inc(rxIndex)
end if
wend

rxIndex = 0
rxdone = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
UTC[rxIndex] = rxGPSData ' UTC (ora)
if (rxGPSData=44) then
rxdone=1
end if
inc(rxIndex)
end if
wend
rxIndex = 0
rxdone = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
Latitudine[rxIndex] = rxGPSData ' Latitudine
if (rxGPSData=44) then
rxdone = 1
end if
inc(rxIndex)
end if
wend
rxIndex = 0
rxdone = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
NS[rxIndex] = rxGPSData ' Nord o Sud
if (rxGPSData=44) then
rxdone = 1
end if
inc(rxIndex)
end if
wend
rxIndex = 0
rxdone = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
Longitudine[rxIndex] = rxGPSData ' Longitudine
if (rxGPSData=44) then
rxdone = 1
end if
inc(rxIndex)
end if
wend
rxIndex = 0
rxdone = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
EW[rxIndex] = rxGPSData ' Est o Ovest
if (rxGPSData=44) then
rxdone = 1
end if
inc(rxIndex)
end if
wend
for conta = 1 to 2
rxIndex = 0
rxdone = 0
'while rxDone=0
'if USART_Data_Ready=1 then
' rxGPSData = USART_Read
' SatNum[rxIndex] = rxGPSData ' Numero di Satelliti
' if (rxGPSData=44) then
' rxdone = 1
' end if
' inc(rxIndex)
' end if
'wend
next conta
'esempio stringa
' $GPGGA,204620.999,4530.6671,N,00916.9484,E,0,00,50 .0,101.9,M,,,,0000*32
' Crea l'array ora
ora[0] = UTC[0] 'ore "20"
ora[1] = UTC[1]
ora[2] = ":"
ora[3] = UTC[2] 'minuti "46"
ora[4] = UTC[3]
ora[5] = ":"
ora[6] = UTC[4] 'secondi "20"
ora[7] = UTC[5]
' Crea l'array NSLatitudine
NSLatitudine[0] = Latitudine[0] ' gradi
NSLatitudine[1] = Latitudine[1] ' gradi
NSLatitudine[2] = "'" ' apice
NSLatitudine[3] = Latitudine[2] ' primi
NSLatitudine[4] = Latitudine[3] ' primi
NSLatitudine[5] = Latitudine[4] ' punto per decimali
NSLatitudine[6] = Latitudine[5] 'decimali
NSLatitudine[7] = Latitudine[6] 'decimali
NSLatitudine[8] = Latitudine[7] 'decimali
NSLatitudine[9] = Latitudine[8] 'decimali
NSLatitudine[10] = " "
NSLatitudine[11] = NS[0] 'nord/sud
' Crea l'array EWLongitudine
EWLongitudine[0] = Longitudine[0] ' gradi
EWLongitudine[1] = Longitudine[1]
EWLongitudine[2] = Longitudine[2]
EWLongitudine[3] = "'"
EWLongitudine[4] = Longitudine[3] ' primi
EWLongitudine[5] = Longitudine[4]
EWLongitudine[6] = Longitudine[5]
EWLongitudine[7] = Longitudine[6]
EWLongitudine[8] = Longitudine[7]
EWLongitudine[9] = Longitudine[8]
EWLongitudine[10] = Longitudine[9]
EWLongitudine[11] = " "
EWLongitudine[12] = EW[0]

lcd_out(1,1,"UTC: ")
lcd_out(1,6,ora)
delay_ms(3000)
lcd_cmd( LCD_CLEAR) ' send command to LCD "clear display"
'delay_ms(1500)
'lcd_out(1,1,"Lat: ")
'delay_ms(3000)
lcd_out(1,6,NSLatitudine)
'delay_ms(3000)
lcd_out(1,18," ") '7 spazi vuoti x pulire
'delay_ms(3000)
lcd_out(2,1," ") '24 spazi vuoti x pulire
'delay_ms(4000)
'lcd_cmd( LCD_CLEAR) ' send command to LCD "clear display"
'lcd_out(2,1,"Lon: ")
'delay_ms(3000)
lcd_out(1,1," ")
'delay_ms(3000)
lcd_out(1,1,"Lat: ")
'delay_ms(3000)
lcd_out(2,1,"Lon: ")
'delay_ms(3000)
lcd_out(2,6,EWLongitudine)
'delay_ms(3000)
lcd_out(2,19," ") ' spazi vuoti x pulire
'delay_ms(3000)
lcd_out(1,1," ")
'delay_ms(3000)
lcd_out(1,1,"Lat: ")
'delay_ms(5000)
'lcd_cmd( LCD_CLEAR) ' send command to LCD "clear display"
rem lcd_out(2,9,"Alt:")
rem lcd_out(2,14,Altitudine)
goto inizio
end.



Nell'ultima parte sono dovuto andare a tentativi per pulire il mio lcd (2x24)perche' rimanevano dei caratteri dove non doveva esserci nulla non sono riuscito a capire lo standar di Mikrobasic per gli lcd da quante righe e colonne e' e se si puo' settare in qualche modo.

protomax 19 dicembre 05 16:12

Citazione:

Originalmente inviato da aduri

rxDone = 0
rxIndex = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
GP[rxIndex] = rxGPSData ' Nmea 183 sentence $GPGGA
if (rxGPSData=44) then ',
if (GP[0]=36) and (GP[1]=71) then '$ and G
if (GP[2]=80) and (GP[3]=71) then 'P and G
if (GP[4]=71) and (GP[5]=65) then 'G and A
rxDone = 1
else
goto inizio
end if
end if
end if
end if
inc(rxIndex)
end if
wend

Il problema e' qui! in pratica la stringa $GPGGA deve "cadere" proprio giusta nelle posizioni della variabile e cioe' il carattere $ al primo posto e gli altri di seguito..... fai invece cosi' cerca il solo carattere $ con lo stesso sistema e poi sai che di seguito avrai sempre GPxxx....... ecc.... il carattere dollaro $ e' fatto apposta per trovare il punto di partenza della stringa :wink: :wink: :wink:

A volte bisogna semplificarsi la vita :D

aduri 19 dicembre 05 20:00

Da come ho capito tu mi consiglieresti di fare un check sul $ anziche' la virgola (divisore campi), creare il vettore e poi analizzarlo all'interno dei cicli (come sotto) o al di fuori?

Tipo.....


rxDone = 0
rxIndex = 0
while rxDone=0
if USART_Data_Ready=1 then
rxGPSData = USART_Read
GP[rxIndex] = rxGPSData ' Nmea 183 sentence $GPGGA
if (rxGPSData="$") then ',
if (GP[1]="G") and (GP[2]="P") then 'G and P
if (GP[3]="G") and (GP[4]="G") then 'G and G
if (GP[5]="A") and (GP[6]=",") then ' A and ,
rxDone = 1
else
goto inizio
end if
end if
end if
end if
inc(rxIndex)
end if
wend

Lo provero'


Tutti gli orari sono GMT +2. Adesso sono le 05:51.

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