POLITECNICO DI TORINO MONOGRAFIA Codifica e Lettura
Transcript
POLITECNICO DI TORINO MONOGRAFIA Codifica e Lettura
POLITECNICO DI TORINO Facoltà di Ingegneria dell’Informazione Corso di laurea in Ingegneria Elettronica MONOGRAFIA Codifica e Lettura Tastiera 5x3 Docente: Prof. Pierluigi Civera Candidato: Alessandro Fassio Giugno 2003 Indice Indice Introduzione……………………………………………………………………. 3 Obiettivo……………………………………………………………………….. 4 Hardware Caratterizzazione della tastiera………………………………………… 1. Codifica della tastiera……………………………………… 6 6 2. Montaggio del circuito…………………………………….. 2.1 Schema a blocchi……………………………………... 2.2 Schemi elettrici……………………………………….. 10 10 12 Software Programmazione AVR8515…………………………………………… 1. Listato Assembler…………………………………………. 17 17 2. Analisi del programma……………………………………. 2.1 Parte dichiarativa…………………………………….. 2.2 Corpo centrale……………………………………….. 2.3 Sub-routines………………………………………….. 24 24 25 27 3. Programmazione………………………………………….. 30 Conclusione………………………………………………………………….. 32 Bibliografia………………………………………………………………….. 33 Appendice – Documentazione fotografica 2 Introduzione e Obiettivo Introduzione Questa relazione costituisce il frutto di una ricerca nel campo dell’elettronica dei sistemi digitali. Essa rappresenta il lavoro conclusivo del ciclo di studi del Corso di Laurea in Ingegneria Elettronica. Lo scopo della monografia in questione consiste nella presentazione delle procedure per la codifica e la lettura di una tastiera 5x3 (5 righe e 3 colonne) attraverso l’utilizzo di un microcontrollore a 8 bit. La relazione è suddivisa in cinque macroblocchi: • Obiettivo in questa sezione viene illustrata la finalità della monografia. • Hardware in questa sezione viene trattato l’aspetto puramente circuitale del sistema elettronico complessivo. • Software in questa sezione vengono esposte le procedure di programmazione del microcontrollore. Uesta monografia di • Appendice A in questa sezione viene presentata la documentazione fotografica del sistema durante il suo funzionamento. • Appendice B in questa sezione viene riportato il foglio tecnico del microcontrollore. 3 Introduzione e Obiettivo Obiettivo Problema: Codifica di una tastiera 5x3 (5 righe e 3 colonne) utilizzando un microcontrollore ad 8 bit. Nel nostro caso si è scelto di utilizzare l’AVR AT90S8515. L’obiettivo è quindi quello di elaborare un supporto software necessario alla codifica della tastiera in esame. Si deve creare una corrispondenza tra il codice del tasto premuto (non standard) ed il relativo codice ASCII (standard internazionale). Schematicamente: Fig. 1: Schema concettuale 4 Hardware 5 Hardware Caratterizzazione della tastiera 1. Codifica della tastiera La prima cosa da fare è capire il funzionamento esatto della tastiera da codificare. Per fare ciò è stato necessario ricavare il codice dei tasti utilizzando un multimentro, poiché non era possibile reperire il foglio tecnico del componente. Fig. 2: Vista superiore e laterale della tastiera 5x3 Tipicamente viene adottata una codifica “a matrice”, cioè se ci sono n righe e m colonne avrò n pin “di riga” e m pin “di colonna”. Come si vede dalla fig. 2 ci sono 5 righe 3 colonne, ma 10 pin. Quindi si può dedurre che la tastiera in esame non ha organizzazione matriciale. Il principio di base che regola il funzionamento della tastiera è quello dello switch. Utilizzando un multimetro digitale in modalità DIODO, è stato possibile capire il codice per ogni tasto premuto. Ad esempio, posizionando i puntali del tester sui pin 10 e 2 e premendo il tasto 1 si udiva un sibilo. Ciò stava a significare che c’era continuità elettrica tra i pin 10 e 2 quando il tasto 1 era premuto. 6 Hardware Applicando tale metodo sono stati ricavati i codici dei tasti della tastiera. Restava ora da capire il tipo di logica utilizzata: attraverso il multimetro e attraverso alcune considerazioni circuitali è stato dedotto che la tastiera è in logica negativa. Esempio: TASTO 1 Pin 10 – 2 Sui Pin 10 e 2 ci sarà uno “zero logico” e su tutti gli altri ci sarà un “1 logico”. Quindi si otterrebbe: Pin 10 Pin 9 Pin 8 Pin 7 Pin 6 Pin 5 Pin 4 Pin 3 Pin 2 Pin 1 0 1 1 1 1 1 1 1 0 1 Da tutte queste considerazioni si può costruire la seguente tabella: TASTO PREMUTO PIN CODICE TASTIERA SIMBOLO ASCII CODICE ASCII (Hex) 1 2 3 4 5 6 7 8 9 Freccia DESTRA 0 Freccia SINISTRA A/p OK EXIT 10-2 10-3 9-6 9-4 9-7 9-1 9-8 9-5 9-2 10-7 10-5 10-1 10-8 10-6 10-4 0111111101 0111111011 1011011111 1011110111 1010111111 1011111110 1001111111 1011101111 1011111101 0110111111 0111101111 0111111110 0101111111 0111011111 0111110111 1 2 3 4 5 6 7 8 9 * 0 # DEL SPACE ESC 31 32 33 34 35 36 37 38 39 2A 30 23 7F 20 1B Osservando con più attenzione i codici associati ai tasti premuti notiamo come i pin 10 e 9 compaiano sempre. Ciò sta a significare che essi sono i “pin di scansione”, 7 Hardware cioè abilitando il pin 10 (con uno zero logico) posso selezionare 8 tasti della tastiera, e abilitando il pin 9 (sempre con uno zero logico) posso individuare i rimanenti 7. In sintesi: La tastiera funziona nel seguente modo: PIN 10 e PIN 9 Pin di SCANSIONE PIN 8 … PIN1 Pin di LETTURA Nel caso in cui non ci sia nessun tasto premuto ci troviamo in una si queste due situazioni: 01-11111111 oppure 10-11111111 In entrambi i casi si leggerà il codice FF (in esadecimale) oppure 11111111 (in binario). Elaborando la precedente tabella si può ottenere: TASTO PREMUTO 1 2 3 4 5 6 7 8 9 Freccia DESTRA 0 Freccia SINISTRA A/p OK EXIT PIN 10 – PIN 9 (Hex) 01 01 02 02 02 02 02 02 02 01 01 01 01 01 01 PIN 8…PIN 1 (Hex) FD FB DF F7 BF FE 7F EF FD BF EF FE 7F DF F7 SIMBOLO ASCII 1 2 3 4 5 6 7 8 9 * 0 # DEL SPACE ESC CODICE ASCII (Hex) 31 32 33 34 35 36 37 38 39 2A 30 23 7F 20 1B Si può notare come molti codici siano ripetuti, quindi è possibile sfruttare in modo efficiente tale simmetria: 8 Hardware Fig. 3: Schema codici Posso quindi organizzare la scansione della tastiera nel seguente modo: Finchè non ho finito Scarica 01 sui pin 10 e 9 Lettura codice dai pin 8…pin1 Generazione ASCII Scarica 02 sui pin 10 e 9 Lettura codice dai pin 8…pin1 Generazione ASCII Questa è, in linea di principio, la strategia che è stata utilizzata per scandire la tastiera e generare il codice ASCII associato ai tasti premuti. In seguito, verranno aggiunti dettagli e spiegazioni circa le modalità di ricerca e riconoscimento del “codice tasti”. 9 Hardware 2. Montaggio del circuito 2.1 Schema a blocchi Nel paragrafo precedente è stato illustrato il modo in cui è stata codificata la tastiera. Ora è necessario spiegare come creare il supporto hardware che permetta la connessione tra tastiera e microcontrollore. Fig. 4: Schema a blocchi del sistema elettronico 10 Hardware Spiegazione dello schema a blocchi: pin 10, pin 9: (Tastiera) pin 8,…,pin1 (Tastiera) PORTA A PORTA C PORTA D Sono i pin di scansione e vanno collegati ad una porta del microcontrollore (nel nostro caso la PORTA A). Imponendo in uscita, prima il valore 01H e poi il valore 02H, sarà possibile effettuare la scansione dell’intera tastiera. Sono i pin di lettura e devono essere collegati ciascuno ad una resistenza di Pull-Up, per una corretta interpretazione dei livelli logici di tensione. Come si può vedere dalla fig. 4, ogni resistenza (R = 4.7KOhm) è collegata a +5V (tensione di alimentazione). Porta di uscita, porta di scansione della tastiera Porta di ingresso, porta di lettura. Gli ingressi di tale porta devono essere i pin 8b,…,1b (uscita tastiera + RPull-Up) Porta di uscita, porta di test. Il codice ASCII in uscita sarà visualizzato sui LED con la seguente convenzione: 1 logico = LED acceso 0 logico = LED spento Esempio: Pressione del tasto 5 della tastiera Scansione tastiera e lettura del codice tasto dalla PORTA C del microcontrollore Riconosco codice e genero ASCII (35H) Sui LED sarà visualizzato il seguente risultato (0011-0101 = 35H convertito in binario) Fig. 5: LED in funzione Ora è necessario illustrare in dettaglio gli schemi elettrici dell’intero sistema elettronico. 11 Hardware 2.2 Schemi elettrici Connessione scheda - PC Per programmare il microcontrollore AVR 8515, bisogna utilizzare un apposito programmatore ISP_AVR, e come compilatore Assembler è stato utilizzato WAVRASM, disponibili entrambi in rete e di utilizzo gratuito. Dopo aver assemblato il programma, è necessario scaricare il codice sul microcontrollore, servendosi della porta parallela del PC (porta per la stampante). Bisogna inoltre predisporre un connettore apposito (DB-25) per interfacciare il cavo parallelo con il processore. Dal punto di vista puramente elettrico bisogna effettuare le seguenti connessioni: Connettore DB-25 AVR 8515 PIN 6 nRESET = (PIN 9) PIN 7 MOSI = (PIN 6) PIN 8 SCK = (PIN 8) PIN 10 MISO = (PIN 7) PIN 25 GND = (PIN 20) Fig. 6: Connettore PC-microcontrollore 12 Hardware Dopo aver saldato e collegato i fili come illustrato dalla tabella precedente o dalla Fig. 6, si è ora in grado di trasferire correttamente il codice dal PC al microcontrollore. Ora è necessario illustrare nel dettaglio come realizzare la scheda Microprocessore – Tastiera. Connessione Scheda – Tastiera – Alimentatore – Clock Fig. 7: Schema Processore – Alimentatore – Clock 13 Hardware Fig. 8: Schema Processore – Led – Tastiera Sovrapponendo mentalmente la Fig. 7 e la Fig. 8, otterremo lo schema elettrico completo del sistema elettronico in oggetto. Cercherò ora di chiarire il tutto utilizzando alcune tabelle: LED AVR 8515 PIN 10 PIN 11 PIN 12 PIN 13 PIN 14 PIN 15 PIN 16 PIN 17 (PD0) (PD1) (PD2) (PD3) (PD4) (PD5) (PD6) (PD7) Considerazioni Collegamento serie LED + Resistore 680Ω Collegamento serie LED + Resistore 680Ω Collegamento serie LED + Resistore 680Ω Collegamento serie LED + Resistore 680Ω Collegamento serie LED + Resistore 680Ω Collegamento serie LED + Resistore 680Ω Collegamento serie LED + Resistore 680Ω Collegamento serie LED + Resistore 680Ω 14 Hardware PROGRAMMAZIONE Connettore DB-25 AVR 8515 PIN 6 PIN 7 PIN 8 PIN 10 PIN 25 PIN 9 PIN 6 PIN 8 PIN 7 PIN 20 Per la connessione PC-scheda è quindi necessario collegare il “CAVO PARALLELO” del PC al connettore DB-25, e infine collegare i 5 fili uscenti dal DB-25 al microcontrollore. TASTIERA AVR 8515 PIN 21 PIN 22 PIN 23 PIN 24 PIN 25 PIN 26 PIN 27 PIN 28 PIN 38 PIN 39 Tastiera (PC0) (PC1) (PC2) (PC3) (PC4) (PC5) (PC6) (PC7) (PA1) (PA0) PIN 1b (PIN 1 + Rpu=4.7KΩ ) PIN 2b (PIN 2 + Rpu=4.7KΩ ) PIN 3b (PIN 3 + Rpu=4.7KΩ ) PIN 4b (PIN 4 + Rpu=4.7KΩ ) PIN 5b (PIN 5 + Rpu=4.7KΩ ) PIN 6b (PIN 6 + Rpu=4.7KΩ ) PIN 7b (PIN 7 + Rpu=4.7KΩ ) PIN 8b (PIN 8 + Rpu=4.7KΩ ) PIN 10 (scansione) PIN 9 (scansione) Nota 1: per maggiore chiarezza riferirsi alla Fig. 4 ALTRE CONNESSIONI AVR 8515 Considerazioni PIN 40 (Vcc) Collegamento a +Val = +5V PIN 9 (nRESET) Si collega R=4.7KΩ come Pull-Up per una corretta programmazione del microcontrollore Si collega il CLOCK: onda quadra @ f=2MHz e livelli di tensione TTL GND (riferimento di tensione) PIN 19 (XTAL1) PIN 20 Nota 2: attenzione alla posizione dei LED, poiché risultano scambiati rispetto alla direzione di osservazione. In pratica il LED che indica il MSB si trova all’estrema destra, anziché alla sinistra. Suggerisco quindi di incrociare i fili di connessione per una corretta visualizzazione del risultato. 15 Software 16 Software Programmazione AVR8515 1. Listato Assembler ;******************************************************************* ;ALESSANDRO FASSIO 101268 Ing. Elettronica ; ;ELETTRONICA DEI SISTEMI DIGITALI ; ;Prof. PIERLUIGI CIVERA ; ; ;Lettura di una tastiera 5x3 (15 tasti) con un microcontrollore ;ad 8 bit (ATMEL AVR AT90S8515) ; ; ;Maggio 2003 ;******************************************************************* ; Parte dichiarativa del programma .equ PORTD = $12 .equ PORTC = $15 .equ PORTA = $1B ; LED ; Lettura codice ; Scansione .equ PINC = $13 .equ SETTAGGIO_A = 0b11111111 .equ SETTAGGIO_C = 0b00000000 .equ SETTAGGIO_D = 0b11111111 ; 1=output ; 0=input .equ FINE_RAM = 0x25F ; Settaggio della porta A ; la porta A e’ utilizzata per la scansione => USCITA ldi r16,SETTAGGIO_A out $1A,r16 ; Settaggio della porta C ; la porta C e’ utilizzata per la lettura => INGRESSO ldi r16,SETTAGGIO_C out $14,r16 ; Settaggio della porta D ; la porta D e’utilizzata per il test, ad essa sono collegati i LED ; quindi e’ una porta di USCITA ldi r16,SETTAGGIO_D 17 Software out $11,r16 ; Inizializzazione dello Stack Pointer ldi out ldi out r16,high(FINE_RAM) $3E,r16 r16,low(FINE_RAM) $3D,r16 ; Tale inizializzazione e'necessaria per la presenza delle RCALL ;******************************************************************* ; ; Corpo centrale del programma ; ;******************************************************************* ; All’inizio tutti i LED devono essere spenti ldi r17,0x00 out PORTD,r17 ;******************************************************************* ; La PARTE1 effettua la scansione di metà tastiera PARTE1: ldi r17,0x01 ; Pin 10 selezionato SCARICA1: out PORTA,r17 ; Inizio scansione rcall RITARDO AVANTI1: in r18,PINC ; Lettura codice tasto premuto cpi r18,0xFF ; Nessun tasto premuto breq PARTE2 ; Se non ci sono tasti premuti ; scandisco l’altra metà della ; tastiera rjmp AVANTI ; Se c’e’tasto premuto ; riconosco codice rcall TROVA out PORTD,r19 ; Scarico codice sui LED rcall RITARDO rcall FERMA rjmp PARTE1 18 Software ;******************************************************************* ; La PARTE2 effettua la scansione dell’altra metà della tastiera PARTE2: ldi r17,0x02 ; Pin 9 selezionato SCARICA2: out PORTA,r17 ; Inizio scansione rcall RITARDO AVANTI2: in r18,PINC ; Lettura codice tasto premuto cpi r18,0xFF ; Nessun tasto premuto breq PARTE1 ; Se non ci sono tasti premuti ; scandisco la prima metà della ; ; tastiera rjmp AVANTI2 ; Se c’e’tasto premuto riconosco ; codice rcall TROVA out PORTD,r19 ; Scarico codice sui LED rcall RITARDO rcall FERMA rjmp PARTE2 19 Software ;******************************************************************* ; ; Sub-routines ; ;******************************************************************* ;################################################################### ; Routine per il campionamento ogni 10 ms ; Per calcolare il ritardo devo conoscere il T clock: TCK=2MHz ; Se voglio un ritardo di 10ms => 20000 cicli macchina ; ; 10ms => HEX => 4E20 ; RITARDO: ldi r28,0x20 ldi r29,0x4E ; Parte bassa ; Parte alta LOOP1: sbiw r28,1 cpi r28,0x00 brne LOOP1 cpi r29,0x00 brne LOOP1 ; Decremento registro 16 bit ret ;################################################################### ; Routine per evitare di stampare N volte lo stesso codice FERMA: out PORTA,r17 rcall RITARDO LOOP: in r21,PINC rcall RITARDO cp r21,r18 breq LOOP ; ; ; ; Rimango fermo nel ciclo fino a quando c'e'lo stesso tasto pigiato. Al rilascio del tasto si ritorna al main ret ;################################################################### ; Routine per la ricerca del codice (cuore del programma) 20 Software TROVA: mov r22,r18 CASO1: cpi r22,0xFD brne CASO2 cpi r17,0x01 breq COD_1 rjmp COD_9 COD_1: ldi r19,0x31 rjmp FINE ldi r19,0x39 rjmp FINE COD_9: ; 1 ASCII ; 9 ASCII ;*********************** CASO2: cpi r22,0xFB brne CASO3 ldi r19,0x32 rjmp FINE ; 2 ASCII ;*********************** CASO3: cpi r22,0xBF brne CASO4 cpi r17,0x01 breq COD_AST rjmp COD_5 COD_AST: ldi r19,0x2A rjmp FINE ldi r19,0x35 rjmp FINE COD_5: ; * ASCII ; 5 ASCII ;*********************** CASO4: cpi r22,0xEF brne CASO5 cpi r17,0x01 breq COD_0 rjmp COD_8 COD_0: ldi r19,0x30 rjmp FINE ldi r19,0x38 rjmp FINE COD_8: ; 0 ASCII ; 8 ASCII ;*********************** CASO5: cpi r22,0xFE brne CASO6 21 Software cpi r17,0x01 breq COD_CANC rjmp COD_6 COD_CANC: COD_6: ldi r19,0x23 rjmp FINE ldi r19,0x36 rjmp FINE ; # ASCII ; 6 ASCII ;*********************** CASO6: cpi r22,0x7F brne CASO7 cpi r17,0x01 breq COD_DEL rjmp COD_7 COD_DEL: ldi r19,0x7F rjmp FINE ldi r19,0x37 rjmp FINE COD_7: ; DEL ASCII ; 7 ASCII ;*********************** CASO7: cpi r22,0xDF brne CASO8 cpi r17,0x01 breq COD_SPACE rjmp COD_3 COD_SPACE: ldi r19,0x20 rjmp FINE ldi r19,0x33 rjmp FINE COD_3: ; SPACE ASCII ; 3 ASCII ;*********************** CASO8: cpi r22,0xF7 brne DEFAULT cpi r17,0x01 breq COD_ESC rjmp COD_4 ;*********************** COD_ESC: COD_4: ldi r19,0x1B rjmp FINE ldi r19,0x34 rjmp FINE ; ESC ASCII ; 4 ASCII ;*********************** 22 Software DEFAULT: ldi r19,0xFF rjmp FINE FINE: ret ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Il principio di base della routine TROVA e’ il confronto diretto. E’la strategia del “case” di linguaggi di programmazione di alto livello. ESEMPIO: tasto premuto 1 => tasto premuto 9 => codice 01-FD codice 02-FD utilizzo due variabili cod_tasto e scansione riferiti rispettivamente a FD e a 01/02 Se cod_tasto = FD Se scansione = 01 tasto = 31 (cod.ASCII) Se scansione = 02 tasto = 39 (cod ASCII) Se cod_tasto = ... ... ... altrimenti tasto = DEFAULT (valore di convenzione) 23 Software 2. Analisi del programma Il programma di controllo della tastiera può essere suddiviso nei seguenti blocchi: • Parte dichiarativa • Corpo centrale • Sub-routines Quello che voglio fare adesso è analizzare in dettaglio ogni blocco del programma. 2.1 Parte dichiarativa Sono state utilizzate 3 porte del processore (PORTA A, PORTA C, PORTA D) in due modalità differenti, in input e in output. Ad ogni porta è associato un registro di “settaggio”, che può essere scritto direttamente dal programmatore. Se in tale registro viene caricato il valore FFH vuol dire che la porta corrispondente sarà di uscita, viceversa se viene caricato il valore 00H vuol dire che la porta corrispondente sarà di ingresso. PORTA A porta di scansione PORTA C porta di lettura PORTA D porta di test uscita ingresso uscita FFH 00H FFH Poichè nel main del programma ho utilizzato alcune sub-routines, è stato necessario inizializzare lo STACK POINTER, per poter utilizzare correttamente l’istruzione RCALL <etichetta> (chiamata a sub-routine). 24 Software 2.2 Corpo centrale Il corpo centrale del programma può essere a sua volta suddiviso in due parti, tra loro assolutamente simmetriche. Inizierò ora con l’analisi del primo blocco: PARTE1: ldi r17,0x01 Questa istruzione permette di effettuare la scansione di metà tastiera (8 tasti) SCARICA1: out PORTA,r17 Inizio scansione tastiera scaricando sulla PORTA A il valore 01H rcall RITARDO Si ordina al microcontrollore di aspettare un tempo prefissato , nel nostro caso 10ms, per non incorrere in errori di campionamento. E’ una sorta di “sistema antirimbalzo software”. in r18,PINC Lettura del codice della tastiera. In R18 ci sarà quindi il codice del tasto premuto cpi r18,0xFF Nel caso in cui non ci siano tasti premuti in R18 ci sarà il valore FFH . Se il test risulta vero, cioè se non ho premuto alcun tasto, si salta al secondo blocco, il quale effettuerà la scansione dei rimanenti 7 tasti. breq PARTE2 rjmp AVANTI1 Se c’è almento un tasto premuto il test precedente risulta falso. In questo caso inizierà la parte di ricerca del codice ASCII. 25 Software AVANTI1: rcall TROVA Routine di ricerca del codice ASCII. Il risultato dell’elaborazione (il codice ASCII corrispondente al tasto premuto) sarà memorizzato nel registro R19. out PORTD,r19 Si scarica sulla PORTA D il valore contenuto in R19. Il risultato finale sarà quindi visualizzato sui LED rcall RITARDO rcall FERMA rjmp PARTE1 Non analizzerò il secondo blocco poiché è assolutamente simmetrico al primo. PARTE2: ldi r17,0x02 Istruzione che permette di effettuare la scansione degli altri 7 tasti. SCARICA2: out PORTA,r17 rcall RITARDO in r18,PINC cpi r18,0xFF breq PARTE1 rjmp AVANTI2 AVANTI2: rcall TROVA out PORTD,r19 rcall RITARDO rcall FERMA rjmp PARTE2 26 Software 2.3 Sub-routines Nel corso del programma ho utilizzato 3 funzioni: • RITARDO • FERMA • TROVA Ritardo La routine di ritardo ha il compito di far sì che il microcontrollore effettui correttamente il campionamento dei segnali in ingresso. Sarà utilizzata anche in altre circostanze per una maggiore sicurezza. Sapendo che il CLOCK esterno è 2MHz e volendo ottenere un tempo di ritardo di 10ms, dovrò effettuare 20000 cicli macchina. Trasformando questo numero in esadecimale ottengo 4E20. Salvo questo valore in un registro da 16 bit, e creo un ciclo in cui decremento il valore di tale registro finchè non è zero. A questo punto avrò atteso un tempo pari a 10ms. Ferma Questa routine evita che sia stampato sui LED lo stesso codice per più di una volta. FERMA: out PORTA,r17 rcall RITARDO LOOP: in r21,PINC Si legge continuamente l’ingresso (codice tasti sulla PORTA C) e si salva il valore in R21. 27 Software rcall RITARDO cp r21,r18 Confronto R18 e R21. Se sono uguali vuol dire che sto tenendo premuto il tasto. Se sono diversi vuol dire che ho rilasciato il tasto oppure ho un altro codice. In tutti i casi si esce dal ciclo e si passa il controllo al programma principale breq LOOP ret Trova La strategia di base della routine TROVA è il confronto diretto. In linguaggi di alto livello come ad esempio il C e il VHDL, tale principio di ricerca si applica utilizzando l’istruzione “case “. Quindi, poiché nel mio caso il numero di confronti non è elevato, ho realizzato una “struttura case” in ASSEMBLER. TROVA: mov r22,r18 Copio il contenuto di R18 in R22 in modo da non modificare (per sbaglio) il “codice tasto premuto” in R18. CASO1: cpi r22,0xFD Confronto il codice tasto (in R22) con un valore prefissato (FD). brne CASO2 Se in R22 non c’è FD, vuol dire che il tasto premuto è un altro e salto al CASO2 per effettuare un altro test. cpi r17,0x01 28 Software Se il contenuto di R22 è proprio FD, vuol dire che ho due possibilità. Posso aver premuto il tasto 1 oppure il tasto 9 a seconda di quale parte di tastiera è selezionata. Se in R17 c’è 01, allora vuol dire che il tasto premuto è 1, se c’è 02 il tasto premuto è 9. breq COD_1 rjmp COD_9 COD_1: ldi r19,0x31 ; 1 ASCII rjmp FINE COD_9: ldi r19,0x39 ; 9 ASCII rjmp FINE Memorizzo in R19 il codice ASCII corrispondente al tasto premuto Il confronto continua nello stesso modo per tutti gli altri tasti. Nel caso in cui non sia riconosciuto nessun codice è stato previsto un valore di DEFAULT. DEFAULT: I LED saranno tutti accesi ldi r19,0xFF rjmp FINE FINE: ret 29 Software 3. Programmazione Come già detto in precedenza, per programmare l’AVR8515 bisogna utilizzare un software di programmazione chiamato ISP_AVR. ***************************************************************** * In System Programmer for ATMEL AVR \|/ * * Version: V2.01 . . * 06.12.2001 Germany * Holger Buss [email protected] * Ingo Busker (Win32-Code) __o0o(_v_)o0o__* * * URL: http://www.mikrocontroller.com * ***************************************************************** Usage: ISP_AVR /LPTn [/DATA] [/ERASE] [/LOCK] [/SLOW] [/READ] [/TEST] [/BO] <file> Connect PC and chip as follows: Printer Port ATMEL Pin:6 (D4) RESET Pin:7 (D5) MOSI Pin:8 (D6) SCK Pin:10 (ACK) MISO Pin:25 (GND) GND Don't forget to: - connect power supply (5V) - connect a xtal to the µC - connect a resistor from RESET to 5V E’ molto utile creare un file batch, il quale contiene le direttive per il programmatore, per rendere più agevole e veloce il test sul microcontrollore. 30 Software Istruzioni per la programmazione 1. Il programma assembler si chiama, ad esempio, C:\AVR\TAST.ASM 2. Il file batch si chiama C:\AVR\SCAN.BAT 3. Il contenuto del file SCAN.BAT è: hexbin2 TAST.HEX TAST.BIN i 0 isp_AVR.exe /LPT1 /ERASE TAST.BIN Attenzione: è importante rispettare la sintassi, e riportare esattamente gli spazi. 4. A questo punto, se il programmatore si trova nella directory C:\AVR, sarà sufficiente scrivere sulla riga di comando C:\AVR>SCAN e il processore sarà programmato correttamente. Attenzione: dopo aver programmato il microcontrollore è opportuno staccare il cavo di programmazione per evitare conflitti di massa 31 Conclusione Conclusione Questa monografia può rappresentare il punto di partenza per lo studio di tematiche più complesse. Le potenzialità del software possono essere incrementate qualora fosse necessario. Il programma Assembler che abbiamo commentato in precedenza può essere utilizzato, con opportune modifiche, come sotto-modulo in progetti più evoluti. Utilizzando un altro tipo di tastiera (con organizzazione matriciale) sarebbe possibile sfruttare in modo efficiente la memoria RAM del microcontrollore. La routine di ricerca potrebbe essere migliorata inserendo tabelle sparse, direttamente puntate dal codice di tastiera corrispondente: in questo modo si possono decodificare un gran numero di tasti diversi. La strategia di ricerca “a switch” utilizzata nel corso di questo progetto, è adatta a risolvere problemi in cui i confronti da effettuare, per la ricerca dei codici, sono in numero ridotto. 32 Bibliografia Bibliografia Software In system programmer for Atmel AVR (ISP_AVR), Version V2.01 Holger Buss, Ingo Busker WAVRASM – AVR Assembler for Windows, Version 1.30, 1995-1999 Atmel Corp. Riferimenti testuali www.atmel.com - AT90S8515 Summary - Datasheet [Updated 9/01, 13 Pages] www.atmel.com - AT90S8515 Complete - Datasheet [Updated 9/01, 112 Pages] 33 Appendice Fotografie DOCUMENTAZIONE FOTOGRAFICA Foto 1: Vista superiore della tastiera + Collegamenti + Rpull-up Foto 2: Tastiera collegata al microcontrollore. Pressione del tasto 3 cod ASCII 33H (0011-0011) i Fotografie Foto 3: Pressione del tasto * cod ASCII 2AH (0010-1010) Foto 4: Pressione del tasto 4 cod ASCII 34H (0011-0100) ii Fotografie Foto 5: Pressione tasto 5 cod ASCII 35H (0011-0101) Foto 6: Valore di DEFAULT, tutti i Led sono accesi iii