PROGRAMMAZIONE ASSEMBLER



Documenti analoghi
Lezione 8. Figura 1. Configurazione del registro INTCON

Lezione 4. Figura 1. Schema di una tastiera a matrice di 4x4 tasti

PROCESSOR 16F84A. ;configurazione FUSES: oscillatore XT, WDT disabilitato PWRT abilitato, CP disabilitato config 0x3FF1

CIRCUITO DI TEST E SOFTWARE UTILIZZATI

INTRODUZIONE alla PROGRAMMAZIONE di MICROCONTROLLORI

8 Microcontrollori PIC

Lezione 1 Caratteristiche principali del PIC16C84 L'hardware

ESERCIZI SUI SISTEMI DI NUMERAZIONE

CPU. Maurizio Palesi

4 3 4 = 4 x x x 10 0 aaa

MICROCONTROLLORE PIC16F84A

LABORATORIO DI SISTEMI

A/D CON PIC 16F877. Sommario INTRODUZIONE... 2 SELEZIONARE I BANCHI... 2 ADCON ADCS1, ADCS CH2, CH1 E CH GO/DONE... 6 ADON...

Architettura del PIC 18F452

PUNTATORE LASER AUTOMATICO CON COMANDO VIA ETHERNET

Il processore. Il processore. Il processore. Il processore. Architettura dell elaboratore

Arduino: Programmazione

Calcolatori Elettronici. La Pipeline Criticità sui dati Criticità sul controllo Cenni sull unità di controllo

Powered by: Relators:

Laboratorio di Informatica

ARCHITETTURE MICROPROGRAMMATE. 1. Necessità di un architettura microprogrammata 1. Cos è un architettura microprogrammata? 4

Introduzione ai microcontrollori PIC

Architettura del calcolatore

Gestione della memoria centrale

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

Ing. Paolo Domenici PREFAZIONE

Architettura hardware

Laboratorio di Informatica

Invio SMS. DM Board ICS Invio SMS

Dispensa di Informatica I.1

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Esempio: aggiungere j

APPUNTI SUL PIC16F84

Microcontrollori. L ultima parte del corso prevede un approfondimento sui microprocessori, in particolare sul PIC 16F876.

Architettura di un sistema di calcolo

Gestione Risorse Umane Web

Esercizi di verifica del debito formativo:

I microcontrollori. In sostanza i pic hanno le seguenti caratteristiche:

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

STRUTTURE DEI SISTEMI DI CALCOLO

DMA Accesso Diretto alla Memoria

Il µcontrollore PIC 16F84

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

File, Modifica, Visualizza, Strumenti, Messaggio

Corso di Sistemi di Elaborazione delle informazioni

Introduzione all'architettura dei Calcolatori

Introduzione. Corso di Informatica Applicata. Università degli studi di Cassino

Lezione n.19 Processori RISC e CISC

FONDAMENTI di INFORMATICA L. Mezzalira

Ciclo di Istruzione. Ciclo di Istruzione. Controllo. Ciclo di Istruzione (diagramma di flusso) Lezione 5 e 6

Verificare il funzionamento delle memorie RAM Saper effettuare misure di collaudo. Dip switch Pulsante n.a. Octal tri-state buffer IC2 = MM 2114

Corso di Calcolatori Elettronici I A.A Il processore Lezione 18

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

IRSplit. Istruzioni d uso 07/10-01 PC

Manuale d uso per la raccolta: Monitoraggio del servizio di Maggior Tutela

5-1 FILE: CREAZIONE NUOVO DOCUMENTO

Struttura del calcolatore

Fasi di creazione di un programma

Testi di Esercizi e Quesiti 1

L amministratore di dominio

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Una volta inseriti tutti i parametri necessari premere.

Architettura della CPU e linguaggio assembly Corso di Abilità Informatiche Laurea in Fisica. prof. ing. Corrado Santoro

Il memory manager. Gestione della memoria centrale

Calcolatori Elettronici. La memoria gerarchica La memoria virtuale

INFORMATICA 1 L. Mezzalira

introduzione I MICROCONTROLLORI

Memorie ROM (Read Only Memory)

Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise

Architettura di un calcolatore

Esercizi per il recupero del debito formativo:

C. P. U. MEMORIA CENTRALE

Dispense di Informatica per l ITG Valadier

La memoria centrale (RAM)

APP RIO8 APP PER LA CONFIGURAZIONE GUIDA PER L UTENTE. Omniabit s.r.l. Via Val Camonica 11, Milan, Italy support@omniabit.

Quinto Homework. Indicare il tempo necessario all'esecuzione del programma in caso di avvio e ritiro fuori ordine.

La microarchitettura. Didattica della strumentazione digitale e sistemi a microprocessore anno accademico pagina 1

Esempio di moltiplicazione come somma e spostamento

Sistema operativo: Gestione della memoria

Laboratorio di Architettura degli Elaboratori - A.A. 2012/13

Corso PLC - Manuale Pratico 1

Architettura di un calcolatore: introduzione

Esame di INFORMATICA

Programmazione del microcontrollore PIC 16F84

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Consiglio regionale della Toscana. Regole per il corretto funzionamento della posta elettronica

Architettura hw. La memoria e la cpu

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database

Manuale Terminal Manager 2.0

Classe 3a INF - Esecuzione di un interrupt: ricostruzione delle operazioni al calcolatore con Turbo Debugger

Coordinazione Distribuita

Figura 1 Le Icone dei file di Excel con e senza macro.

INSTALLAZIONE NUOVO CLIENT TUTTOTEL (04 Novembre 2014)

L architettura di riferimento

Sottosistema di Ingresso/Uscita (I/O)

Introduzione. Corso di Informatica Applicata. Università degli studi di Cassino

OSCILLATORI AL QUARZO: CONTASECONDI

Transcript:

PROGRAMMAZIONE ASSEMBLER Esempio di semplice lampeggiatore a LED 072805 Sistemi Elettronici Dicembre 2006 Ultimo aggiornamento: 11 dicembre 2006 1

OBBIETTIVI 1 Discutere delle metodologie di progetto e dei sistemi di sviluppo hw/sw di applicazioni basate sui microcontrollori 2 Realizzare un semplice circuito che accende e spegne un diodo LED a intervalli regolari di tempo basato su microcontrollori Microchip PIC 3 Acquisire una maggiore familiarità con il linguaggio assembler per microcontrollori 4 Approfondire la conoscenza dell architettura interna del micro necessaria per comprendere la struttura del firmware assembler 5 Mettere in evidenza i punti di forza e gli svantaggi della programmazione tramite linguaggio macchina. 2

IL MICROCONTROLLORE PIC16F84A HIGH PERFORMANCE RISC CPU FEATURES Only 35 single word instructions to learn Operating speed: DC - 20 MHz clock input 1024 words of program memory 68 bytes of Data RAM 64 bytes of Data EEPROM 14-bit wide instruction words 8-bit wide data bytes 15 Special Function Hardware registers Eight-level deep hardware stack Direct, indirect and relative addressing modes Four interrupt sources: - External RB0/INT pin - TMR0 timer overflow - PORTB<7:4> interrupt-on-change PERIPHERAL FEATURES 13 I/O pins with individual direction control High current sink/source for direct LED drive - 25 ma sink max. per pin - 25 ma source max. per pin TMR0: 8-bit timer/counter with 8-bit programmable prescaler CMOS ENHANCED FLASH/EEPROM TECHNOLOGY Low power, high speed technology Fully static design Wide operating voltage range: - Commercial: 2.0V to 5.5V - Industrial: 2.0V to 5.5V Low power consumption: - < 2 ma typical @ 5V, 4 MHz - 15 ma typical @ 2V, 32 khz - < 0.5 ma typical standby current @ 2V SPECIAL MCU FEATURES In-Circuit Serial Programming (ICSP ) Power-on Reset, Power-up Timer, Oscillator Start-up Timer Watchdog Timer with On-Chip RC oscillator Code protection Power saving SLEEP mode Selectable oscillator options 3

PIN E PERIFERICHE INTERNE RA2 RA3 1 2 PORTA PC PORTA 18 17 RA1 RA0 RA4/RTCC MCLR/Vpp 5 Vss 3 4 POWER-UP TIMER START-UP TIMER POWER ON RESET WDT TIMER0 STACK OSC 16 15 14 OSC1/CLKIN OSC2/CLKOUT Vdd RB0/INT RB1 RB2 RB3 6 7 8 9 PORTB EEPROM Program Mem EEPROM Data Mem REG. FILE W ALU PORTB 13 12 11 10 RB7 RB6 RB5 RB4 4

DESIGN FLOW SCRITTURA DEL MICRO FILE.HEX FIRMWARE OK SCRITTURA DEL CODICE ASSEMBLER COMPILAZIONE FILE.COD SIMULAZIONE E DEBUG FIRMWARE ERRATO 5

Ogni microcontrollore dispone di specifici pin per la programmazione, in genere è possibile programmare il micro anche quando già montato sul circuito finale (In-Circuit-Programming) PROGRAMMATORI STAND-ALONE DEVELOPMENT-BOARD 9

LO SCHEMA ELETTRICO 10

DIRETTIVE INIZIALI PROCESSOR RADIX 16F84A DEC E una direttiva per il compilatore che definisce il microcontrollore per cui si sta scrivendo il codice INCLUDE "P16F84A.INC" ;----------- COSTANTI SIMBOLICHE ------------- LED EQU 0 ;---------- DEFINIZIONE VARIABILI -------------- ORG 0CH Count RES 2 Indica al compilatore che tutti i numeri sono in notazione decimale, salvo se diversamente specificato Include nel sorgente del programma il file P16F84A.INC che contiene tutte costanti simboliche utilizzate nella programmazione 13

DIRETTIVE INIZIALI PROCESSOR RADIX 16F84A DEC E una direttiva per il compilatore che definisce il microcontrollore per cui si sta scrivendo il codice INCLUDE "P16F84A.INC" ;----------- COSTANTI SIMBOLICHE ------------- LED EQU 0 ;---------- DEFINIZIONE VARIABILI -------------- ORG 0CH Count RES 2 Indica al compilatore che tutti i numeri sono in notazione decimale, salvo se diversamente specificato Include nel sorgente del programma il file P16F84A.INC che contiene tutte costanti simboliche utilizzate nella programmazione 14

DIRETTIVE INIZIALI PROCESSOR RADIX 16F84A DEC E una direttiva per il compilatore che definisce il microcontrollore per cui si sta scrivendo il codice INCLUDE "P16F84A.INC" ;----------- COSTANTI SIMBOLICHE ------------- LED EQU 0 ;---------- DEFINIZIONE VARIABILI -------------- ORG 0CH Count RES 2 Indica al compilatore che tutti i numeri sono in notazione decimale, salvo se diversamente specificato Include nel sorgente del programma il file P16F84A.INC che contiene tutte costanti simboliche utilizzate nella programmazione 15

IL FILE INCLUDE P16F84A.INC 16

DIRETTIVE INIZIALI PROCESSOR RADIX INCLUDE 16F84A DEC "P16F84A.INC" Definisce una costante simbolica per una maggiore comodità di programmazione. Da questo punto in poi all etichetta LED è associato 0 ;----------- COSTANTI SIMBOLICHE ------------- LED EQU 0 ;---------- DEFINIZIONE VARIABILI -------------- ORG 0CH Count RES 2 E una direttiva che serve per decidere in quale parte della memoria dati verranno allocate le variabili dichiarate di seguito Riserviamo due byte di file register alla variabile Count nell area dati 17

DIRETTIVE INIZIALI PROCESSOR RADIX INCLUDE 16F84A DEC "P16F84A.INC" Definisce una costante simbolica per una maggiore comodità di programmazione. Da questo punto in poi all etichetta LED è associato 0 ;----------- COSTANTI SIMBOLICHE ------------- LED EQU 0 ;---------- DEFINIZIONE VARIABILI -------------- ORG 0CH Count RES 2 E una direttiva che serve per decidere in quale parte della memoria dati verranno allocate le variabili dichiarate di seguito Riserviamo due byte di file register alla variabile Count nell area dati 18

DIRETTIVE INIZIALI PROCESSOR RADIX INCLUDE 16F84A DEC "P16F84A.INC" Definisce una costante simbolica per una maggiore comodità di programmazione. Da questo punto in poi all etichetta LED è associato 0 ;----------- COSTANTI SIMBOLICHE ------------- LED EQU 0 ;---------- DEFINIZIONE VARIABILI -------------- ORG 0CH Count RES 2 E una direttiva che serve per decidere in quale parte della memoria dati verranno allocate le variabili dichiarate di seguito Riserviamo due byte di file register alla variabile Count nell area dati 19

COSA ABBIAMO FATTO FINO AD ORA? Sostanzialmente quasi nulla!!! Il programma vero e proprio non è ancora cominciato, infatti non è apparsa ancora alcuna istruzione, ma abbiamo solo scritto direttive. Le direttive sono servite a: Dare al compilatore alcune istruzioni per compilare il firmware Riservare dello spazio nella memoria per la variabile Count Definire una costante simbolica: LED == 0 20

IMPOSTAZIONE DEI REGISTRI Direttiva che stabilisce in quale punto della memoria programmi inserire le successive istruzioni. ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 movlw 00011111B movwf TRISA Mette a 1 il bit RP0 del registro STATUS che stabilisce a quale banco del file register ci si riferisce. Stiamo infatti per agire suiregistritrisa e TRISB che stanno nel banco 1 movlw movwf bcf bsf 11111110B TRISB STATUS,RP0 PORTB,LED Copia nel registro W il byte 00011111 (tutti i pin della porta A sono degli input) Copia nel registro TRISA il contenuto di W precedentemente copiato 21

IMPOSTAZIONE DEI REGISTRI Il programma che stiamo creando verrà allocato in questa porzione della memoria Possiamo far partire il programma dalla posizione 0000h senza ulteriori accorgimenti perché in questo caso non abbiamo intenzione di utilizzare gli interrupt. L interrupt vector si trova infatti all indirizzo 0004h. 22

IMPOSTAZIONE DEI REGISTRI Direttiva che stabilisce in quale punto della memoria programmi inserire le successive istruzioni. ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 movlw 00011111B movwf TRISA Mette a 1 il bit RP0 del registro STATUS che stabilisce a quale banco del file register ci si riferisce. Stiamo infatti per agire suiregistritrisa e TRISB che stanno nel banco 1 movlw movwf bcf bsf 11111110B TRISB STATUS,RP0 PORTB,LED 23

IMPOSTAZIONE DEI REGISTRI Direttiva che stabilisce in quale punto della memoria programmi inserire le successive istruzioni. ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 movlw 00011111B movwf TRISA Mette a 1 il bit RP0 del registro STATUS che stabilisce a quale banco del file register ci si riferisce. Stiamo infatti per agire suiregistritrisa e TRISB che stanno nel banco 1 movlw movwf bcf bsf 11111110B TRISB STATUS,RP0 PORTB,LED Copia nel registro W il byte 00011111 (tutti i pin della porta A sono degli input) Copia nel registro TRISA il contenuto di W precedentemente copiato 24

IMPOSTAZIONE DEI REGISTRI Direttiva che stabilisce in quale punto della memoria programmi inserire le successive istruzioni. ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 movlw 00011111B movwf TRISA Mette a 1 il bit RP0 del registro STATUS che stabilisce a quale banco del file register ci si riferisce. Stiamo infatti per agire suiregistritrisa e TRISB che stanno nel banco 1 movlw movwf bcf bsf 11111110B TRISB STATUS,RP0 PORTB,LED Copia nel registro W il byte 00011111 (tutti i pin della porta A sono degli input) Copia nel registro TRISA il contenuto di W precedentemente copiato 25

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? movlw 00011111B movlw movwf 00011111B TRISA Il dato da memorizzare viene inviato verso l ALU ed il registro W Il dato viene memorizzato nel registro W 26

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? movlw 00011111B movlw movwf 00011111B TRISA 00011111B Il dato da memorizzare viene inviato verso l ALU ed il registro W Il dato viene memorizzato nel registro W 27

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? movlw 00011111B movlw movwf 00011111B TRISA 00011111B Il dato da memorizzare viene inviato verso l ALU ed il registro W 00011111B Il dato viene memorizzato nel registro W 28

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? movwf TRISA movlw movwf 00011111B TRISA Viene indirizzato il registro (TRISA) nel quale verrà salvato il dato 00011111B Il dato precedentemente memorizzato in W ripassa attraverso l ALU e raggiunge quindi il bus per essere memorizzato nel registro TRISA 29

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? movwf TRISA movlw movwf 00011111B TRISA IND. TRISA Viene indirizzato il registro (TRISA) nel quale verrà salvato il dato 00011111B Il dato precedentemente memorizzato in W ripassa attraverso l ALU e raggiunge quindi il bus per essere memorizzato nel registro TRISA 30

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? movwf TRISA movlw movwf 00011111B TRISA IND. TRISA Viene indirizzato il registro (TRISA) nel quale verrà salvato il dato 00011111B 00011111B Il dato precedentemente memorizzato in W ripassa attraverso l ALU e raggiunge quindi il bus per essere memorizzato nel registro TRISA 31

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? L istruzione viene caricata dalla memoria all istruction register muovi 00011111B in TRISA 32

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? L istruzione viene caricata dalla memoria all istruction register muovi 00011111B in TRISA IND. TRISA E possibile indirizzare il registro di destinazione e contemporaneamente inviare il dato da memorizzare? 00011111B 00011111B 00011111B 33

PERCHE PER COPIARE UN DATO IN UN REGISTRO DOBBIAMO PASSARE DA W? L istruzione viene caricata dalla memoria all istruction register muovi 00011111B in TRISA INDIRIZZO DATO E possibile indirizzare il registro di destinazione e contemporaneamente inviare il dato da memorizzare? NO, non ci possiamo permettere di mandare dato ed indirizzo contemporaneamente!! 00011111B 00011111B 34

E UN PROBLEMA LEGATO ALLA DIMENSIONE DELL OPCODE Per i microcontrollori PIC l opcode è grande 14 bit. Per eseguire l operazione di copia di un valore numerico direttamente in un registro servirebbero: 8 bit per il dato da copiare (lavoriamo con dati a 8 bit) 7 bit per specificare il registro (il file register è diviso in banchi da 127 celle, quindi si indirizza con 7 bit) 6 bit per indicare l operazione da utilizzare (il microcontrollore in esame ha 35 istruzioni, quindi si indica l istruzione con 6 bit) 21 bit (quindi servono 2 istruzioni per svolgere l operazione) 35

IMPOSTAZIONE DEI REGISTRI Copia in W il numero 11111110B (B indica che si sta fornendo il numeroin formatobinario) ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 Si copia il contenuto di W nel registro TRISB (tutti, tranne il pin 0 a cui collegheremo il LED, sono inpostati come input) movlw movwf movlw movwf bcf bsf 00011111B TRISA 11111110B TRISB STATUS,RP0 PORTB,LED Bit RP0 del registro STATUS = 0 (torniamonelbanco0 del file register) Accendo il LED collegato al pin RB0 mettendo a 1 il relativo bit del registro PORTB 36

IMPOSTAZIONE DEI REGISTRI Copia in W il numero 11111110B (B indica che si sta fornendo il numeroin formatobinario) ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 Si copia il contenuto di W nel registro TRISB (tutti, tranne il pin 0 a cui collegheremo il LED, sono inpostati come input) movlw movwf movlw movwf bcf bsf 00011111B TRISA 11111110B TRISB STATUS,RP0 PORTB,LED Bit RP0 del registro STATUS = 0 (torniamonelbanco0 del file register) Accendo il LED collegato al pin RB0 mettendo a 1 il relativo bit del registro PORTB 37

IMPOSTAZIONE DEI REGISTRI Copia in W il numero 11111110B (B indica che si sta fornendo il numeroin formatobinario) ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 Si copia il contenuto di W nel registro TRISB (tutti, tranne il pin 0 a cui collegheremo il LED, sono inpostati come input) movlw movwf movlw movwf bcf bsf 00011111B TRISA 11111110B TRISB STATUS,RP0 PORTB,LED Bit RP0 del registro STATUS = 0 (torniamonelbanco0 del file register) Accendo il LED collegato al pin RB0 mettendo a 1 il relativo bit del registro PORTB 38

IMPOSTAZIONE DEI REGISTRI Copia in W il numero 11111110B (B indica che si sta fornendo il numeroin formatobinario) ;-------- IMPOSTAZIONE DEI REGISTRI ------ ORG 00H bsf STATUS,RP0 Si copia il contenuto di W nel registro TRISB (tutti, tranne il pin 0 a cui collegheremo il LED, sono inpostati come input) movlw movwf movlw movwf bcf bsf 00011111B TRISA 11111110B TRISB STATUS,RP0 PORTB,LED Bit RP0 del registro STATUS = 0 (torniamonelbanco0 del file register) Accendo il LED collegato al pin RB0 mettendo a 1 il relativo bit del registro PORTB 39

CORPO DEL PROGRAMMA ;--------------------- MAIN -------------------- Main call Delay btfsc PORTB,LED SetToZero Etichetta Main. Serve come riferimento per funzioni di tipo Goto Chiama una routine che genera un ritardo di tempo costante Btfsc = Bit Test Flag Skip Clear Controlla lo stato attuale del pin a cui è collegato il LED. Se il LED è spento (uscita clear) salta la successiva istruzione. bsf SetToZero bcf PORTB,LED Main PORTB,LED Main Nel caso in cui il LED sia spento, il LED viene acceso ed infine l istruzione rimanda all inizio della routine. Nel caso invece in cui il led sia acceso l istruzione manda nella subroutine SetToZero dove il LED viene spento. Infine si ritorna anche in questo caso all inizio del Main. 40

CORPO DEL PROGRAMMA ;--------------------- MAIN -------------------- Main call Delay btfsc PORTB,LED SetToZero Etichetta Main. Serve come riferimento per funzioni di tipo Goto Chiama una routine che genera un ritardo di tempo costante Btfsc = Bit Test Flag Skip Clear Controlla lo stato attuale del pin a cui è collegato il LED. Se il LED è spento (uscita clear) salta la successiva istruzione. bsf SetToZero bcf PORTB,LED Main PORTB,LED Main Nel caso in cui il LED sia spento, il LED viene acceso ed infine l istruzione rimanda all inizio della routine. Nel caso invece in cui il led sia acceso l istruzione manda nella subroutine SetToZero dove il LED viene spento. Infine si ritorna anche in questo caso all inizio del Main. 41

CORPO DEL PROGRAMMA ;--------------------- MAIN -------------------- Main call Delay btfsc PORTB,LED SetToZero Etichetta Main. Serve come riferimento per funzioni di tipo Goto Chiama una routine che genera un ritardo di tempo costante Btfsc = Bit Test Flag Skip Clear Controlla lo stato attuale del pin a cui è collegato il LED. Se il LED è spento (uscita clear) salta la successiva istruzione. bsf SetToZero bcf PORTB,LED Main PORTB,LED Main Nel caso in cui il LED sia spento, il LED viene acceso ed infine l istruzione rimanda all inizio della routine. Nel caso invece in cui il led sia acceso l istruzione manda nella subroutine SetToZero dove il LED viene spento. Infine si ritorna anche in questo caso all inizio del Main. 42

ISTRUZIONE btfsc ( ) istruzione -1 istruzione 0 btfsc PORTB,LED il bit PORTB,LED == 0? SI NO istruzione 1 istruzione 2 ( ) 43

if IN ASSEMBLER test registro,bit salto VERO L istruzione di test in assembler esegue il controllo sul valore di un bit e a seconda del risultato: - l esecuzione del firmware prosegue inalterata ma viene saltata l istruzione successiva al test salto etichetta FALSO - l esecuzione del firmware prosegue inalterata E necessario quindi organizzare correttamente la struttura del firmware dotandola di opportuni salti al fine di gestire l istruzione di test etichetta fine dell if 44

if IN ASSEMBLER test registro,bit VERO salto VERO L istruzione di test in assembler esegue il controllo sul valore di un bit e a seconda del risultato: - l esecuzione del firmware prosegue inalterata ma viene saltata l istruzione successiva al test salto etichetta FALSO - l esecuzione del firmware prosegue inalterata E necessario quindi organizzare correttamente la struttura del firmware dotandola di opportuni salti al fine di gestire l istruzione di test etichetta fine dell if 45

if IN ASSEMBLER test registro,bit FALSO salto VERO L istruzione di test in assembler esegue il controllo sul valore di un bit e a seconda del risultato: - l esecuzione del firmware prosegue inalterata ma viene saltata l istruzione successiva al test salto etichetta FALSO - l esecuzione del firmware prosegue inalterata E necessario quindi organizzare correttamente la struttura del firmware dotandola di opportuni salti al fine di gestire l istruzione di test etichetta fine dell if 46

CORPO DEL PROGRAMMA ;--------------------- MAIN -------------------- Main call btfsc bsf SetToZero bcf FineIf Delay PORTB,LED SetToZero PORTB,LED FineIf PORTB,LED Main ATTENZIONE!!!! Versione alternativa NON ottimizzata e non utilizzata nel seguito. 47

CORPO DEL PROGRAMMA ;--------------------- MAIN -------------------- Main call Delay btfsc PORTB,LED SetToZero Etichetta Main. Serve come riferimento per funzioni di tipo Goto Chiama una routine che genera un ritardo di tempo costante Btfsc = Bit Test Flag Skip Clear Controlla lo stato attuale del pin a cui è collegato il LED. Se il LED è spento (uscita clear) salta la successiva istruzione. bsf SetToZero bcf PORTB,LED Main PORTB,LED Main Nel caso in cui il LED sia spento, il LED viene acceso ed infine l istruzione rimanda all inizio della routine. Nel caso invece in cui il led sia acceso l istruzione manda nella subroutine SetToZero dove il LED viene spento. Infine si ritorna anche in questo caso all inizio del Main. 48

CORPO DEL PROGRAMMA ;--------------------- MAIN -------------------- Main call Delay btfsc PORTB,LED SetToZero Etichetta Main. Serve come riferimento per funzioni di tipo Goto Chiama una routine che genera un ritardo di tempo costante Btfsc = Bit Test Flag Skip Clear Controlla lo stato attuale del pin a cui è collegato il LED. Se il LED è spento (uscita clear) salta la successiva istruzione. bsf SetToZero bcf PORTB,LED Main PORTB,LED Main Nel caso in cui il LED sia spento, il LED viene acceso ed infine l istruzione rimanda all inizio della routine. Nel caso invece in cui il led sia acceso l istruzione manda nella subroutine SetToZero dove il LED viene spento. Infine si ritorna anche in questo caso all inizio del Main. 49

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Delay clrf Count clrf Count+1 DelayLoop decfsz Count,1 DelayLoop decfsz Count+1,1 DelayLoop return Azzera la prima e poi la seconda cella di memoria riservate all inizio per la variabile Count. L azzeramento della cella, caso particolare di scrittura di dati, può essere eseguito con una solo istruzione dedicata. Il problema dell opcode non si presenta in quanto non sono necessari gli 8 bit del dato (sempre = 0) END Count+1 0 Count 0 50

ISTRUZIONE decfsz ( ) istruzione -1 istruzione 0 Decfsz Count,1 Count = Count - 1 Count == 0? SI NO istruzione 1 istruzione 2 ( ) 51

52

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Decrementa di 1 il primo byte di Count, se, dopo il decremento, Count == 0 allora viene saltata la successiva istruzione. Altrimenti riesegue il decremento. Delay clrf clrf DelayLoop decfsz decfsz return END Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop 1 Count+1 0 Count 255 53

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Decrementa di 1 il primo byte di Count, se, dopo il decremento, Count == 0 allora viene saltata la successiva istruzione. Altrimenti riesegue il decremento. Delay clrf clrf DelayLoop decfsz decfsz return END Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop 2 Count+1 0 Count 254 54

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Decrementa di 1 il primo byte di Count, se, dopo il decremento, Count == 0 allora viene saltata la successiva istruzione. Altrimenti riesegue il decremento. Delay clrf clrf DelayLoop decfsz decfsz return END Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop 3 Count+1 0 Count 253 55

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Decrementa di 1 il primo byte di Count, se, dopo il decremento, Count == 0 allora viene saltata la successiva istruzione. Altrimenti riesegue il decremento. Delay clrf clrf DelayLoop decfsz decfsz return END Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop 255 Count+1 0 Count 1 56

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Il secondo byte di Count viene decrementato di 1 ogni volta che il primo byte si azzera. Anche qui, dopo 256 decrementi, si salta l istruzione. Delay clrf clrf DelayLoop decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop END Count+1 255 Count 0 57

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Il secondo byte di Count viene decrementato di 1 ogni volta che il primo byte si azzera. Anche qui, dopo 256 decrementi, si salta l istruzione. Delay clrf clrf DelayLoop decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop END Count+1 255 Count 0 58

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Decrementa di 1 il primo byte di Count, se, dopo il decremento, Count == 0 allora viene saltata la successiva istruzione. Altrimenti riesegue il decremento. Delay clrf clrf DelayLoop decfsz decfsz return END Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop 1 Count+1 255 Count 255 59

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Il secondo byte di Count viene decrementato di 1 ogni volta che il primo byte si azzera. Anche qui, dopo 256 decrementi, si salta l istruzione. Delay clrf clrf DelayLoop decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop END Count+1 1 Count 0 60

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Decrementa di 1 il primo byte di Count, se, dopo il decremento, Count == 0 allora viene saltata la successiva istruzione. Altrimenti riesegue il decremento. Delay clrf clrf DelayLoop decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop END Count+1 0 Count 0 61

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Delay clrf clrf DelayLoop decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop END Ritorna dalla routine nel Main. Segna la fine del programma 62

LA ROUTINE DELAY ;--------------------- DELAY -------------------- Delay clrf clrf DelayLoop decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop END Ritorna dalla routine nel Main. Segna la fine del programma 63

LA ROUTINE DELAY Delay DelayLoop clrf clrf decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop La routine Delay genera un ritardo di tempo sfruttando l esecuzione di cicli di istruzioni e la durata temporale di ognuna delle istruzioni. VANTAGGI 1. Il ritardo sintetizzato può essere molto preciso SVANTAGGI 1. La modifica del ritardo sintetizzato non è semplice 2. Il microcontrollore non può eseguire nessun altra istruzione mentre esegue la ruotine di ritardo (a meno di non utilizzare un interrupt che la interrompa) 3. Questo tipo di approccio non è facilmente utilizzabile con linguaggi ad alto livello 64

LA ROUTINE DELAY Quanto vale il ritardo sintetizzato? Leggendo il datasheet del microcontrollore è possibile conoscere la durata di ogni istruzione. In genere ogni istruzione dura 4 volte il periodo di clock (1 ciclo) del micro, ma ci sono alcune eccezioni, come le istruzioni, call e decfsz che possono durare 8 periodi di clock. Ipotiziamo un quarzo da 4 MHz. CLRF dura 1 ciclo, quindi 1 µs DECFSZ, quando non si verifica la condizione di salto della successiva istruzione dura 1 ciclo. Quando si verifica il salto dura 2 cicli. GOTO e RETURN durano sempre 2 cicli Delay DelayLoop clrf clrf decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop 2+[(1+2)*256-1+1+2]*256-1+2 = 197123 µs Volendo essere più precisi andrebbero anche considerati i tempi necessari alle istruzioni nel Main per chiamare la routine 65

PERCHE ALCUNE ISTRUZIONI POSSONO DURARE 1 O 2 CICLI? MEMORIA Programmi e Dati MEMORIA Programma CPU CPU MEMORIA Dati Von-Neumann Harvard 66

PERCHE ALCUNE ISTRUZIONI POSSONO DURARE 1 O 2 CICLI? La procedura di esecuzione di una singola istruzione qualunque è divisa in varie fasi e richiede un tempo totale per l esecuzione pari a 8 PERIODI DI CLOCK Al fine di velocizzare l esecuzione delle istruzioni i microcontrollori PIC utilizzano un architettura Harvard al posto della classica Von-Neumann. L architettura Harvard presenta memorie separate per dati e programma che vengono indirizzati tramite due bus distinti. DATI PROGRAMMA 67

Questa struttura permette, NELLA MAGGIOR PARTE DEI CASI, di eseguire contemporaneamente L ESECUZIONE di una istruzione e il FETCH dell istruzione successiva. Si tratta di una struttura di tipo PIPELINE a due livelli che permette di ottenere un RADDOPPIO DEL RATE DI ISTRUZIONI/s DEL MICRO TCY è un intervallo di tempo della durata di 4 periodi di clock 68

PROBLEMA la pipeline non funziona nel caso in cui il risultato dell istruzione deve essere quello di modificare il flusso di esecuzione del programma, ovvero quando l istruzione modifica il Program Counter Questo è infatti un caso in cui l istruzione decide quale sarà la prossima istruzione da eseguire e di conseguenza è necessario attendere la completa esecuzione del comando prima di fare nuovamente il fetch (se non si attende la fine della fase di execute del comando non si conosce l indirizzo dell istruzione da eseguire!!) Il fetch dell istruzione 4 viene eseguito durante l esecuzione dell istruzione 3 che è una Call. Il risultato del fetch è però inutile dato che la Call carica nel PC l indirizzo di una diversa successiva istruzione. Per questo motivo nel successivo TCY non c è nessuna istruzione da eseguire ma si deve eseguire il fetch dell istruzione indicata dalla Call L esecuzione del firmware prosegue normalmente 69

Le istruzioni in questa situazione e che quindi durano 2 TCY sono: CALL GOTO Classiche istruzioni di salto o di chiamata di una routine RETFIE RETLW RETURN Sono instruzioni che si utilizzano per tornare nel codice principale da una sub-routine generica o da quella di gestione di interrupt Ci sono invece alcune istruzioni la cui durata dipende dall esito di un test: DECFSZ INCFSZ Incrementano o decrementano un registro. Viene saltata la successiva istruzione se il risultato dell operazione è0 BTFSC BTFSS Controllano lo stato di un bit di un registro. Viene saltata la successiva istruzione a seconda del valore del bit letto. 70

IL FIRMWARE COMPLETO PROCESSOR 16F84A RADIX DEC INCLUDE "P16F84A.INC" Main call btfsc Delay PORTB,LED SetToZero LED EQU 0 ORG Count RES 2 0CH SetToZero bsf bcf PORTB,LED Main PORTB,LED Main ORG bsf movlw movwf movlw movwf bcf 00H STATUS,RP0 00011111B TRISA 11111110B TRISB STATUS,RP0 Delay DelayLoop clrf clrf decfsz decfsz return Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop bsf PORTB,LED END 71

SIMULAZIONE DEL CIRCUITO Simulazione del circuito tramite il programma Proteus 72

RISULTATI DELLA SIMULAZIONE Entrambi gli strumenti hanno un base dei tempi impostata su 20 ms/div Questo significa che un segnale della durata di 200 ms (poco più del nostro caso) occuperebbe 10 divisioni, cioè l intero schermo L analizzatore logico permette di misurare gli intervalli di tempo tramite l utilizzo di apposite guide (in figura in viola) Il risultato della misura viene riportato dallo strumento attraverso appositi display: 196 ms!! LA SIMULAZIONE CONFERMA IL CALCOLO ANALITICO 73

IL CIRCUITO COMPLETO 35 mm 30 mm 74

IL CIRCUITO COMPLETO IL MICROCONTROLLORE 75

IL CIRCUITO COMPLETO IL QUARZO E I CONDENSATORI PER L OSCILLATORE INTERNO 76

IL CIRCUITO COMPLETO IL LED E LA RESISTENZA DI LIMITAZIONE DELLA CORRENTE 77

IL CIRCUITO COMPLETO EXTERNAL POWER-ON RESET CIRCUIT 78

MODIFICA 1 AGGIUNTA DI UN PULSANTE Ci proponiamo di modificare leggermente e il firmware e lo schema elettrico aggiungendo un pulsante la cui pressione determini l inizio del lampeggiamento del LED. E IL FIRMWARE? Naturalmente per poter accorgersi della pressione del pulsante il pin RB7 deve essere configurato come un ingresso. Nel nostro caso questa impostazione era già stata fatta all inizio del firmware ORG bsf 00H STATUS,RP0 La modifica al circuito consiste semplicemente nel collegamento di un pulsante e resistenza di pull-up al pin RB7 movlw 00011111B movwf TRISA movlw 11111110B movwf TRISB RB0/INT RB1 RB2 RB3 RB7 RB6 RB5 RB4 1=INPUT 0=OUTPUT 79

MODIFICA 1 AGGIUNTA DI UN PULSANTE PROCESSOR RADIX DEC INCLUDE LED EQU 0 SWITCH EQU 7 ORG Count RES 2 Main "P16F84A.INC" 0CH 16F84A btfsc PORTB,SWITCH $-1 call btfsc (Continua ) Delay PORTB,LED SetToZero Definiamo una costante simbolica per semplificare la programmazione, da ora in poi potremo riferirci al pin della porta B cui è collegato l interruttore senza dover ricordare quale pin precisamente fosse, basterà scrivere PORTB,SWITCH Controlliamo lo stato del pin che inizialmente sarà alto per via del pull-up. Quando il pulsante verrà premuto il suo stato andrà basso e verrà saltato il successivo per proseguire nel resto del programma Questa istruzione manda il programma all istruzione che si trova all indirizzo attuale del program counter (cioè l attuale posizione) -1. E un modo comodo per saltare indietro di una istruzione senza dover inserire un etichetta e appesantire il codice 80

MODIFICA 1 AGGIUNTA DI UN PULSANTE PROCESSOR RADIX DEC INCLUDE LED EQU 0 SWITCH EQU 7 ORG Count RES 2 Main "P16F84A.INC" 0CH 16F84A btfsc PORTB,SWITCH $-1 call btfsc (Continua ) Delay PORTB,LED SetToZero Definiamo una costante simbolica per semplificare la programmazione, da ora in poi potremo riferirci al pin della porta B cui è collegato l interruttore senza dover ricordare quale pin precisamente fosse, basterà scrivere PORTB,SWITCH Controlliamo lo stato del pin che inizialmente sarà alto per via del pull-up. Quando il pulsante verrà premuto il suo stato andrà basso e verrà saltato il successivo per proseguire nel resto del programma Questa istruzione manda il programma all istruzione che si trova all indirizzo attuale del program counter (cioè l attuale posizione) -1. E un modo comodo per saltare indietro di una istruzione senza dover inserire un etichetta e appesantire il codice 81

MODIFICA 1 AGGIUNTA DI UN PULSANTE PROCESSOR RADIX DEC INCLUDE LED EQU 0 SWITCH EQU 7 ORG Count RES 2 Main "P16F84A.INC" 0CH 16F84A btfsc PORTB,SWITCH $-1 call btfsc (Continua ) Delay PORTB,LED SetToZero Definiamo una costante simbolica per semplificare la programmazione, da ora in poi potremo riferirci al pin della porta B cui è collegato l interruttore senza dover ricordare quale pin precisamente fosse, basterà scrivere PORTB,SWITCH Controlliamo lo stato del pin che inizialmente sarà alto per via del pull-up. Quando il pulsante verrà premuto il suo stato andrà basso e verrà saltato il successivo per proseguire nel resto del programma Questa istruzione manda il programma all istruzione che si trova all indirizzo attuale del program counter (cioè l attuale posizione) -1. E un modo comodo per saltare indietro di una istruzione senza dover inserire un etichetta e appesantire il codice 82

MODIFICA 1 - IL FIRMWARE COMPLETO PROCESSOR 16F84A RADIX DEC INCLUDE LED EQU 0 SWITCH EQU 7 ORG Count RES 2 ORG bsf movlw movwf movlw movwf bcf bsf "P16F84A.INC" 0CH 00H STATUS,RP0 00011111B TRISA 11111110B TRISB STATUS,RP0 PORTB,LED Main SetToZero Delay DelayLoop btfsc PORTB,SWITCH $-1 call Delay btfsc PORTB,LED SetToZero bsf PORTB,LED Main bcf PORTB,LED Main clrf Count clrf Count+1 decfsz Count,1 DelayLoop decfsz Count+1,1 DelayLoop return END 83

MODIFICA 2 UTILIZZO DI INTERRUPT L intento di questa seconda modifica è quello di gestire due diodi LED tramite due pulsanti. Ognuno dei due pulsanti sarà strettamente correlato ad uno dei due LED e la sua funzione sarà quella di avviare o fermare il lampeggiamento del LED stesso; il tutto in maniera indipendente dall altro LED. 84

MODIFICA 2 UTILIZZO DI INTERRUPT L intento di questa seconda modifica è quello di gestire due diodi LED tramite due pulsanti. Ognuno dei due pulsanti sarà strettamente correlato ad uno dei due LED e la sua funzione sarà quella di avviare o fermare il lampeggiamento del LED stesso; il tutto in maniera indipendente dall altro LED. 85

MODIFICA 2 UTILIZZO DI INTERRUPT L intento di questa seconda modifica è quello di gestire due diodi LED tramite due pulsanti. Ognuno dei due pulsanti sarà strettamente correlato ad uno dei due LED e la sua funzione sarà quella di avviare o fermare il lampeggiamento del LED stesso; il tutto in maniera indipendente dall altro LED. COME ORGANIZZARE IL NUOVO FIRMWARE? Il problema riguarda soprattutto la ruotine principale Main nella quale eseguiamo l operazione di lampeggiamento dei LED. Nell esempio iniziale, una volta acceso il circuito, non vi era nessun particolare evento che potesse disturbare l esecuzione del lampeggiamento. ORA LA SITUAZIONE E MOLTO DIVERSA IN QUANTO E NECESSARIO: 1 Verificare per ognuno dei due LED se esso debba o meno lampeggiare 2 Pilotare correttamente i LED per il lampeggiamento 3 Gestire gli eventi di pressione dei pulsanti di controllo che abilitano/fermano il lampeggiamento TUTTO QUANTO NELLA MANIERA PIU TRASPARENTE POSSIBILE, SENZA CIOE CHE IL LAMPEGGIAMENTO DEL LED NON COINVOLTO DALLA PRESSIONE DEL PULSANTE SI MODIFICHI SENSIBILMENTE!!! 86

MODIFICA 2 UTILIZZO DI INTERRUPT Analisi di alcuni possibili approcci al problema. Routine Main PULSANTE1 PREMUTO? Si Abilita lampeggiamento LED1 No Disabilita lampeggiamento LED1 PULSANTE2 PREMUTO? Si Abilita lampeggiamento LED2 No Disabilita lampeggiamento LED2 PROBLEMA 1 Queste istruzioni vengono eseguite ad ogni loop del Main, quindi influiscono SEMPRE sul lampeggiamento (il cui timing era stato così duramente calcolato nel primo esempio). Volendo potremmo anche tenerne conto ATTESA LED1 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla LED2 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla 87

MODIFICA 2 UTILIZZO DI INTERRUPT Analisi di alcuni possibili approcci al problema. Routine Main PROBLEMA 2 PULSANTE1 PREMUTO? Si Abilita lampeggiamento LED1 No Disabilita lampeggiamento LED1 PULSANTE2 PREMUTO? Si Abilita lampeggiamento LED2 No Disabilita lampeggiamento LED2 ATTESA LED1 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla CONTROLLO PULSANTE1 CONTROLLO PULSANTE2 Considerando i riflessi umani il pulsante viene tenuto premuto per circa 0,1 s. L attesa che abbiamo sintetizzato dura però 200ms (in genere non si scende molto al di sotto dato che vogliamo VEDERE il lampeggiamento). Quindi se la pressione non si verifica nell intervallo di tempo in cui controlliamo essa verrà persa!!! LED2 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla tempo 88

MODIFICA 2 UTILIZZO DI INTERRUPT Analisi di alcuni possibili approcci al problema. Routine Main PULSANTE1 PREMUTO? Si Abilita lampeggiamento LED1 No Disabilita lampeggiamento LED1 PULSANTE2 PREMUTO? Si Abilita lampeggiamento LED2 No Disabilita lampeggiamento LED2 1 µs A meno Su tutta di non la reiterare durata del il controllo ciclo il effettuandolo pulsante viene N volte letto prima solo di per: 1 µs passare oltre, l intervallo di tempo durante il quale si controlla dura 1 µs quanto una istruzione come BTFSS = 0,0005 % quindi 1 µs!!! 200.012 µs ATTESA LED1 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla LED2 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla 200 ms 5 µs 5 µs tempo Basterebbe tenere premuto il pulsante più a lungo per avere la certezza che il circuito se ne accorga però non dovrebbe essere l utilizzatore ad adattarsi alla macchina, ma il contrario!!! 89

MODIFICA 2 UTILIZZO DI INTERRUPT La soluzione. Routine Main MAIN INTERRUPT ATTESA LED1 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla PULSANTE1? Si Abilita lampeggiamento LED1 No Non fare nulla LED2 DEVE LAMPEGGIARE? Si Inverti il suo stato No Non fare nulla PULSANTE2? Si Abilita lampeggiamento LED2 No Non fare nulla 90

DIRETTIVE VARIABILI IMPOSTAZ. REGISTRI MAIN ROUTINE DELAY INTERRUPT 91

DIRETTIVE VARIABILI INTERRUPT IMPOSTAZ. REGISTRI MAIN ROUTINE DELAY 92

DIRETTIVE VARIABILI INTERRUPT COME MAI IL FIRMWARE NON PUO ESSERE ESEGUITO IN MANIERA PIU SEQUENZIALE? Quando si verifica un interrupt il micro cessa la normale esecuzione delle istruzioni e nel PC viene caricato l indirizzo 0004h dell interrupt vector IMPOSTAZ. REGISTRI MAIN Dato che prima dell interrupt vector c è spazio solo per 3 istruzioni tipicamente si inserisce all indirizzo 0000h un che punta all inizio vero e proprio del programma. ROUTINE DELAY 93

PROCESSOR RADIX INCLUDE 16F84A DEC "P16F84A.INC" LED1 EQU 0 LED2 EQU 1 SWITCH1 EQU 6 SWITCH2 EQU 7 ORG Count RES 2 QUALE RES 1 ORG 0CH 00H inizio LED1 RB0 LED2 RB1 SWITCH1 RB6 SWITCH2 RB7 Definiamo la variabile QUALE di un byte che useremo per stabilire se i LED devono o meno lampeggiare. Associamo il bit 1 al LED1 e il bit 2 al LED2. Il bit 1 viene modificato dallo SWITCH1 mentre il bit 2 dallo SWITCH2 Questa istruzione realizza quello che nello schema a blocchi è il salto in nero Come mai è necessario? QUALE 7 6 5 4 3 2 1 0 94

PROCESSOR RADIX INCLUDE 16F84A DEC "P16F84A.INC" LED1 EQU 0 LED2 EQU 1 SWITCH1 EQU 6 SWITCH2 EQU 7 ORG Count RES 2 QUALE RES 1 ORG 0CH 00H inizio LED1 RB0 LED2 RB1 SWITCH1 RB6 SWITCH2 RB7 Definiamo la variabile QUALE di un byte che useremo per stabilire se i LED devono o meno lampeggiare. Associamo il bit 1 al LED1 e il bit 2 al LED2. Il bit 1 viene modificato dallo SWITCH1 mentre il bit 2 dallo SWITCH2 Questa istruzione realizza quello che nello schema a blocchi è il salto in nero Come mai è necessario? QUALE 7 6 5 4 3 2 1 0 95

PROCESSOR RADIX INCLUDE 16F84A DEC "P16F84A.INC" LED1 EQU 0 LED2 EQU 1 SWITCH1 EQU 6 SWITCH2 EQU 7 ORG Count RES 2 QUALE RES 1 ORG 0CH 00H inizio LED1 RB0 LED2 RB1 SWITCH1 RB6 SWITCH2 RB7 Definiamo la variabile QUALE di un byte che useremo per stabilire se i LED devono o meno lampeggiare. Associamo il bit 1 al LED1 e il bit 2 al LED2. Il bit 1 viene modificato dallo SWITCH1 mentre il bit 2 dallo SWITCH2 Questa istruzione realizza quello che nello schema a blocchi è il salto in nero QUALE 7 6 5 4 3 2 1 0 96

DIRETTIVE VARIABILI INTERRUPT COME MAI IL FIRMWARE NON PUO ESSERE ESEGUITO IN MANIERA PIU SEQUENZIALE? Quando si verifica un interrupt il micro cessa la normale esecuzione delle istruzioni e nel PC viene caricato l indirizzo 0004h dell interrupt vector IMPOSTAZ. REGISTRI MAIN Dato che prima dell interrupt vector c è spazio solo per 3 istruzioni tipicamente si inserisce all indirizzo 0000h un che punta all inizio vero e proprio del programma. ROUTINE DELAY 97

inizio bsf movlw movwf movlw movwf movlw andwf movlw movwf bcf clrf STATUS,RP0 00011111B TRISA 11111100B TRISB 01111111B OPTION_REG,F 10000000B INTCON STATUS,RP0 QUALE Ora i LED sono 2, servono due output Imposta il registro OPTION_REG. Mettendo a zero il bit 7 imposta il pull-up resistivo interno sui pin della porta B (risparmiamo un resistore!!!) 98

OPERAZIONI DI MASCHERAMENTO CON OPERATORI LOGICI: AND 7 6 5 4 3 2 1 0 REGISTRO 1 0 1 1 0 0 1 0 AND COSTANTE 0 0 0 0 1 1 1 1 A and B = OUT REGISTRO 0 0 0 0 0 0 1 0 A B OUT 0 0 1 0 1 0 0 0 0 I bit vengono forzati a 0 I bit rimangono inalterati 1 1 1 99

inizio bsf movlw movwf movlw movwf movlw andwf movlw movwf bcf clrf STATUS,RP0 00011111B TRISA 11111100B TRISB 01111111B OPTION_REG,F 10000000B INTCON STATUS,RP0 QUALE Imposta il registro INTCON. Per il momento abilitiamo soltanto il Global Interrupt Enable (bit7) ma ancora non abilitiamo l interrupt specifico (che si abilita ponendo a 1 il bit3; il bit0 è il relativo flag) Azzero la variabile QUALE in modo che all inizio i LED non lampeggino INTCON 100

Main call bcf bsf Delay INTCON,0 INTCON,3 Chiama la routine Delay per dare il tempo alle impostazioni di divenire effettive (serve per evitare falsi interventi dell interrupt alla partenza). Solo successivamente viene attivato l interrupt e azzerato il relativo flag call btfss movlw xorwf Delay QUALE,1 led1_fermo 00000001B PORTB,F Controlla il bit1 della variabile QUALE: se è 1 salta la successiva istruzione e inverte lo stato del LED1 led1_fermo btfss movlw xorwf QUALE,2 Main 00000010B PORTB,F Main Invece di introdurre un ulteriore test che stabilisca la successiva istruzione da eseguire (bcf per azzerare o bsf per asserire). Invertiamo lo stato del bit direttamente sfruttando l ALU interna tramite l istruzione xorwf che effettua lo XOR tra il byte nel registro W e il contenuto di un registro, salvando il risultato nel registro stesso. A XOR 0 = A A XOR 1 =!A 101

Main call bcf bsf Delay INTCON,0 INTCON,3 Chiama la routine Delay per dare il tempo alle impostazioni di divenire effettive (serve per evitare falsi interventi dell interrupt alla partenza). Solo successivamente viene attivato l interrupt e azzerato il relativo flag call btfss movlw xorwf Delay QUALE,1 led1_fermo 00000001B PORTB,F Controlla il bit1 della variabile QUALE: se è 1 salta la successiva istruzione e inverte lo stato del LED1 led1_fermo btfss movlw xorwf QUALE,2 Main 00000010B PORTB,F Main Invece di introdurre un ulteriore test che stabilisca la successiva istruzione da eseguire (bcf per azzerare o bsf per asserire) invertiamo lo stato del bit sfruttando l ALU interna tramite l istruzione xorwf che effettua lo XOR tra il byte nel registro W e il contenuto di un registro, salvando il risultato nel registro stesso. A XOR 0 = A A XOR 1 =!A 102

OPERAZIONI DI MASCHERAMENTO CON OPERATORI LOGICI: XOR 7 6 5 4 3 2 1 0 REGISTRO 1 0 1 1 0 0 1 0 XOR COSTANTE 0 0 0 0 1 1 1 1 A xor B = OUT REGISTRO 1 0 1 1 1 1 0 1 A B OUT 0 0 1 0 1 0 0 1 1 I bit rimangono inalterati I bit vengono invertiti 1 1 0 103

call bcf bsf Delay INTCON,0 INTCON,3 Main call btfss movlw xorwf Delay QUALE,1 led1_fermo 00000001B PORTB,F Se invece il bit1 di QUALE dovesse essere 0 salta all etichetta led1_fermo led1_fermo btfss movlw xorwf QUALE,2 Main 00000010B PORTB,F Main Come prima controlla lo stato del bit2 della variabile QUALE che indica se il LED2 deve lampeggiare. Se il bit2 è 1 allora inverte lo stato del LED2 altrimenti torna all inizio del Main 104

call bcf bsf Delay INTCON,0 INTCON,3 Main call btfss movlw xorwf Delay QUALE,1 led1_fermo 00000001B PORTB,F Se invece il bit1 di QUALE dovesse essere 0 salta all etichetta led1_fermo led1_fermo btfss movlw xorwf QUALE,2 Main 00000010B PORTB,F Main Come prima controlla lo stato del bit2 della variabile QUALE che indica se il LED2 deve lampeggiare. Se il bit2 è 1 allora inverte lo stato del LED2 altrimenti torna all inizio del Main 105

ORG 04H Context Push Indica che le istruzioni seguenti verranno memorizzate a partire dall indirizzo 0004h, ovvero a partire dall interrupt vector btfsc movlw xorwf PORTB,SWITCH1 altro_led 00000010B QUALE,F fine_int altro_led btfsc movlw xorwf PORTB,SWITCH2 fine_int 00000100B QUALE,F fine_int Context Pop bcf retfie INTCON,0 106

CONTEXT SAVING Quando si entra nella routine di interrupt la prima operazione da eseguire, dopo aver disabilitato l interrupt per evitare nidificazioni, è quella del context saving Il salvataggio del contesto è infatti necessario al fine di garantire che l interrupt risulti TRASPARENTE al programma principale e non ne pregiudichi il funzionamento. ( ) movlw 11111100B movwf TRISB ( ) 107

CONTEXT SAVING Quando si entra nella routine di interrupt la prima operazione da eseguire, dopo aver disabilitato l interrupt per evitare nidificazioni, è quella del context saving Il salvataggio del contesto è infatti necessario al fine di garantire che l interrupt risulti TRASPARENTE al programma principale e non ne pregiudichi il funzionamento. ( ) movlw 11111100B movwf TRISB ( ) 108

CONTEXT SAVING Quando si entra nella routine di interrupt la prima operazione da eseguire, dopo aver disabilitato l interrupt per evitare nidificazioni, è quella del context saving Il salvataggio del contesto è infatti necessario al fine di garantire che l interrupt risulti TRASPARENTE al programma principale e non ne pregiudichi il funzionamento. ( ) INTERRUPT movlw 11111100B ( ) bsf movlw 5H W = 11111100B movwf TRISB movwf clrf ( ) ( ) 109

CONTEXT SAVING Quando si entra nella routine di interrupt la prima operazione da eseguire, dopo aver disabilitato l interrupt per evitare nidificazioni, è quella del context saving Il salvataggio del contesto è infatti necessario al fine di garantire che l interrupt risulti TRASPARENTE al programma principale e non ne pregiudichi il funzionamento. ( ) INTERRUPT movlw 11111100B ( ) bsf movlw 5H W = 11111100B W = 00000101B movwf TRISB movwf clrf ( ) TRISB = 00000101B ( ) 110

CONTEXT SAVING Quando si entra nella routine di interrupt la prima operazione da eseguire, dopo aver disabilitato l interrupt per evitare nidificazioni, è quella del context saving Il salvataggio del contesto è infatti necessario al fine di garantire che l interrupt risulti TRASPARENTE al programma principale e non ne pregiudichi il funzionamento. movlw 3 xorwf btfsc Variabile,W STATUS,Z Qui in mezzo non deve accadere nulla ai flag del registro di STATUS (in particolare a Z) altrimenti invalideremmo il test!!! ( ) 111

CONTEXT SAVING: COME APPLICARLO Il context saving viene eseguito semplicemente salvando in opportune variabili temporanee create appositamente il valore del registro W e del registro STATUS E necessario però effettuare l operazione utilizzando solamente istruzioni che non modifichino in alcun modo i flag del registro STATUS: ecco il motivo per cui si utilizza l istruzione SWAPF invece di una più intuitiva istruzione MOVF ORG 04H Context Push movwf W_TEMP swapf STATUS, W movwf STATUS_TEMP ( ) Context Pop bcf INTCON,0 retfie swapf STATUS_TEMP,W movwf STATUS swapf W_TEMP, F swapf W_TEMP, W Logicamente all inizio del programma è necessario definire le variabili STATUS_TEMP e W_TEMP 112

ORG 04H Context Push Indica che le istruzioni seguenti verranno memorizzate a partire dall indirizzo 0004h, ovvero a partire dall interrupt vector btfsc movlw xorwf PORTB,SWITCH1 altro_led 00000010B QUALE,F fine_int Controlla se è stato premuto il pulsante 1 (verifica che il relativo pin sia a 0). Se Si viene invertito il valore del bit1 della variabile QUALE che dice se il LED1 deve o no lampeggiare altro_led fine_int btfsc movlw xorwf PORTB,SWITCH2 fine_int 00000100B QUALE,F Se non è stato premuto il pulsante 1 viene controllato il pulsante 2. In linea di principio questo secondo controllo non sarebbe necessario, ma viene fatto per maggiore sicurezza. Context Pop bcf INTCON,0 retfie Alla fine della procedura di gestione dell interrupt viene riabilitato l interrupt azzerando il flag associato (ogni volta che si verifica l interrupt è necessario azzerare via firmware il flag per riattivarlo). 113

ORG 04H Context Push Indica che le istruzioni seguenti verranno memorizzate a partire dall indirizzo 0004h, ovvero a partire dall interrupt vector btfsc movlw xorwf PORTB,SWITCH1 altro_led 00000010B QUALE,F fine_int Controlla se è stato premuto il pulsante 1 (verifica che il relativo pin sia a 0). Se Si viene invertito il valore del bit1 della variabile QUALE che dice se il LED1 deve o no lampeggiare altro_led fine_int btfsc movlw xorwf PORTB,SWITCH2 fine_int 00000100B QUALE,F Se non è stato premuto il pulsante 1 viene controllato il pulsante 2. In linea di principio questo secondo controllo non sarebbe necessario, ma viene fatto per maggiore sicurezza. Context Pop bcf INTCON,0 retfie Alla fine della procedura di gestione dell interrupt viene riabilitato l interrupt azzerando il flag associato (ogni volta che si verifica l interrupt è necessario azzerare via firmware il flag per riattivarlo). 114

ORG 04H Context Push Indica che le istruzioni seguenti verranno memorizzate a partire dall indirizzo 0004h, ovvero a partire dall interrupt vector btfsc movlw xorwf PORTB,SWITCH1 altro_led 00000010B QUALE,F fine_int Controlla se è stato premuto il pulsante 1 (verifica che il relativo pin sia a 0). Se Si viene invertito il valore del bit1 della variabile QUALE che dice se il LED1 deve o no lampeggiare altro_led fine_int btfsc movlw xorwf PORTB,SWITCH2 fine_int 00000100B QUALE,F Se non è stato premuto il pulsante 1 viene controllato il pulsante 2. In linea di principio questo secondo controllo non sarebbe necessario, ma viene fatto per maggiore sicurezza. Context Pop bcf INTCON,0 retfie Alla fine della procedura di gestione dell interrupt viene riabilitato l interrupt azzerando il flag associato (ogni volta che si verifica l interrupt è necessario azzerare via firmware il flag per riattivarlo). 115

PROCESSOR RADIX INCLUDE LED1 EQU 0 LED2 EQU 1 SWITCH1 EQU 6 SWITCH2 EQU 7 ORG Count RES 2 QUALE RES 1 altro_led fine_int ORG ORG Context Push btfsc movlw xorwf btfsc movlw xorwf Context Pop 16F84A DEC "P16F84A.INC" 0CH 00H inizio 04H PORTB,SWITCH1 altro_led 00000010B QUALE,F fine_int PORTB,SWITCH2 fine_int 00000100B QUALE,F 1 inizio 1 2 3 4 5 bsf movlw movwf movlw movwf movlw andwf movlw movwf bcf STATUS,RP0 00011111B TRISA 11111100B TRISB 01111111B OPTION_REG 10000000B INTCON STATUS,RP0 Main led1_fermo Delay DelayLoop call bcf bsf call btfss movlw xorwf btfss movlw xorwf clrf clrf decfsz decfsz return Delay INTCON,0 INTCON,3 Delay QUALE,1 led1_fermo 00000001B PORTB,F QUALE,2 Main 00000010B PORTB,F Main Count Count+1 Count,1 DelayLoop Count+1,1 DelayLoop 4 bcf retfie INTCON,0 2 clrf QUALE 3 END 5 116