Go Down

Topic: Arduino e TV (Read 14597 times) previous topic - next topic

MauroTec

Quote
Io ho cambiato il valore di IRQpin da 5 a 2, anche per ricordarmi meglio, ma perchè funziona in entrambi i modi? Ho sbagliato?
Ciao.

No, hai fatto giusto. Funziona sia con pin 2 o 3 perchè arduino (il 328) ha solo due pin Interrup principali, (credo si dica mascherabili), gli altri pin posso possono essere configurati per saltare ad una routine comune per ogni porta e sono pin changed non mascherabili.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Francesco_MIRM

Allora, stavo guardando più a fondo la libreria PS2keyboard:
http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html
Facendo un po' di prove ho visto che alcuni tasti non sono mappati e il layout della tastiera è US
Da una parte della pagina a cui punta il link sopra:
Quote
Special Keys
PS2 keyboards have many special keys which do not map to ASCII characters. By default, several are mapped to ASCII control characters with similar intended function. Others are disabled, but may be mapped to any byte by editing PS2Keyboard.h

Da quanto ho capito le parti da modificare sono queste:
Nel file .cpp, oltre che nei 2 array,
Code: [Select]
if (state & MODIFIER) {
                       switch (s) {
                         case 0x70: c = PS2_INSERT;      break;
                         case 0x6C: c = PS2_HOME;        break;
                         case 0x7D: c = PS2_PAGEUP;      break;
                         case 0x71: c = PS2_DELETE;      break;
                         case 0x69: c = PS2_END;         break;
                         case 0x7A: c = PS2_PAGEDOWN;    break;
                         case 0x75: c = PS2_UPARROW;     break;
                         case 0x6B: c = PS2_LEFTARROW;   break;
                         case 0x72: c = PS2_DOWNARROW;   break;
                         case 0x74: c = PS2_RIGHTARROW;  break;
                         case 0x4A: c = '/';             break;
                         case 0x5A: c = PS2_ENTER;       break;
                         default: break;

Nel file .h questa parte:
Code: [Select]
// Every call to read() returns a single byte for each
// keystroke.  These configure what byte will be returned
// for each "special" key.  To ignore a key, use zero.
#define PS2_TAB         9
#define PS2_ENTER       13
#define PS2_BACKSPACE   127
#define PS2_ESC         27
#define PS2_INSERT      0
#define PS2_DELETE      127
#define PS2_HOME        0
#define PS2_END         0
#define PS2_PAGEUP      25
#define PS2_PAGEDOWN    26
#define PS2_UPARROW     11
#define PS2_LEFTARROW   8
#define PS2_DOWNARROW   10
#define PS2_RIGHTARROW  21
#define PS2_F1          0
#define PS2_F2          0
#define PS2_F3          0
#define PS2_F4          0
#define PS2_F5          0
#define PS2_F6          0
#define PS2_F7          0
#define PS2_F8          0
#define PS2_F9          0
#define PS2_F10         0
#define PS2_F11         0
#define PS2_F12         0
#define PS2_SCROLL      0

/* Previous versions of this library returned a mix of ascii characters
* and raw scan codes (if no ASCII character could be found).  There was
* no way to determine if a byte was ascii or a raw scan code.  With
* version 2.0, only ASCII is returned, plus the special bytes above.
* These raw scan codes are never returned by read() anymore.
*
* PS2 keyboard "make" codes to check for certain keys.
*/
#define PS2_KC_BREAK  0xf0
#define PS2_KC_ENTER  0x0d
#define PS2_KC_ESC    0x76
#define PS2_KC_KPLUS  0x79
#define PS2_KC_KMINUS 0x7b
#define PS2_KC_KMULTI 0x7c
#define PS2_KC_NUM    0x77
#define PS2_KC_BKSP   0x66


E' la prima volta che "smoccolo" dentro una libreria, chi mi da una mano?
Dai leo che ci portiamo avanti! Grazie anche a MauroTec.
Ciao.

MauroTec

#77
Jan 16, 2011, 05:05 am Last Edit: Jan 16, 2011, 05:08 am by Maurotec Reason: 1
Quote
Dai leo che ci portiamo avanti! Grazie anche a MauroTec.
Ciao.


Sei più fuori di me ;) sono 04:41, ed ho pure sonno, ma resisto.

Mi sà che leo è come si suol dire tra le braccia di Morfeo.

Se vuoi cambiare da tastiera USA ad IT, si quelli sono i codici da cambiare, devi vedere però quali sono quelli da inserire.

Per leo scrivo qui:
Mi son trovato davanti i file include di avrlibc iom128.h e  iom328.h.

Il 128 ha:
#define SPM_PAGESIZE 256
#define RAMEND     0x10FF     /* Last On-Chip SRAM Location */
#define XRAMEND    0xFFFF     <---------------
#define E2END      0x0FFF
#define E2PAGESIZE 8
#define FLASHEND   0x1FFFF

il 328:
/* Constants */
#define SPM_PAGESIZE 128
#define RAMEND       0x8FF     /* Last On-Chip SRAM Location */
#define XRAMSIZE     0
#define XRAMEND      RAMEND             <----------
#define E2END        0x3FF
#define E2PAGESIZE   4
#define FLASHEND     0x7FFF
 
Quindi no Xetended Ram per il 328, niente malloc.
Solo ram esterna che devi gestire con codice scritto a manina.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Francesco_MIRM

#78
Jan 16, 2011, 05:26 am Last Edit: Jan 16, 2011, 05:31 am by Francy Reason: 1
Quote
Sei più fuori di me sono 04:41, ed ho pure sonno, ma resisto


Quando si dice: "da perderci il sonno".  :)

Quote
Se vuoi cambiare da tastiera USA ad IT, si quelli sono i codici da cambiare, devi vedere però quali sono quelli da inserire.


Si, ma dove li trovo?? mi servirebbero anche un paio di esempi, perchè anche avessi quelli giusti, non capisco se sto procedendo nel modo corretto!
A questo link ho trovato 3 scan code set, ma devo sapere come posso provare quei valori!
http://www.computer-engineering.org/ps2keyboard/
Grazie.

@leo
Quote
Non l'avevo notato questo progetto. Cmq qui sono collegati 2 Arduino, il secondo chip può essere anche un Atmega nudo e crudo, appunto.

Basta precaricarci lo sketch del TellyMate. Adesso devo vedere la libreria PS2 che pin di input usa: se non usa quelli RX/TX (cioè D0, D1) siamo a posto. Si può costruire un mini terminale con l'input letto dall'Arduino e l'output inviato all'Atmega che lo visualizza sulla TV.

Io sto usando il pin 8 e il 2
TvOut usa i pin 7 e 9, il pin 11 per l'audio (eventualmente), era questo che volevi sapere?

MauroTec

Quote
Si, ma dove li trovo??

Non nè ho la più pallida idea, forse negli Header di X11, ma valli a trovare.

Non puoi inviare "s" via seriale, in pratica la variabile dello switch "switch (s) {"
Esempio nel caso "s = 0x70" esegue
c = PS2_INSERT;      break;

Ok ciao mi devo allontanare.
Torno fra 30:00 min forse?
Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Francesco_MIRM

Hai preso l'esempio più azzeccato!
INSERT
Il tasto [Ins] non viene visto benchè sia "codificato" perchè nel file .h è ignorato
#define PS2_INSERT      0     //valore zero infatti
Quale valore va inserito al posto di 0 ?
Ora, al link:
http://www.computer-engineering.org/ps2keyboard/scancodes2.html
Keyboard Scan Codes: Set 2
il tasto [Ins] ha valore di make E0,70 e break E0,F0,70
C'è attinenza? devo prendere per buoni quegli Scan Codes ?

Un po' sarà l'ora, mettici pure la mia ignoranza cronica, ma non ci sto capendo più un piffero!

MauroTec

Quote
/* Previous versions of this library returned a mix of ascii characters
* and raw scan codes (if no ASCII character could be found).  There was
* no way to determine if a byte was ascii or a raw scan code.  With
* version 2.0, only ASCII is returned, plus the special bytes above.
* These raw scan codes are never returned by read() anymore.


Tieni conto che io ho solo il codice che hai postato.
Sopra il commento dice che nella versione 2.0 solo acsii viene ritornato no scancode. Quindi 0x70 è mappato per essere insert, e 0x75 e mappato come tasto su.

Quindi dovrebbe funzionare, quali tasti non corrispondono?

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Francesco_MIRM

I tasti che non vengono visualizzati sono quelli ignorati settati a 0 nel file .h
Es.
#define PS2_INSERT      0
tutti i tasti F, HOME, END e SCROLL,

Se fai caso sempre nel file .h i tasti BACKSPACE e DEL hanno entrambi numero 127 infatti producono lo stesso risultato cioè la stampa su seriale [Del]

Nel file .cpp se guardi questa parte di codice:
Code: [Select]

switch (s) {
            case 0x70: c = PS2_INSERT;           break;
            case 0x6C: c = PS2_HOME;           break;
            case 0x7D: c = PS2_PAGEUP;           break;
            case 0x71: c = PS2_DELETE;           break;
              case 0x69: c = PS2_END;                   break;
            case 0x7A: c = PS2_PAGEDOWN;    break;
            case 0x75: c = PS2_UPARROW;       break;
            case 0x72: c = PS2_DOWNARROW;  break;
            case 0x74: c = PS2_RIGHTARROW;  break;
            case 0x4A: c = '/';                          break;
            case 0x5A: c = PS2_ENTER;            break;
            default: break;


Insert, home, end, sono riportati benchè settati a 0 sul file .h e ovviamente non producono risultato, gli altri settati a 0 come i tasti F o SCROLL non sono proprio riportati nel file .cpp

Mah, magari se dai un occhiata alla libreria, sicuramente qualcosa sfugge alla mia comprensione..

..ah va bene pure se prima ti fai qualche ora di sonno!!  :)

MauroTec

Quelli definiti con #define sono codici ascii che deve ritornare.
Nel caso di  Enter:
case 0x5A: c = PS2_ENTER;       break;

se pigiando il tasto enter la tastiera emette un codice 0x5A, allora c=13 valore ascii.

Mi semra di capire che non tutti i tasti sono definiti, dal momento che hai la seriale, perche non gli invii come dicevo prima il valore della variabile s, così ti puoi mappare tutti itasti che vuoi.

Ciao si tra un pò mi spengo.

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

leo72

#84
Jan 16, 2011, 11:08 am Last Edit: Jan 16, 2011, 11:16 am by leo72 Reason: 1
Buongiorno. Sì, ad un certo punto sono andato a letto  ::)

1) ma che file state analizzando? Io li ho diversi.
Li avete presi da qui o no?
http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html
http://www.pjrc.com/teensy/arduino_libraries/PS2Keyboard.zip

Mio errore. Era rimasto un vecchio ZIP nella barra di Chrome ed ho aperto la versione errata.

2) ammesso che stiate usando quei file (che a me non tornano), la questione dei pin usabili è che si può cambiare il pin DATA ma non il pin CLK, che è mappato obbligatoriamente o sul pin 2 o sul pin 3 dell'Arduino (quelli di interrupt).

Francesco_MIRM

#85
Jan 16, 2011, 03:36 pm Last Edit: Jan 16, 2011, 03:40 pm by Francy Reason: 1
leo io sto usando la libreria PS2Keyboard 2.0 il file l'ho preso dalla pagina che mi hai linkato tu qualche post sopra dicendo che era l'ultima versione, il file si chiama semplicemente PS2Keyboard.zip
Si ti confermo come scritto nel commento della libreria puoi usare solo il pin 2 o 3 (interrupt) è un problema per collegare un secondo Atmega?
Sulla foto vedo che l' Arduino principale ha solo il pin 1 TX occupato..

Mauro dopo provo a fare come dici, ma non lo so se ho capito bene..leo tu un occhiata alla storia dei tasti non mappati l'hai data?


leo72

Non ce l'ho data perché non ho un connettore femmina PS/2 per fare delle prove ne' una tastiera da sacrificare per un taglio di spinotti.
Avrei trovato un vecchio adattatore PS2-DB9 però devo fare delle prove per vedere come sono cablati i pin e sono senza tester perché il mio me lo hanno distrutto i miei figlioli qualche tempo fa...  ::)

Oggi poi sono stato tutto il pomeriggio fuori casa e da domani torno a lavoro. Conto però, facendo il turno pomeridiano, di poter dedicare qualche ora della mattina.



Francesco_MIRM

Senti ma per cominciare ad attaccare l'altro ATmega ad Arduino, basta che uso gli stessi piedini sul mic che usa l'Arduino della foto senza bisogno si aggiungere altri componenti?
Serve alimentazione esterna?

leo72

Beh, io partirei dallo schema del TellyMate, così sei sicuro di attaccare i pin alle giuste porte dell'Arduino.
http://www.batsocks.co.uk/products/Shields/TellyMate%20Shield.htm
L'alimentazione la prendi direttamente dall'Arduino: d'altronde lo shield fa così, quindi va senz'altro.

leo72

Siccome sono bloccato perché ancora il programmatore non mi è arrivato ed il mio Atmega è lì che mi guarda senza poter far nulla, mi son messo a rileggere le specifiche del TellyMate.

Collegando solo il pin TX puoi mandare unicamente dati al TellyMate senza poter ricevere da esso informazioni, nel senso che è solo un sistema passivo: gli dici di scrivere "A" e lui scrive "A". Collegando anche il pin RX diventa attivo, nel senso che puoi chiedergli se nella locazione 0,0 c'è un carattere.

Nota2:usando TX e/o RX, l'uso del TellyMate taglia fuori l'uso di qualsiasi altro componente che comunichi con l'Arduino tramite seriale.

Go Up