SlideShare a Scribd company logo
Seconda parte
Encoder con pic 16f84
 Nella puntata precedente, è stata presentato un piccolo
programmino per far comparire il numero 7 su un
display a 7 segmenti.
 In questo file, si riprende lo stesso programmino per
creare però un Encoder. Il programma precedente
verrà quindi ampliato
 Stavolta però, sarà necessario conoscere alcuni registri
 La prima parte del programma verrà scritta nella slide
successiva e, si farà riferimento ai registri tramite i
rispettivi indirizzi senza associare ad essi un nome
Prima parte del programma
Encoder
 LIST p=16f84
radix dec ; direttiva che indica che i dati sono in base dieci se non è specificata la
;base
BSF 0x03 0x05 ;pone 1 il V bit di status per selezionare bank1
MOVLW 0xff
MOVWF 0x85 ;085h è il registro TRISA
CLRW
MOVWF 0x86 ;086h è il registro TRISB
Seconda parte del
programma:illustrazione
 Per poter creare un encoder, bisogna acquisire dei valori in
formato binario dall’esterno per poter poi visualizzare su
un display a 7 segmenti i rispettivi valori in base dieci.
 La port_a è stata dichiarata di input; una sequenza di livelli
logici stabiliti da interruttori sui pin RA0…RA3
rappresentano un numero binario.
 Con un solo display a 7 segmenti a c.c., si possono
visualizzare numeri da 0 a 9 e quindi, bastano quattro bit
 Es se RA0=0, RA1=1, RA2=0,RA3=0, il numero binario è
0010 che corrisponde a 2 base dieci
 Nella seconda parte del programma sarà necessario
introdurre una subroutine e una tabella
Seconda parte del programma
bcf 0x03, 0x05 ;azzero il V bit per tornare al bank0
S1: MOVF 0X05,W ; S1 è una label che indica l’inizio di una subroutine
; la prima riga della subroutine indica che il valore
;acquisito in oo5h, PORTA, viene passato in W
ANDLW 0X0F ;adesso, i dati acquisiti sono visti come dati binari e sono solo i bit più bassi
; vengono presi in considerazione
CALL TABLE ; chiama una subroutine detta table
MOVWF 0X06 ;aggiorna l’uscita PORTB
GOTO S1
TABLE ADDWF 0X02,f esegue la somma tra il valore del program counter (indirizzo 002h) al valore in W
;in questo modo, non viene eseguita l’istruzione successiva ma quella del nuovo indirizzo in pc
RETLW b’01111111’ ;return with literal w
RETLW b’00001010’
RETLW b’01111111’
RETLW b'10011111'
RETLW b'11001101'
RETLW b'11011011'
RETLW b'11111011'
RETLW b'00001111'
RETLW b'11111111'
RETLW b'11001111‘
END
Un piccolo schema circuitale
RBO
.
.
.
.
.
.
.
.
.
RB7
R=8x220 
a
b
c
d
e
f
g
Corrispondenza tra
pin RB e segmenti
del display
RB1 a
RB2 b
RB3 c
RB4 d
RB5 e
RB6 f
RB7 g
RB0 h
RA0
.
.
RA3
I registri:introduzione
 Per poter comprendere meglio il programma, bisogna conoscere i registri del
pic in questione
 I registri del pic 16fxx si dividono in due banchi: bank0 e bank1
 I registri speciali del bank0 vanno dall’indirizzo 00h 0Bh; i registri speciali del
bank1 vanno dall’indirizzo 80h a 8Bh
 Per indirizzare i registri del bank0 c’è bisogno al massimo di 4 bit perché
l’indirizzo più grande, 0Bh, corrisponde a (11)10=(1011)2
 Per il bank1, gli indirizzi occupano massimo 8 bit perché il più grande,
8Bh=(10001011)2=(139)10
 Per poter utilizzare questi indirizzi in una riga di programmi, non dobbiamo
sforare i 14 bit. Ciò dipende anche dall’opcode che dobbiamo utilizzare
 L’opcode, non sempre compare da solo in una linea programma ma, può essere
scritto con un indirizzo dati, indirizzo registri o con un dato numerico. Il tutto
non deve superare 14 bit di memoria per linea di programma
 Può capitare che in una linea programma l’opcode insieme all’indirizzo del
registro supera la memoria di 14 bit; ciò può capitare solo se i registri fanno
parte del bank1
I registri: bank0 e bank1
 Bisogna immaginare i registri come se fossero scritti in una tabella di più righe e più colonne.
 Nel caso dei pic 16f628,pi16f84… i banchi sono 2, bank0 e bank1. Le colonne saranno allora solo 2, bank0 per la prima
colonna e bank1 per la seconda colonna.
 Per risparmiare memoria nell’indirizzamento di un registro basta far riferimento solo alla riga, dopo aver specificato la
colonna in questione
 Esistono due tipi di comandi per selezionare bank0 e bank1: BSF 0x03,5 e BCF 0x03,5
 BSF= Bit Set f; questo comando pone a 1 un bit del registro in questione. Nel nostro caso pone a 1 il bit 5 del registro di
indirizzo 3h, detto registro STATUS che fa parte del bank0. Il bit 5, detto RP0, è quello che indirizza il bank0 o il bank1.
Se RP0=0, il bank selezionato è zero, se RP0=1, il bank selezionato è 1
 BCF= Bit Clear f; ; questo comando pone a 0 un bit del registro in questione. Nel nostro caso pone a 0 il bit 5 del
registro di indirizzo 3h selezionando il bank0
vf
Bank0 Bank1
indirizzo registro indirizzo registro
00h INDF 80h INDF
01h TMR0 81h OPTION
02h PCL 82h PCL
03h STATUS 83h STATUS
04h FSR 84h FSR
05h PORTA 85h TRISA
06h PORTB 86h TRISB
…….. …………… …. ………………….
Esempio:altro modo per
indirizzare TRISA e TRISB
 Un modo alternativo per scrivere la prima parte del programma precedente è il seguente:
ORG 0X00
MOVLW 0XFF
TRIS 0X05 ;l’istruzione TRIS fa parte di istruzioni speciali; a questo comando è associato sempre l’indirizzo di PORT
A, PORT B..
; con esso non vengono settati i livelli logici delle porte ma solo la direzione. Ciò vuol dire che quando si
utilizza TRIS, si ;fa riferimento ai registri TRIS A e TRISB del bank1. In questo caso, il riferimento è a TRISA all’indirizzo
0x85
CRLW
TRIS 0X06 ;il dato 0x00 nell’accumulatore viene trasferito al registro TRISB portando tutte i bit di B come OUTPUT
MOVF 0x86,W
……………………………………………il resto del programma è uguale al precedente
Registro STATUS
 Si trova all’indirizzo 03h e, i bit che lo compongono sono dei veri e propi flag
 Bit 0 flag di Carry/Barrow. Segnala un riporto/ prestito nelle operazioni di somma e sottrazione su otto bit
 Bit 1 flag di Digit Carry/Barrow. Segnala un riporto/prestito sul nibble basso nelle operazioni di somma e
sottrazioni.
 Bit 2 flag di zero : è 1 se il risultato dell’operazione logico/aritmetica precedente è zero altrimenti è 0
 Bit 3 flag di Power Down, va a 1 durante la temporizzazione di power-up o nell’istruzione di azzeramento del
Watch dog ,CLRWDT; durante l’istruzione di SLEEP, istruzione di attesa, viene riportato a zero
 Bit 4 flag di Time out, va a 1 durante il power Out o per CLRWDT. Il bit 4 con il bit 3 sono i bit di STATUS che
non possono essere scritti ma solo letti
 Bit 5 e bit 6 sono quelli che selezionano i banchi. Se entrambi 0, siamo nel bank0, se RP0=1 e RP1=0, allora
siamo nel bank1. Altre combinazioni di RP0 e RP1 sono utili solo in caso di pic con un numero di banchi
superiori
 Bit 6 non è utilizzato nel caso di pic 16f84 e pic16f628. Serve per l’indirizzamento indiretto. Verrà approfondito
più avanti
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
IRP RP1 RP0 TO PD Z DC C
Il registro PCL
 Nella seconda parte del programma compare il program counter all’indirizzo
002h. Questo registro si aggiorna ogni volta che viene eseguita una nuova
operazione. In esso è scritto l’indirizzo dell’istruzione successiva da eseguire. È
un registro a 13 bit di cui, gli 8 bit meno significativi, si trovano all’indirizzo
002h, i 5 più significativi in un altro indirizzo detto PCLATH all’indirizzo 0Ah
 Il program counter è utile nelle istruzioni di salto.
 Ogni volta che c’è un’istruzione di salto GOTO n o CALL, il PC assume il valore
dell’indirizzo di istruzione di salto ponendo il valore dell’istruzione successiva
nello stack. Terminata l’istruzione di salto (subroutine), il PC acquisisce dallo
stack l’indirizzo dell’istruzione dove si era interrotto per ritornare
all’esecuzione normale del programma
 In corrispondenza dell’istruzione ADDWF 0X02,f il PC ha valore 0X0A che è
l’indirizzo dell’istruzione successiva.
 Ma, in seguito all’istruzione di riga, il PC assume il valore del risultato della
somma tra il contenuto di w e quello di PC.
 Questo nuovo risultato è l’indirizzo del contenuto della tabella
 Eseguita l’istruzione, il programma ritorna all’istruzione dove si era interrotto
Esecuzione del programma passo
passo
Indiririzzo
istruzione
PC istruzione Registro Stato bit nel registro
000 0x01 MOVLW 0xff W 1 1 1 1 1 1 1 1
001 0x02 MOVWF 0x85 TRISA 1 1 1 1 1 1 1 1
002 0x03 CLRW W 0 0 0 0 0 0 0 0
003 0x04 MOVWF
0x86
TRISB 0 0 0 0 0 0 0 0
004 0x05 MOVF
0X05,W
W 0 0 0 0 0 0 1 1
005 0x06 ANDLW
0X0F
W 0 0 0 0 0 0 1 1
006 0x07 CALL TABLE
009 0x0A ADDWF 0X02
,1
pcl 0 0 0 0 1 1 0 0
00d 0x07 RETLW w 1 0 0 1 1 1 1 1
007 0x08 PORTB PORTB 1 0 0 1 1 1 1 1
008 0x04 GOTO S1
Abbiamo supposto che
l’ingresso su port a sia 11 binario.
00D=00A+003
00A è il contenuto del program counter, 003 è l’ingresso in formato decimale
che viene inserito su RA in formato binario.
Il programma non esegue l’istruzione in 00A ma quella in 00D
Retlw
 Nella slide precedente, si è visto che l’istruzione ADDWF
0X02, 1 somma il contenuto di W con quello del PC, di
indirizzo 0x02 e, pone il risultato nel PC
 In questo modo, il program counter ha l’indirizzo nuovo
che corrisponde a 0x0d dove c’è l’istruzione RETLW
10011111
 Retlw scarica dallo stack l' indirizzo di ritorno salvato
dalla call e rientra ponendo in W il suo contenuto
 Questo contenuto viene trasferito in PORTB che setta i
livelli logici delle uscite RB per far accendere determinati
segmenti del display a sette segmenti a c.c. In questo caso,
il numero 3
In conclusione
 Per questo programma è stato necessario conoscere i
seguenti registri:
 W
 PC bank0 0x02
 PORTA bank0 0x05
 PORTB bank0 0x06
 TRISA bank1 0x85
 TRISB bank1 0x86
 STATUS bank0 0x03
Assembly1

More Related Content

What's hot

16 - Programmazione: Gestione memoria
16 - Programmazione: Gestione memoria16 - Programmazione: Gestione memoria
16 - Programmazione: Gestione memoriaMajong DevJfu
 
La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++
I.S.I.S. "Antonio Serra" - Napoli
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Majong DevJfu
 
Informatica di base
Informatica di baseInformatica di base
Informatica di base
Francesco Zoino
 
Programmazione Top Down in C++
Programmazione Top Down in C++Programmazione Top Down in C++
Programmazione Top Down in C++
I.S.I.S. "Antonio Serra" - Napoli
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, code
Sergio Porcu
 
Codici di Reed-Solomon
Codici di Reed-SolomonCodici di Reed-Solomon
Codici di Reed-Solomon
Filippo Ragazzo
 
Architettura dei Calcolatori 13 Porta Parallela 8255
Architettura dei Calcolatori 13 Porta Parallela 8255Architettura dei Calcolatori 13 Porta Parallela 8255
Architettura dei Calcolatori 13 Porta Parallela 8255Majong DevJfu
 
La crittografia frattale in Perl
La crittografia frattale in PerlLa crittografia frattale in Perl
La crittografia frattale in Perl
Mario Rossano
 

What's hot (10)

16 - Programmazione: Gestione memoria
16 - Programmazione: Gestione memoria16 - Programmazione: Gestione memoria
16 - Programmazione: Gestione memoria
 
La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06
 
Informatica di base
Informatica di baseInformatica di base
Informatica di base
 
Programmazione Top Down in C++
Programmazione Top Down in C++Programmazione Top Down in C++
Programmazione Top Down in C++
 
Il pic 16 f84a
Il pic 16 f84aIl pic 16 f84a
Il pic 16 f84a
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, code
 
Codici di Reed-Solomon
Codici di Reed-SolomonCodici di Reed-Solomon
Codici di Reed-Solomon
 
Architettura dei Calcolatori 13 Porta Parallela 8255
Architettura dei Calcolatori 13 Porta Parallela 8255Architettura dei Calcolatori 13 Porta Parallela 8255
Architettura dei Calcolatori 13 Porta Parallela 8255
 
La crittografia frattale in Perl
La crittografia frattale in PerlLa crittografia frattale in Perl
La crittografia frattale in Perl
 

Viewers also liked

Formato istruzioni e direttive 8086
Formato istruzioni e direttive 8086Formato istruzioni e direttive 8086
Formato istruzioni e direttive 8086Sergio Porcu
 
C Esercizi Indirizzamento
C Esercizi IndirizzamentoC Esercizi Indirizzamento
C Esercizi Indirizzamentoacapone
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Sergio Porcu
 
Array
ArrayArray
Elementi architetturali dell'8086
Elementi architetturali dell'8086Elementi architetturali dell'8086
Elementi architetturali dell'8086Sergio Porcu
 
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneAlgoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Sergio Porcu
 
Interfaccia verso il BUS
Interfaccia verso il BUSInterfaccia verso il BUS
Interfaccia verso il BUSSergio Porcu
 
Microprocessori INTEL 8086/8088
Microprocessori INTEL 8086/8088Microprocessori INTEL 8086/8088
Microprocessori INTEL 8086/8088Sergio Porcu
 
Tesi Triennale
Tesi TriennaleTesi Triennale
Tesi Triennale
Mirko Mancin
 
PIC microcontroller
PIC microcontroller PIC microcontroller
PIC microcontroller Rami Alsalman
 
Sistema di numerazione
Sistema di numerazioneSistema di numerazione
Sistema di numerazione
Gilda Tobia
 
Bk001 it c18-step_by_step
Bk001 it c18-step_by_stepBk001 it c18-step_by_step
Bk001 it c18-step_by_stephawk2012
 
Tesi Magistrale 2014
Tesi Magistrale 2014Tesi Magistrale 2014
Tesi Magistrale 2014
Mirko Mancin
 
Investimenti
InvestimentiInvestimenti
Investimenti
Sergio Porcu
 
Diagnosi e integrazione disabili in Polonia
Diagnosi e integrazione disabili in PoloniaDiagnosi e integrazione disabili in Polonia
Diagnosi e integrazione disabili in Polonia
Gilda Tobia
 
Lezione 4 arduino - corso 20 ore
Lezione 4 arduino - corso 20 oreLezione 4 arduino - corso 20 ore
Lezione 4 arduino - corso 20 ore
Mirko Mancin
 
Arduino&Raspberry
Arduino&RaspberryArduino&Raspberry
Arduino&Raspberry
Mirko Mancin
 

Viewers also liked (20)

Formato istruzioni e direttive 8086
Formato istruzioni e direttive 8086Formato istruzioni e direttive 8086
Formato istruzioni e direttive 8086
 
C Esercizi Indirizzamento
C Esercizi IndirizzamentoC Esercizi Indirizzamento
C Esercizi Indirizzamento
 
Assembler 8086
Assembler 8086Assembler 8086
Assembler 8086
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
 
Array
ArrayArray
Array
 
Elementi architetturali dell'8086
Elementi architetturali dell'8086Elementi architetturali dell'8086
Elementi architetturali dell'8086
 
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneAlgoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
 
Interfaccia verso il BUS
Interfaccia verso il BUSInterfaccia verso il BUS
Interfaccia verso il BUS
 
Microprocessori INTEL 8086/8088
Microprocessori INTEL 8086/8088Microprocessori INTEL 8086/8088
Microprocessori INTEL 8086/8088
 
Tesi Triennale
Tesi TriennaleTesi Triennale
Tesi Triennale
 
Assembly2
Assembly2Assembly2
Assembly2
 
PIC microcontroller
PIC microcontroller PIC microcontroller
PIC microcontroller
 
Sistema di numerazione
Sistema di numerazioneSistema di numerazione
Sistema di numerazione
 
Bk001 it c18-step_by_step
Bk001 it c18-step_by_stepBk001 it c18-step_by_step
Bk001 it c18-step_by_step
 
Diagrammi di Bode
Diagrammi di BodeDiagrammi di Bode
Diagrammi di Bode
 
Tesi Magistrale 2014
Tesi Magistrale 2014Tesi Magistrale 2014
Tesi Magistrale 2014
 
Investimenti
InvestimentiInvestimenti
Investimenti
 
Diagnosi e integrazione disabili in Polonia
Diagnosi e integrazione disabili in PoloniaDiagnosi e integrazione disabili in Polonia
Diagnosi e integrazione disabili in Polonia
 
Lezione 4 arduino - corso 20 ore
Lezione 4 arduino - corso 20 oreLezione 4 arduino - corso 20 ore
Lezione 4 arduino - corso 20 ore
 
Arduino&Raspberry
Arduino&RaspberryArduino&Raspberry
Arduino&Raspberry
 

Similar to Assembly1

Appunti interrupt 8086
Appunti interrupt 8086Appunti interrupt 8086
Appunti interrupt 8086
Samanta Tordini
 
Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2
µhack
 
Conversione A/D
Conversione A/DConversione A/D
Conversione A/D
Pasquale Alba
 
Arkanoid on Altera DE-1
Arkanoid on Altera DE-1Arkanoid on Altera DE-1
Arkanoid on Altera DE-1
Matteo Gazzin
 
IrrigaPIC Centralina per irrigazione 8 zone per valvole 24v ac
IrrigaPIC Centralina per irrigazione 8 zone per valvole 24v acIrrigaPIC Centralina per irrigazione 8 zone per valvole 24v ac
IrrigaPIC Centralina per irrigazione 8 zone per valvole 24v ac
Davide Mercanti
 
Sistemi di numerazione
Sistemi di numerazioneSistemi di numerazione
Sistemi di numerazione
Marino_Mastropasqua
 
E Esercizi Routing
E Esercizi RoutingE Esercizi Routing
E Esercizi Routingacapone
 
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
SANTIAGO PABLO ALBERTO
 
Workshop su Arduino
Workshop su ArduinoWorkshop su Arduino
Workshop su Arduino
Paolo Aliverti
 

Similar to Assembly1 (9)

Appunti interrupt 8086
Appunti interrupt 8086Appunti interrupt 8086
Appunti interrupt 8086
 
Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2Anatomia di un'istruzione in Arduino Pt.2
Anatomia di un'istruzione in Arduino Pt.2
 
Conversione A/D
Conversione A/DConversione A/D
Conversione A/D
 
Arkanoid on Altera DE-1
Arkanoid on Altera DE-1Arkanoid on Altera DE-1
Arkanoid on Altera DE-1
 
IrrigaPIC Centralina per irrigazione 8 zone per valvole 24v ac
IrrigaPIC Centralina per irrigazione 8 zone per valvole 24v acIrrigaPIC Centralina per irrigazione 8 zone per valvole 24v ac
IrrigaPIC Centralina per irrigazione 8 zone per valvole 24v ac
 
Sistemi di numerazione
Sistemi di numerazioneSistemi di numerazione
Sistemi di numerazione
 
E Esercizi Routing
E Esercizi RoutingE Esercizi Routing
E Esercizi Routing
 
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
 
Workshop su Arduino
Workshop su ArduinoWorkshop su Arduino
Workshop su Arduino
 

Assembly1

  • 2. Encoder con pic 16f84  Nella puntata precedente, è stata presentato un piccolo programmino per far comparire il numero 7 su un display a 7 segmenti.  In questo file, si riprende lo stesso programmino per creare però un Encoder. Il programma precedente verrà quindi ampliato  Stavolta però, sarà necessario conoscere alcuni registri  La prima parte del programma verrà scritta nella slide successiva e, si farà riferimento ai registri tramite i rispettivi indirizzi senza associare ad essi un nome
  • 3. Prima parte del programma Encoder  LIST p=16f84 radix dec ; direttiva che indica che i dati sono in base dieci se non è specificata la ;base BSF 0x03 0x05 ;pone 1 il V bit di status per selezionare bank1 MOVLW 0xff MOVWF 0x85 ;085h è il registro TRISA CLRW MOVWF 0x86 ;086h è il registro TRISB
  • 4. Seconda parte del programma:illustrazione  Per poter creare un encoder, bisogna acquisire dei valori in formato binario dall’esterno per poter poi visualizzare su un display a 7 segmenti i rispettivi valori in base dieci.  La port_a è stata dichiarata di input; una sequenza di livelli logici stabiliti da interruttori sui pin RA0…RA3 rappresentano un numero binario.  Con un solo display a 7 segmenti a c.c., si possono visualizzare numeri da 0 a 9 e quindi, bastano quattro bit  Es se RA0=0, RA1=1, RA2=0,RA3=0, il numero binario è 0010 che corrisponde a 2 base dieci  Nella seconda parte del programma sarà necessario introdurre una subroutine e una tabella
  • 5. Seconda parte del programma bcf 0x03, 0x05 ;azzero il V bit per tornare al bank0 S1: MOVF 0X05,W ; S1 è una label che indica l’inizio di una subroutine ; la prima riga della subroutine indica che il valore ;acquisito in oo5h, PORTA, viene passato in W ANDLW 0X0F ;adesso, i dati acquisiti sono visti come dati binari e sono solo i bit più bassi ; vengono presi in considerazione CALL TABLE ; chiama una subroutine detta table MOVWF 0X06 ;aggiorna l’uscita PORTB GOTO S1 TABLE ADDWF 0X02,f esegue la somma tra il valore del program counter (indirizzo 002h) al valore in W ;in questo modo, non viene eseguita l’istruzione successiva ma quella del nuovo indirizzo in pc RETLW b’01111111’ ;return with literal w RETLW b’00001010’ RETLW b’01111111’ RETLW b'10011111' RETLW b'11001101' RETLW b'11011011' RETLW b'11111011' RETLW b'00001111' RETLW b'11111111' RETLW b'11001111‘ END
  • 6. Un piccolo schema circuitale RBO . . . . . . . . . RB7 R=8x220  a b c d e f g Corrispondenza tra pin RB e segmenti del display RB1 a RB2 b RB3 c RB4 d RB5 e RB6 f RB7 g RB0 h RA0 . . RA3
  • 7. I registri:introduzione  Per poter comprendere meglio il programma, bisogna conoscere i registri del pic in questione  I registri del pic 16fxx si dividono in due banchi: bank0 e bank1  I registri speciali del bank0 vanno dall’indirizzo 00h 0Bh; i registri speciali del bank1 vanno dall’indirizzo 80h a 8Bh  Per indirizzare i registri del bank0 c’è bisogno al massimo di 4 bit perché l’indirizzo più grande, 0Bh, corrisponde a (11)10=(1011)2  Per il bank1, gli indirizzi occupano massimo 8 bit perché il più grande, 8Bh=(10001011)2=(139)10  Per poter utilizzare questi indirizzi in una riga di programmi, non dobbiamo sforare i 14 bit. Ciò dipende anche dall’opcode che dobbiamo utilizzare  L’opcode, non sempre compare da solo in una linea programma ma, può essere scritto con un indirizzo dati, indirizzo registri o con un dato numerico. Il tutto non deve superare 14 bit di memoria per linea di programma  Può capitare che in una linea programma l’opcode insieme all’indirizzo del registro supera la memoria di 14 bit; ciò può capitare solo se i registri fanno parte del bank1
  • 8. I registri: bank0 e bank1  Bisogna immaginare i registri come se fossero scritti in una tabella di più righe e più colonne.  Nel caso dei pic 16f628,pi16f84… i banchi sono 2, bank0 e bank1. Le colonne saranno allora solo 2, bank0 per la prima colonna e bank1 per la seconda colonna.  Per risparmiare memoria nell’indirizzamento di un registro basta far riferimento solo alla riga, dopo aver specificato la colonna in questione  Esistono due tipi di comandi per selezionare bank0 e bank1: BSF 0x03,5 e BCF 0x03,5  BSF= Bit Set f; questo comando pone a 1 un bit del registro in questione. Nel nostro caso pone a 1 il bit 5 del registro di indirizzo 3h, detto registro STATUS che fa parte del bank0. Il bit 5, detto RP0, è quello che indirizza il bank0 o il bank1. Se RP0=0, il bank selezionato è zero, se RP0=1, il bank selezionato è 1  BCF= Bit Clear f; ; questo comando pone a 0 un bit del registro in questione. Nel nostro caso pone a 0 il bit 5 del registro di indirizzo 3h selezionando il bank0 vf Bank0 Bank1 indirizzo registro indirizzo registro 00h INDF 80h INDF 01h TMR0 81h OPTION 02h PCL 82h PCL 03h STATUS 83h STATUS 04h FSR 84h FSR 05h PORTA 85h TRISA 06h PORTB 86h TRISB …….. …………… …. ………………….
  • 9. Esempio:altro modo per indirizzare TRISA e TRISB  Un modo alternativo per scrivere la prima parte del programma precedente è il seguente: ORG 0X00 MOVLW 0XFF TRIS 0X05 ;l’istruzione TRIS fa parte di istruzioni speciali; a questo comando è associato sempre l’indirizzo di PORT A, PORT B.. ; con esso non vengono settati i livelli logici delle porte ma solo la direzione. Ciò vuol dire che quando si utilizza TRIS, si ;fa riferimento ai registri TRIS A e TRISB del bank1. In questo caso, il riferimento è a TRISA all’indirizzo 0x85 CRLW TRIS 0X06 ;il dato 0x00 nell’accumulatore viene trasferito al registro TRISB portando tutte i bit di B come OUTPUT MOVF 0x86,W ……………………………………………il resto del programma è uguale al precedente
  • 10. Registro STATUS  Si trova all’indirizzo 03h e, i bit che lo compongono sono dei veri e propi flag  Bit 0 flag di Carry/Barrow. Segnala un riporto/ prestito nelle operazioni di somma e sottrazione su otto bit  Bit 1 flag di Digit Carry/Barrow. Segnala un riporto/prestito sul nibble basso nelle operazioni di somma e sottrazioni.  Bit 2 flag di zero : è 1 se il risultato dell’operazione logico/aritmetica precedente è zero altrimenti è 0  Bit 3 flag di Power Down, va a 1 durante la temporizzazione di power-up o nell’istruzione di azzeramento del Watch dog ,CLRWDT; durante l’istruzione di SLEEP, istruzione di attesa, viene riportato a zero  Bit 4 flag di Time out, va a 1 durante il power Out o per CLRWDT. Il bit 4 con il bit 3 sono i bit di STATUS che non possono essere scritti ma solo letti  Bit 5 e bit 6 sono quelli che selezionano i banchi. Se entrambi 0, siamo nel bank0, se RP0=1 e RP1=0, allora siamo nel bank1. Altre combinazioni di RP0 e RP1 sono utili solo in caso di pic con un numero di banchi superiori  Bit 6 non è utilizzato nel caso di pic 16f84 e pic16f628. Serve per l’indirizzamento indiretto. Verrà approfondito più avanti Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 IRP RP1 RP0 TO PD Z DC C
  • 11. Il registro PCL  Nella seconda parte del programma compare il program counter all’indirizzo 002h. Questo registro si aggiorna ogni volta che viene eseguita una nuova operazione. In esso è scritto l’indirizzo dell’istruzione successiva da eseguire. È un registro a 13 bit di cui, gli 8 bit meno significativi, si trovano all’indirizzo 002h, i 5 più significativi in un altro indirizzo detto PCLATH all’indirizzo 0Ah  Il program counter è utile nelle istruzioni di salto.  Ogni volta che c’è un’istruzione di salto GOTO n o CALL, il PC assume il valore dell’indirizzo di istruzione di salto ponendo il valore dell’istruzione successiva nello stack. Terminata l’istruzione di salto (subroutine), il PC acquisisce dallo stack l’indirizzo dell’istruzione dove si era interrotto per ritornare all’esecuzione normale del programma  In corrispondenza dell’istruzione ADDWF 0X02,f il PC ha valore 0X0A che è l’indirizzo dell’istruzione successiva.  Ma, in seguito all’istruzione di riga, il PC assume il valore del risultato della somma tra il contenuto di w e quello di PC.  Questo nuovo risultato è l’indirizzo del contenuto della tabella  Eseguita l’istruzione, il programma ritorna all’istruzione dove si era interrotto
  • 12. Esecuzione del programma passo passo Indiririzzo istruzione PC istruzione Registro Stato bit nel registro 000 0x01 MOVLW 0xff W 1 1 1 1 1 1 1 1 001 0x02 MOVWF 0x85 TRISA 1 1 1 1 1 1 1 1 002 0x03 CLRW W 0 0 0 0 0 0 0 0 003 0x04 MOVWF 0x86 TRISB 0 0 0 0 0 0 0 0 004 0x05 MOVF 0X05,W W 0 0 0 0 0 0 1 1 005 0x06 ANDLW 0X0F W 0 0 0 0 0 0 1 1 006 0x07 CALL TABLE 009 0x0A ADDWF 0X02 ,1 pcl 0 0 0 0 1 1 0 0 00d 0x07 RETLW w 1 0 0 1 1 1 1 1 007 0x08 PORTB PORTB 1 0 0 1 1 1 1 1 008 0x04 GOTO S1 Abbiamo supposto che l’ingresso su port a sia 11 binario. 00D=00A+003 00A è il contenuto del program counter, 003 è l’ingresso in formato decimale che viene inserito su RA in formato binario. Il programma non esegue l’istruzione in 00A ma quella in 00D
  • 13. Retlw  Nella slide precedente, si è visto che l’istruzione ADDWF 0X02, 1 somma il contenuto di W con quello del PC, di indirizzo 0x02 e, pone il risultato nel PC  In questo modo, il program counter ha l’indirizzo nuovo che corrisponde a 0x0d dove c’è l’istruzione RETLW 10011111  Retlw scarica dallo stack l' indirizzo di ritorno salvato dalla call e rientra ponendo in W il suo contenuto  Questo contenuto viene trasferito in PORTB che setta i livelli logici delle uscite RB per far accendere determinati segmenti del display a sette segmenti a c.c. In questo caso, il numero 3
  • 14. In conclusione  Per questo programma è stato necessario conoscere i seguenti registri:  W  PC bank0 0x02  PORTA bank0 0x05  PORTB bank0 0x06  TRISA bank1 0x85  TRISB bank1 0x86  STATUS bank0 0x03