HID Keyboard & Arrays
- Gianni
-
Autore della discussione
- Elit Utente
-
Less
Di più
13 Anni 11 Mesi fa - 13 Anni 11 Mesi fa #1
da Gianni
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
HID Keyboard & Arrays è stato creato da Gianni
Dopo aver, con successo, scritto un programmino che esegue la scansione di una tastiera a matrice e riporta il tasto su un LCD (su PIC16), ora volevo fare la stessa cosa ma usando la EasyUSB e quindi utilizzare un tastierino a matrice su porta USB.
L'esempio USB Device - HID - Keyboard della Microchip Application Library funziona sulla EasyUSB senza problemi.
Date un occhio alla funzione Keyboard() nel file keyboard.c. Il pulsante premuto (che so non rappresenta il codice ascii ma un codice proprio dell'USB, ricavabile da pag. 53 del documento www.usb.org/developers/devclass_docs/Hut1_12.pdf ) viene "impostato" dalla riga che fa:
quindi: se al posto della variabile key metto un numero come definito dalla tabella che ho indicato nel documento prima, a video ottengo il tasto/la funzione relativa.
Fin qui tutto ok, nessun problema, difatti funziona correttamente: se al posto di key ci metto 4 mi vengono stampate lettere 'a'.
Per gestire il tastierino a matrice io faccio uso di un array nel quale ho inserito i codici da restituire in base al pulsante premuto, rilevato da una scansione. Premetto che la routine di scansione e tutto il resto funzionano bene e non sono queste il problema.
L'array in pratica è cosi definito:
non ha nulla di particolare=> keys[11] restituisce 4, che equivale alla lettera 'a' su tastiera USB.
Il problema è questo:
se metto key=4 mi viene stampata la lettera 'a' a video
se metto key=keys[11] non mi viene stampato nulla!!!
ricordo che la variabile key è definita anch'essa come unsigned char per cui non ci sono problemi sul tipo.
L'array "keys" ho provato a definirlo sia fuori delle funzioni (come array "globale"), che all'interno della funzione.
Nel mio impazzire ho pensato a una cosa: mettiamo che il C18 mi crei quell'array nella ROM anzichè nella RAM, ci sono problemi a dare a "key" (variabile in RAM) un valore appartenente ad un elemento di un array definito nella ROM ? Ma con Hitech-C per pic16 non avevo problemi.
Se il problema è questo: il C18 ha pensato arbitrariamente a mettere quell'array nella rom (in realtà ha fatto bene perchè è la cosa piu logica) controllando che quell'array nel programma non venisse mai modificato? perchè per metterlo in rom avrei dovuto metterci l'attributo ROM (o const), mentre qui non l'ho messo! E come faccio a passare un valore da ROM a RAM?
L'esempio USB Device - HID - Keyboard della Microchip Application Library funziona sulla EasyUSB senza problemi.
Date un occhio alla funzione Keyboard() nel file keyboard.c. Il pulsante premuto (che so non rappresenta il codice ascii ma un codice proprio dell'USB, ricavabile da pag. 53 del documento www.usb.org/developers/devclass_docs/Hut1_12.pdf ) viene "impostato" dalla riga che fa:
Code:
hid_report_in[2] = key;
quindi: se al posto della variabile key metto un numero come definito dalla tabella che ho indicato nel documento prima, a video ottengo il tasto/la funzione relativa.
Fin qui tutto ok, nessun problema, difatti funziona correttamente: se al posto di key ci metto 4 mi vengono stampate lettere 'a'.
Per gestire il tastierino a matrice io faccio uso di un array nel quale ho inserito i codici da restituire in base al pulsante premuto, rilevato da una scansione. Premetto che la routine di scansione e tutto il resto funzionano bene e non sono queste il problema.
L'array in pratica è cosi definito:
Code:
unsigned char keys[]={89,92,95,85,90,93,96,98,91,94,97,204,4,5,6,7};
non ha nulla di particolare=> keys[11] restituisce 4, che equivale alla lettera 'a' su tastiera USB.
Il problema è questo:
se metto key=4 mi viene stampata la lettera 'a' a video
se metto key=keys[11] non mi viene stampato nulla!!!
ricordo che la variabile key è definita anch'essa come unsigned char per cui non ci sono problemi sul tipo.
L'array "keys" ho provato a definirlo sia fuori delle funzioni (come array "globale"), che all'interno della funzione.
Nel mio impazzire ho pensato a una cosa: mettiamo che il C18 mi crei quell'array nella ROM anzichè nella RAM, ci sono problemi a dare a "key" (variabile in RAM) un valore appartenente ad un elemento di un array definito nella ROM ? Ma con Hitech-C per pic16 non avevo problemi.
Se il problema è questo: il C18 ha pensato arbitrariamente a mettere quell'array nella rom (in realtà ha fatto bene perchè è la cosa piu logica) controllando che quell'array nel programma non venisse mai modificato? perchè per metterlo in rom avrei dovuto metterci l'attributo ROM (o const), mentre qui non l'ho messo! E come faccio a passare un valore da ROM a RAM?
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Ultima Modifica 13 Anni 11 Mesi fa da Gianni.
Si prega Accesso o Crea un account a partecipare alla conversazione.
13 Anni 11 Mesi fa #2
da Gianni
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Risposta da Gianni al topic Re: HID Keyboard & Arrays
Ho controllato il file map generato da MPLAB, l'array viene messo in "data" come le altre variabili... per cui il problema non è un eventuale "trasferimento" da ram a rom....
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Si prega Accesso o Crea un account a partecipare alla conversazione.
13 Anni 11 Mesi fa #3
da Gianni
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Risposta da Gianni al topic Re: HID Keyboard & Arrays
ehm...
...problema risolto... :blush:
in realtà è tutto ok... L'errore in pratica stava nel fatto che stavo facendo le prove con keys[11] che in realtà mi puntava non alla A ma a quello che io credevo fosse il simbolo di cancelletto. In realtà su quella tabella è riportato "keypad #", che sarà si un simbolo di cancelletto, ma non viene visualizzato cosi come non vengono visualizzati tutti i simboli definiti come "keypad X", dove X è un simbolo normalmente NON presente sulla tastierina numerica... boooh!
...problema risolto... :blush:
in realtà è tutto ok... L'errore in pratica stava nel fatto che stavo facendo le prove con keys[11] che in realtà mi puntava non alla A ma a quello che io credevo fosse il simbolo di cancelletto. In realtà su quella tabella è riportato "keypad #", che sarà si un simbolo di cancelletto, ma non viene visualizzato cosi come non vengono visualizzati tutti i simboli definiti come "keypad X", dove X è un simbolo normalmente NON presente sulla tastierina numerica... boooh!
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Si prega Accesso o Crea un account a partecipare alla conversazione.
13 Anni 11 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: HID Keyboard & Arrays
Ciao Gianni,
avevo intenzione di fare qualcosa di simile con EasyUSB ma si trattava di un semplice dispositivo per presentazioni powerpoint, ovvero per avviare la presentazione, andare avanti, indietro e terminare la presentazione.
Per rintracciare i tasti avevo fatto semplicemente un conteggio mentale rispetto all'esempio della Microchip.
Ovvero ogni volta che veniva incrementato e visualizzato il carattere tenevo a mente il valore del contatore.
Un modo veloce e grossolano che non tiene conto delle tabelle relative alle specifiche, ma che funziona ugualmente per individuare i tasti. Il layout della tastiera può far però la differenza nel caso di caratteri speciali quindi è necessaria qualche attenzione.
Colgo l'occasione per postare l'indirizzo del progetto che hai presentato sul tuo Blog:
Tastiera a matrice numerica USB
Saluti,
Mauro
avevo intenzione di fare qualcosa di simile con EasyUSB ma si trattava di un semplice dispositivo per presentazioni powerpoint, ovvero per avviare la presentazione, andare avanti, indietro e terminare la presentazione.
Per rintracciare i tasti avevo fatto semplicemente un conteggio mentale rispetto all'esempio della Microchip.
Ovvero ogni volta che veniva incrementato e visualizzato il carattere tenevo a mente il valore del contatore.
Un modo veloce e grossolano che non tiene conto delle tabelle relative alle specifiche, ma che funziona ugualmente per individuare i tasti. Il layout della tastiera può far però la differenza nel caso di caratteri speciali quindi è necessaria qualche attenzione.
Colgo l'occasione per postare l'indirizzo del progetto che hai presentato sul tuo Blog:
Tastiera a matrice numerica USB
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti