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