Controllo touchscreen tramite PIC

Salve a tutti,sono alle prime armi nella programmazione in C con i pic e ho bisogno di un aiuto. In sostanza ho un monitor lcd touch screen che comunica con un pic

16f876 tramite rs232 e quello che devo fare =E8 interpretare i segnali inviati dal display per capire quale touch field =E8 stato premuto. Ad ogni pressione, il pannello lcd risponde con messaggi del tipo: K [A4] [ACK]........ K [B5] [ACK]......K [C3] [ACK]....ecc,dove K =E8 l'ascii code della lettera 'K', [ACK] =E8 un byte di acknowledge (Hex 06) e l'altro byte, ad esempio [A4] rappresenta la codifica esadecimale del particolare touch field che =E8 stato premuto; =E8 su questo byte che devo lavorare, e a seconda del suo valore dovr=F2 effettuare le azioni opportune....In pratica come faccio ad acquisire questo byte, esistono delle routine apposta? Avete qualche idea o consiglio su come posso procedere?Grazie!
Reply to
stacey84
Loading thread data ...
*Avete qualche idea o consiglio su come posso procedere?Grazie!* intanto devi verificare a che livello di tensione manda fuori i segnali il TS se sono TTL puoi interfacciarti direttamente al PIC... se non lo sono ti serve un driver per traslare i livelli

per le routine di ricezione/trasmissione basta cercare con google e cmq esistono anche dei pic (non ricordo se anche il tuo) con la uart a bordo... il che rende tutto più facile

-ice-

Reply to
ice

ha scritto nel messaggio news: snipped-for-privacy@p77g2000hsh.googlegroups.com... In pratica come faccio ad acquisire questo byte, esistono delle routine apposta? Avete qualche idea o consiglio su come posso procedere?Grazie!

***** Mi pare proprio che il 16f876 abbia la UART . In genere si fa così:

1) si programma correttamente la UART (baud rate, parità, pin di assegnazione, ecc. ecc.)

2) si attiva un interrupt in ricezione (ad ogni byte ricevuto, si scatena l'interrupt) 3) si scrive una apposita routine di interrupt che prende il byte ricevuto e lo attacca ad una stringa 4) fuori dall'interrupt, ovvero, nel main(), si fa una apposita routine di parser, che analizza la stringa e, una volta completa, ne estrae i parametri.

Io uso nella maggioranza dei casi il CCS, ci sono vari esempi su

formatting link
(con la 'c' finale) .

saluti, simone.bern

Reply to
simone.bern

ciao, dove potrei trovare le specifiche del touchscreen che stai usando? grazie

ha scritto nel messaggio news: snipped-for-privacy@p77g2000hsh.googlegroups.com... Salve a tutti,sono alle prime armi nella programmazione in C con i pic e ho bisogno di un aiuto. In sostanza ho un monitor lcd touch screen che comunica con un pic

16f876 tramite rs232 e quello che devo fare è interpretare i segnali inviati dal display per capire quale touch field è stato premuto. Ad ogni pressione, il pannello lcd risponde con messaggi del tipo: K [A4] [ACK]........ K [B5] [ACK]......K [C3] [ACK]....ecc,dove K è l'ascii code della lettera 'K', [ACK] è un byte di acknowledge (Hex 06) e l'altro byte, ad esempio [A4] rappresenta la codifica esadecimale del particolare touch field che è stato premuto; è su questo byte che devo lavorare, e a seconda del suo valore dovrò effettuare le azioni opportune....In pratica come faccio ad acquisire questo byte, esistono delle routine apposta? Avete qualche idea o consiglio su come posso procedere?Grazie!
Reply to
GZ

Il display in questione =E8 un touchscreen della Demmel e il suo data sheet lo trovi qui:

formatting link
Uso il compilatore CCS e non saprei come fare per acquisire il byte che identifica il touch field che =E8 stato premuto...qualche idea?

Reply to
stacey84

ho controllato e il tuo pic ha la uart a bordo... è tutto molto più veloce

- piazzi una #use_rs232 e setti i parametri

- scrivi la ISR che aggancia l'interrupt RDA (received data available)

- attivi gli interrupts a livello globale

- attivi, ovvaimente, l'interrupt #int_rda

quando arriva il dato la ISR scatta e all'interno usi una getc() per leggerlo e conservarlo da qualche parte tipo un array kbd_buffer[] (bufferizzi insomma) poi, sempre dentro la isr, incrementi una variabile globale tipo tot_ch_rx

nel loop del main() controlli tot_ch_rx e quando è maggiore di zero significha che hai ricevuto dei caratteri... per cui se vuoi il primo carattere ricevuto leggi kbd_buffer[0] e poi, ovviamente, devi shiftare tutto l'array a sinistra di 1 posizione (pos1-->pos0, pos2-->po1, pos3-->2, ecc...) e decrementare tot_ch_rx

-ice-

ps: lo fai per una tesi?

Reply to
ice

si =E8 per una tesi.... Ti ringrazio per la tua risposta;credi sia possibile senz usare interrupts? (il programma alla fine non deve far altro che leggere da seriale..) Avrei pensato ad una funzione fgetc() che legge dalla rs232 finch=E8 non trova la lettera 'K' che identifica l'inizio del pacchetto di 3 byte che identificano il touch field premuto. A questo punto resta da identificare il successivo byte, ad esempio [B3], ed =E8 qui che incontro problemi....questo byte rappresenta un valore decimale tra 0 e 255 ,quindi pu=F2 essere un semplice carattere ascii oppure appartenere anche al set dei caratteri ascii estesi (128-255); Utilizzando di nuovo una fgetc() =E8 possibile leggere un byte che rappresenta un carattere non ascii standard? Se ci=F2 fosse possibile si potrebbe memorizzare il suo contenuto in una variabile di tipo unsigned char (che se non sbaglio equivale ad un tipo int) e a questo punto eventualmente effettuare una conversione in esadecimale per verificare la corrispondenza con il byte ricevuto. Qualche suggerimento a riguardo?Grazie!!

Reply to
stacey84

si =E8 per una tesi.... Ti ringrazio per la tua risposta;credi sia possibile senz usare interrupts? (il programma alla fine non deve far altro che leggere da seriale..) Avrei pensato ad una funzione fgetc() che legge dalla rs232 finch=E8 non trova la lettera 'K' che identifica l'inizio del pacchetto di 3 byte che identificano il touch field premuto. A questo punto resta da identificare il successivo byte, ad esempio [B3], ed =E8 qui che incontro problemi....questo byte rappresenta un valore decimale tra 0 e 255 ,quindi pu=F2 essere un semplice carattere ascii oppure appartenere anche al set dei caratteri ascii estesi (128-255); Utilizzando di nuovo una fgetc() =E8 possibile leggere un byte che rappresenta un carattere non ascii standard? Se ci=F2 fosse possibile si potrebbe memorizzare il suo contenuto in una variabile di tipo unsigned char (che se non sbaglio equivale ad un tipo int) e a questo punto eventualmente effettuare una conversione in esadecimale per verificare la corrispondenza con il byte ricevuto. Qualche suggerimento a riguardo?Grazie!!

Reply to
stacey84

ha scritto nel messaggio news: snipped-for-privacy@y5g2000hsa.googlegroups.com...

Qualche suggerimento a riguardo?Grazie!!

********

Sì, eccotelo: leggere i precedenti suggerimenti.

Ci sono paccate di esempi funzionanti, ripeto, basta scaricarli. Se vuoi reinventare la ruota, libero di farlo, ma inutile chiedere suggerimenti su come farla quadrata, ti verrà suggerito sempre di farla rotonda...

simone.bern

Reply to
simone.bern

si puo' fare come non si puo' fare, verifica ATTENTAMENTE che opportunita' mette a disposizione il tuo compilatore C per la gestione delle porte seriali

normalmente si sempre che il tuo compilatore supporti una fgetc connessa alla seriale

fgetc proviene dal mondo dei calcolatori con supporto per i file system che in generale non esistono nelle applicazioni embredded.

molto probabilmente dovresti avere una getc o getchar o una sergetc che fa il lavoro che ti serve

un "unsigned char" e' un unsigned char non un int !

e' invece un tipo 'intero' e il C supporta pienamente l'aritmetica su questi tipi: le 4 operazioni fondamentali, i confronti e le operazioni logiche bit a bit

se dichiaro

unsigned char a;

io posso:

a = 0 ; // assegno ad a il valore zero a = 48; // assegno ad a il valore 48 a = 255; // assegno as a il valore 255 a = 'A'; // assegno ad a il valore corrispondente al // codice ASCII del carattere A ( a maiuscolo ) a = 0xB3; // assegno ad a il valore 179 ( B3 esadecimale // e' pari a 179 in decimale

cose analoghe posso fare con i confronti con constanti e variabili o usando variabili e costanti in espressioni aritmetiche.

>
Reply to
mmm
*Ti ringrazio per la tua risposta;credi sia possibile senz usare interrupts?* si ma introduci dei limiti notevoli...

infatti il main() deve fare polling per vedere quando il bit di start si presenta... se perde questo bit perde il sincronismo sull'intero pacchetto dati (3 bytes da come hai detto) e poi devi tenere conto di questa situazione

come fa a perdere il sincronismo? semplice: l'utente preme sul TS quando il micro sta facendo altre elaborazioni... quindi se vuoi evitare di usare interrupts devi calcolare qual è la frequenza minima di campionamento e poi scrivere routines che abbiano tempi di esecuzioni adeguati... sai calcolare questi tempi?

*Utilizzando di nuovo una fgetc() è possibile leggere un byte che rappresenta un carattere non ascii standard?* un byte è un byte, l'ascii è una codifica... non fare confusione

*punto eventualmente effettuare una conversione in esadecimale per verificare la corrispondenza con il byte ricevuto.* una conversione???

#define TOP_RIGHT 0x0A #define TOR_LEFT 0x0B if (data_rx==TOP_RIGHT) do_something();

*Qualche suggerimento a riguardo?Grazie!!* dipende da quanto tempo hai per fare il lavoro...

ciao!

-ice-

Reply to
ice

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.