APPUNTI DI ASM PER PIC
|
|
|
- Antonietta Milani
- 8 anni fa
- Visualizzazioni
Transcript
1 APPUNTI DI ASM PER PIC Prefazione: questi sono gli appunti di un profano che ha iniziato a studiarsi l asm per pic senza avere nessuno o quasi conoscenza pregressa, mi scuso pertanto di eventuali imprecisioni ed errori. Il testo base di riferimento è il corso per pic di Tanzilli, di cui ho ampiamente attinto. Ho ampliato il discorso su alcuni aspetti del pic 16F876 anche se il riferimento principale resta il più semplice pic 16f84. STRUTTURA DEL PIC16F84 Come tutti i pic il 16F84 contiene i seguenti dispositivi: CPU = central process unit che interpreta le istruzioni del programma PROM = memoria programmabile di sola lettura (memorizza in modo permanente le info) RAM= memoria delle variabili utilizzate Linee I/O= ingresso uscita per pilotare dispositivi esterni Dispositivi ausiliari (clock, bus contatori etc) Il pic 16F84 ha 18 pin, quelli contrassegnati con Rxy indicano linee I/O, ad esempio : Ra1 = linea I/O bit 1 porta A Rb2 = linea I/O bit 2 porta B I V I RA I I 18...RA1 RA I I 17...RA0 RTCC/RA4 3 I I 16...OSC1/CLKIN MCLR/VPP 4 I I 15...OSC2/CLKOUT VSS I PIC I VDD + INT/RB0 6 I 16F84 I 13...RB7 RB I I 12...RB6 RB I I RB5 RB I I RB4 I I Vediamo alcuni pin speciali: - pin 3 RTCC/RA4 si può usare come linea di ingresso del contatore RTCC - pin 4 MCLR/VPP in condizioni di normale funzionamento agisce come reset (master clear), se il pic è posto in program mode è l ingresso della tensione di programmazione - pin 5 VSS - è il negativo - pin 6 INT/RB0 può essere programmato per generare Interrupt - pin 14VDD + è il positivo 1
2 - pin 15 OSC2/CLKOUT come connessione se viene utilizzato un quarzo per generare il clock, come uscita del clock se si utilizzano oscillatori esterni - pin16 OSC1/CLKIN come connessione se si usa un quarzo per generare il clock, come ingresso del clock se si usano oscillatori esterni Facciamo un esempio Tensione stabilizzata di 12V da questi i ricavano 5 volt che si inviano al pin 14 (VDD) come positivo ed al pin 5 (VSS) come negativo. Al pin 14 ( MCLR) si da una tensione di 5V che va a 0V in caso di reset Ai pn 16 e 15 si può collegare un quarzo ed ad una uscita I/O apparecchiature esterne LA PROGRAMMAZIONE DEL PIC NOZIONI GENERALI Un programma è una seguenza di istruzioni. Ogni istruzione è un codice operativo (OPCODE) composto da 14 bits. Ogni opcode è memorizzato in una locazione della memoria eeprom. Il pic 16F84 ha una eeprom di 1024 locazioni che contengono una sola istruzione o al massimo una istruzione + un dato (ad esempio indicazione label). Gli opcode vengono in genere rappresentati da una notazione hex. Per rendere più facile la compilazione del programma ad ogni opcode è associata una sigla mnemorica. Ad es 0100H = CLRW = Clear register W L insieme delle sigle mnemoriche che identificano gli opcodes inseriti nel programma sono il linguaggio assembler. Con l assembler, oltre alle istruzioni possiamo introdurre variabili, costanti e stringhe (label). Quello che otteniamo è una sorta di file testo (source o sorgente) che verrà tradotto delle istruzioni in opcode (HEX o BIN) tramite un programma assemblatore. Questi files testo possono essere scritti con programmi tipo notepad, ossia con programmi che consentono il salvataggio con estensione.txt. Il file di testo deve essere poi rinominato in estensione.asm ed inserito in una cartella contenente un file *.INC ( nel nostro caso pic16f84.inc) che contiene delle informazioni sulla struttura del pic utilizzato. Si mette quindi in funzione l assemblatore che darà come output almeno 3 files 1) *.hex che viene caricato nel pic 2) *.lst che riporta il testo asm + segnalazioni di diversa sorta 3) *.err che riporta la lista degli errori o delle segnalazioni e da sottolineare che il file *.asm da assemblare deve: - non contenere nessuna notazione prima dell opcode (ad esempio numerazione) - non contenere appunti o note a meno che non siano precedute da un ; - presentare come prima istruzione una direttiva (vedremo cosa significa) che indica di includere il file 16F84.INC 2
3 STRUTTURA INTERNA DEL PIC -eeprom program memory (o flash nei modelli F) Nel pic vi sono due eeprom, una è quella di programmazione di cui stiamo parlando ora ed in cui vengono scritte le istruzioni del programma, l altra e l eeprom DATA memory nella quale vondono stoccati i dati. La eeprom Program memory, come abbiamo già accenato, contiene 1024 locazioni (da 0000h a 03FFh), ogni locazione può contenere un opcode. Queste locazioni vengono riempite con un programmatore ossia grazie ad un hardware tipo multipippo ed un software tipo icprog La eeprom program memory non si modifica quindi durante l esecuzione del programma contenuto nel pic. -La ALU Unità Logica Aritmetmetica, in pratica è l unità che svolge le operazioni matematiche -Program counter Nei programmi come in basic le istruzioni vengono numerate, in pratica anche in assembler ciò avviene. Infatti, ogni istruzione è allocata in una posizione nemerata della eeprom. Con istruzioni tipo GOTO di può saltare da una locazione ad un altra. Il program counter è un registro che consente di tenere in memoria la posizione di ogni istruzione consentendo quindi questo tipo di salti. (l argomento sarà approfondito più avanti) -Stack Con l istruzione CALL si richiamano delle subroutine al termine delle quali inseriremo una istruzione RETURN. Lo stack memorizza la posizione della istruzione call consentendo il ritorno a quella locazione al termine della subroutine. Lo stack del pic 16F84 è a 8 livelli, ossia consente al massimo di richiamare una subroutine da un altra subroutine per un massimo di 8 volte. -Il registro W o Accumulatore Possiamo asserire che è il perno del linguaggio assembler per pic. Si tratta di una locazione della memoria in cui la ALU ha accesso diretto. W è in grado di contenere un solo byte (8bit) L importanza di questo registro è legata alla limitazione della capacità di una istruzione opcode (14 bits). Se ad esempio dobbiamo trasferire un dato in un registro (vedremo più avanti diversi esempi) non potremo utilizzar un unico opcode in quanto non sarebbe in grado di contenere tutte le informazioni richieste, dovremo per tanto fare: MOVLW 02H (prende il valore di 02 hex, utilizzato a titolo esemplificativo e lo mette in W) MOVWF 0CH (prende il valore contenuto nell accumulatore W e lo mette nel registro 0C hex) abbiamo dovuto fare due passaggi per dire di memorizzare un numero in un registro. In pratica quindi W è un registro di passaggio nel quale il dato viene trasferito per essere destinato in altro loco. Nel registro W il dato può subira anche delle trasformazioni ossia delle operazioni matematiche. Le operazioni che le istruzioni assembler consentono non sono moltissime e sono quì sotto riportate: 3
4 ADDLW K (ad es: addlw 0x30 somma 30 H al valore contenuto in W e memorizza il risultato in W) ADDWF F, D (ad es; addwf 0x0c, F oppure add 0x0c, W somma il contenuto del registro 0x0C al contenuto di W e memorizza il risultato nel registro 0x0C, primo caso, o in W secondo caso) ANDLW K esegue l AND tra W ed un termine K ANDWF F, D esegue l AND tra W e il contenuto del registro F il risultato viene memorizzato in D che può essere lo stesso registro F o W IORLW K esegue lo OR tra W ed un termine K IORWF F, D esegue lo OR tra W e il contenuto del registro F il risultato viene memorizzato in D che può essere lo stesso registro F o W XORLW K esegue lo XOR tra W ed un termine K XORWF F, D esegue lo XOR tra W e il contenuto del registro F il risultato viene memorizzato in D che può essere lo stesso registro F o W SUBLW K sottrae il termine K a W e lo memorizza in W (W = K W ) SUBWF F, D sottrae il contenuto del registro F a W il risultato viene memorizzato in D che può essere lo stesso registro F o W (W = F W) 4
5 REGISTER FILES I file di registro sono locazioni della RAM. In pratica la ram è divisa in settori delimitati da indirizzi, nei quali vengono stoccate le variabili riservate a diverse funzioni. A differenza dell eeprom i file register possono essere modificati durante l esecuzione del programma. In ogni file register può essere memorizzato un byte, in sintesi abbiamo una serie di locazioni, dalla numero 0Ch alla 4Fh (68 locazioni) che sono a completa disposizione per manipolare delle variabili, poi abbiamo un serto numero di registri dedicati alle funzioni del pic. Grazie al file *.inc queste locazioni di file register dedicate assumono dei nomi per cui è possibile indirizzarsi su di esse o con un numero o con il corrispondente nome I file register sono suddivisi in due pagine o bank Avremo quindi bank 0 (locazioni da 00h a 7F) e bank 1 (locazioni da 80h a FFh). BANK 0 BANK 1 00h INDIRECT ADD (INDF) 80h INDIRECT ADD (INDF) 01h TMR0 81h OPTION 02h PCL 82h PCL 03h STATUS 83h STATUS 04h FSR 84h FSR 05h PORT A 85h TRIS A 06h PORT B 86h TRIS B 07h ****** 87h ****** (NON UTILIZZABILI) 08h EEDATA 88h EECON1 09h EEADR 89h EECON2 0Ah PCLATH 8Ah PCLATH 0Bh INTCON 8Bh INTCON Ch I I disponibili I 4Fh Supponendo di volere caricare il numero 2 nel registro TMR0 potremo indifferentemente scrivere MOVLW 02H MOVWF TMR0 Oppure MOVLW 02H MOVWF 01H Questo ovviamente se abbiamo selezionato la pagina (Bank 0), come si fa a passare da una pagina all altra lo spiegheremo più avanti. E da notare molto bene che se avessimo selezionato il bank 1 a seguito delle istruzioni MOVLW 02H MOVWF TMR0 (o MOVWF 01H) 5
6 Avremmo caricato il valore non in TMR0, ma in OPTION (81H), quindi il nome del registro non garantisce la collocazione nel registro indicato e va sempre controllato il bank di destinazione Anche i file register disponibili possono essere denominati, a tal fine si usano delle DIRETTIVE, ossia delle impostazioni che una volta inserite nel programma non saranno più cambiate. Ad es: ORG 0Ch GIACOMINO RES 2 Sono due direttive, che in sintesi dicono riserva due file register partendo dalla locazione 0Ch (quindi 0Ch e 0Dh) ed attribuiscili il nome di GIACOMINO. In altre parole: 0Ch = GIACOMINO 0Dh = GIACOMINO + 1 Le scritte MOVWF GIACOMINO oppure MOVWF 0Ch saranno pertanto equivalenti. E da sottolineare una cosa importante I file register dedicati hanno delle funzioni particolari ma come si esplicano? La risposta risiede nel settaggio o meno di bits del byte in esso caricato. La numerazione dei bits è la seguente Bit 7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Molti dei bit dei registri dedicati hanno poi in oltre un nome per cui potremo individuarli sia attraverso dei numeri che attraverso delle sigle, ad esempio prendiamo il File Register STATUS Bit Bit Bit Bit Bit Bit Bit Bit IRP RP1 RP0 TO PD Z DC C I programmi in assembler usano il settaggio o meno dei bit molto frequentemente ad esempio. BSF STATUS, RP0 oppure BSF STATUS, 5 Hanno lo stesso significato ed indicano di settare (mettere a 1) il bit 5 (chiamato anche RP0) del file register status, il quale consente di accedere ad un bank dei file register (vedi avanti) Diverse sono le istruzioni che impiegano i bit dei file register vediamole: BSF F, B setta a 1 il bit B del registro F (ad esempio BSF STATUS, RP0) BCF F, B desetta a 0 il bit B del registro F (ad esempio BCF STATUS, RP0) BTFSC F, B controlla il bit B del registro F se è zero skippa (ossia salta-non legge) l istruzione seguente BTFSS F, B controlla il bit B del registro F se è uno skippa (ossia salta-non legge) l istruzione seguente CLRF F cancella il registro F (azzera tutti i bit) CLRW cancella l accumulatore RRF F, D ruota a destra la sequenza di bit ed introduce (a sinistra) il bit carry (bit C del registro STATUS), supponiamo che il registro in questione F sia 0Ch e che contenesse , a seguito di questa istruzione (supponendo che il bit carry fosse 0) avremo un valore di ed il nuovo bit carry assumerà il valore del bit uscito a destra ossia 6
7 nell esempio 1. Il valore di sarà memorizzato dove è indicato dal termine D della istruzione se D = F in F (RRF 0Ch, F memorizziamo in 0Ch) mentre se D = W nell accumulatore (RRF 0Ch,W memorizziamo in W) RLF, D stesso significato dell istruzione di sopra ma con rotazione a sinistra SWAP F I bits 7, 6, 5, 4 diventano i bits 3, 2, 1, 0 e viceversa. In pratica si inverte il Low Nible con l hight nible del termine esadecimale, ad esempio FA diventa AF. Abbiamo iniziato a vedere alcune delle istruzioni ASM e possiamo iniziare a farci un idea della sintassi utilizzata, prendiamo ad esempio l ins = MOVWF 0Ch MOV è l istruzione vera e propria (muovi il contenuto) a cui segue il soggetto dell operazione W è quindi la locazione che subisce l azione che sarà indirizzata verso F che è quindi la destinazione (registro generico) adesso andrà indicato il registro specifico 0Ch che è il file register di destinazione ins =ADDWF 0CH, W ADD è l istruzione vera è propria (addiziona) a cui segue il soggetto dell operazione W è quindi la locazione che subisce la somma (addiziona all accumulatore w) il contenuto di F che è il termine da addizionare (registro generico) adesso andrà indicato il registro specifico 0Ch che è il registro da sommare a W il risultato dovrà essere memorizzato da qualche parte segue quindi, W ossia il totale mettilo nell accumulatore. Vediamo delle applicazioni pratiche: LABEL1 MOVLW 01H ;nominiamo questo opcode come label1 e diciamo di inserire W=1 MOVWF 0CH ;copiamo il contenuto di W in 0CH quindi 0Ch = 01 h = bin RLF 0CH, F ;0Ch = (se il carry era = 0) BTFSS 0CH, 3 ;quando si setta il bit 3 (0CH = ) non viene letta l ins successiva GOTO LABEL1 ;cicla alla istruzione iniziale CLRF 0CH ; Quando si è settato il bit 3 (abbiamo fatto tre cicli ) si cancella il registo 0CH In pratica abbiamo creato un contatore di cicli ADDLW 08H BTFSC STATUS, DC GOTO LABEL2 GOTO LABEL3 ;W = W + 08h ; Controlliamo il bit DC del registro status che vale 1 se il risultato della somma è > 0f, mentre vale 0 se il risultato è minore di 0f (skippa se = 0) ;nel caso la somma sia maggiore di 0f ;nel caso la somma sia minore di 0f 7
8 IL FILE REGISTER STATUS Bit 7 Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 IRP RP1 RP0 TO PD Z DC C RW RW RW R R RW RW RW R= LEGGIBILE W= SCRIVIBILE Valore al primo reset = xxx ai successivi = 000q quuu (x = sconosciuto, u= invariato, q= dipende dalle condizioni) Il file register Status contiene gli stati aritmetici della ALU, gli status di reset e la selezione dei Bank per la memoria dati. Vediamo le funzioni dei singoli bit. I bits 7, 6, 5 servono per selezionare i bank della memoria dati BIT 7 (IRP): non è utilizzato nel pic 16F84 e deve essere mantenuto a zero, in pic più grandi, come nel pic 16F864, serve per il bank degli indirizzi indiretti (vedi file register INDF e FSR) 0 = bank 0, 1 (da 00h a FFh) 1 = bank 2,3 ( da 100h a 1FFh) BIT6 (RP1): anch esso non è utilizzato nel pic 16F84 e deve essere mantenuto a zero, in pic più grandi serve per selezionare i bank degli indirizzi diretti 0 = bank 0, 1 (da 00h a FFh) 1= bank 2, 3 (da 100h a 1FFh) BIT5 (RP0): è utilizzato nel pic 16F84 e serve per selezionare i bank degli indirizzi diretti 0 = bank 0 (da 00h a 7Fh) 1= bank 1 (da 80h a FFh) riassumendo nel pic 16F84 possiamo avere solo i seguenti settaggi dei bit 7, 6, 5 del registro status bit 7 bit 6 bit = bank 0 (00H 7FH) = bank 1(80H FFH) in pic di maggiore capacità avremo invece maggiori possibilità di setting, ad esempio per i registri diretti bit 7 bit 6 bit = bank 0 (00H 7FH) = bank 1(80H FFH = bank 2 (100H 17FH) = bank 3 (1800H 1FFH) 8
9 I bits 4 e 3 sono bit di status reset, indicano cioè il motivo dell avvenuto reset BIT 4 (TO): 0 = reset dovuto a WDT (vedi avanti) 1= reset di accensione o dopo istruzioni CLRWDT e SLEEP (vedi avanti) BIT 3 (PD): 0 = dopo esecuzione istruzione SLEEP 1 = dopo accensione o istruzione CLRWDT in definitiva nell insieme si individua il motivo del reset bit 4 bit accensione o CLRWDT 1 0 istruzione SLEEP 0 0 intervento WDT I bits 2, 1 e 0 sono bit che vengono settati o meno a seconda del risultato di operazione matematica da parte della ALU. Vediamo degli esempi. ADD Z = 1 se il risultato è 00 ( ovviamente 100H in quanto dopo FF + 1=00) DC = 1 se il risultato è maggiore di 0F C = 1 se il risultato è maggiore di FF AND Z = 1 se il risultato è 00 [1010 AND 0011 = 0010] CLRF Z = 1 come se il risultato è 00 COM Z = 1 se il risultato è 00 [COM 1010 = 0101] INC Z = 1 se il risultato è 00 [INCF => F = F + 1 ] IOR Z = 1 se il risultato è 00 [1010 IOR 0011 = 1011] MOVF Z = 1 se carichiamo 00 RRF e RLF C = valore bit che esce a destra o sinistra SUB Z = 1 se il risultato è 00 DC = 1 se il risultato è maggiore di 0F C = 1 se il risultato è maggiore di zero (nota SUBLW equivale a W = L W mentre SUBWF, W equivale a W = F W) XOR Z = 1 se il risultato è 00 [1010 XOR 0011 = 1001] 9
10 Possiamo ora fare un esempio di applicazione, supponiamo di voler sommare un byte xx ad un valore wwzz e scriviamo un programmino (valore massimo risultato FF FF) Immaginiamo che il termine wwzz sia memorizzato nei registri 0Ch = ww e 0Dh = yy (ricordiamoci che in un file register non ci può stare più di un byte) e che il termine da sommare sia 8a BCF STATUS, C MOVLW 8aH ADDWF 0Dh, F ;azzeriamo il bit carry ;carichiamo il termine da sommare in W ;sommiamo il valore di 8a al contenuto di 0Dh ossia yy e memorizziamo il risultato in 0Dh BTFSC STATUS, C ;andiamo a vedere se si è settato il carry ossia se la somma è maggiore di FF se ciò si è verificato viene eseguita la istruzione successiva che altrimenti è saltata INCF 0Ch ;se la somma era maggiore di FF incrementiamo di una unita il contenuto di 0Ch (ww) Prosecuzione programma :se la somma non era maggiore di FF siamo già a posto 10
11 IL FILE REGISTER OPTION Bit 7 Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 RW RW RW RW RW RW RW RW R= LEGGIBILE W= SCRIVIBILE Valore al primo e successivi reset = IL file register OPTION contiene diversi bit di configurazione e controllo del TMR0 /WDT, INTERRUPT e PULL UP della poerta B. In pratica delle opzioni all uso del pic che verranno analizzate meglio nei capitoli dedicati BIT 7 (RBPU): 0 = Pull Up delle porte B abilitato \ vedi gestione PORT e TRIS 1 = Pull Up delle porte B disabilitato / BIT6 (INTEDG): 0 = Interrupt on falling edge of RB0/INT pin \ vedi INTCON 1 = Interrupt on rising edge of RB0/INT pin / BIT5 (TOCS): 1 = transizione du RA4/TOCKI pin ; clock generati dall esterno \ vedi TMR0 0= istruzioni ciclo interno clock : clock generato all interno / BIT 4 (TOSE): 0 = incrementa da basso ad alto la transizione RA4/TOCKI pin \ vedi TMR0 1 = incrementa da alto a basso la transizione RA4/TOCKI pin / BIT3(PSA): 0 = PRESCALER assegnato al TMRO \ vedi TMRO e gestione Watch Dog 1 = PRESCALER assegnato al WDT / BITS (PS2 PS1 PS0): vedi TMRO e gestione Watch Dog bit 2 bit 1 bit 0 TMRO RATE WDT RATE :2 1: :4 1: :8 1: :16 1: :32 1: :64 1: :128 1: :256 1:128 11
12 IL FILE REGISTER TMRO E una sorta di contatore che incrementa a cadenza costante il valore in esso memorizzato. Quando il valore arriva a FF riprende il conteggio da zero. Ne consegue che i bit in esso contenuti non hanno significato speciale. In pratica è possibile inserire in esso un qualunque valore in byte attraverso le ormai conosciute istruzioni: MOVLW x (x = byte da caricare) MOVWF TMR0 La frequenza di conteggio è direttamente proporzionale alla frequenza di clock applicato al chip e può essere modificata. Il contatore può essere alimentato sia dall interno che dall esterno del pic. dall interno con un segnale fosc/4 = frequenza clock/4 dall esterno tramite il pin 3 (TOCKI) La selezione di una o l altra alimentazione avviene tramite il bit 5 (TOCS) del registro OPTION. 1 = transizione du RA4/TOCKI pin ; clock generati dall esterno 0= istruzioni ciclo interno clock : clock generato all interno Un altro bit del registro option che entra in gioco è il bit 3 (PRESCALER). Per attivare il prescaler nel TMR0 occorre che il bit 3 del file registro option non sia settato (quindi sia uguale a zero) 0 = PRESCALER assegnato al TMRO 1 = PRESCALER assegnato al WDT Il prescaler serve a dividere la frequenza da inviare al TMR0 di un fattore che viene determinato dai bit 2, 1, e 0 (PS2 PS1 PS0) del soltito registro OPTION (vedi tabella in file registro option) Ad esempio se PS2 =1 PS1 = 0 PS0 = 1 IL FATTORE DI DIVISIONE è 1:64 Un ultimo bit del registro OPTION che ha effetti sul TMR0 è il bit 4 (TOSE). Se questo bit è settato il decremento viene fatto all inizio dell impulso in caso contrario alla fine. Tutto quanto abbiamo asserito apparirà più chiaro con i seguenti esempi: * ESEMPIO 1: Bit 5 (TOCS) di OPTION = 0 \ Clock da fosc/4 e Prescaler disattivato su TMR0 Bit 3 (PSA) di OPTION = 1 / Quarzo da 4MHZ => fosc/4 => 4MHz/4 = 1MHZ = di incrementi al secondo 1MHz = frequenza inviata al TMR0 12
13 * ESEMPIO 2 Bit 5 (TOCS) di OPTION = 1 \ Clock da pin 3 e Prescaler disattivato su TMR0 Bit 3 (PSA) di OPTION = 1 / Se al pin 3 arriva una frequenza di 100 HZ questa sarà la frequenza inviata al TMR0 * ESEMPIO 3 Bit 5 (TOCS) di OPTION = 1 \ Clock da pin 3 e Prescaler attivato su TMR0 Bit 3 (PSA) di OPTION = 0 / Bit 2 (PS2) di OPTION = 0 \ Bit 1 (PS1) di OPTION = 0 fattore di divisione prescaler (001) = 1:4 Bit 0 (PS0) di OPTION = 1 / Se al pin 3 arriva una frequenza di 100Hz al TMR0 passerà una frequenza di: 100 Hz * (1:4) = 25 Hz * ESEMPIO 4 Bit 5 (TOCS) di OPTION = 0 \ Clock da fosc/4 e Prescaler attivato su TMR0 Bit 3 (PSA) di OPTION = 0 / Bit 2 (PS2) di OPTION = 0 \ Bit 1 (PS1) di OPTION = 0 fattore di divisione prescaler (001) = 1:4 Bit 0 (PS0) di OPTION = 1 / Considerando il quarzo dell esempio 1 (4MHz) avremo Fosc4 quindi 4MHz /4 = 1MHz fattore di divisione = 1:4 percui 1MHz * 1:4 = 250 Hz al TMR0 Adesso prendiamo in considerazione la condizione dell esempio 4 e supponiamo di volere impostare una pausa di un secondo esatto nell esecuzione di un programma ecco come si può fare: Sul TMR0 possiamo avere FF = 256 incrementi, iniziamo a rendere più consona la divisione riducendoli a 250 partendo da 6 anzichè da zero, per farlo basta usare: MOVLW 6H MOVWF TMR0 (ora TMR0 partirà da 6 anziche da 0) Un ciclo di TMRO avrà adesso 250 incrementi Noi abbiamo un quarzo da 4 MHz a cui applichiamo un fosc 4 quindi e come se partissimo da 1 MHz = di incrementi al secondo incrementi in un secondo / incrementi per ciclo TMR0 = numero di cicli TMR0 per far trascorrere un secondo nel nostro caso /250 = 4000 cicli 13
14 Il risultato teorico è giusto ma ripetere 4000 volte il ciclo è eccessivo, anche perchè conviene utilizzare un numero di ripetizioni inferiore a FF in modo da poter utilizzare un registro contatore caricato con un byte. Riduciamo pertanto la frequenza agendo sul fattore di divisione del prescaler. Impostiamo i bit PS2 PS1 e PS0 a ed otteremo una riduzione della frequenza di un fattore 1:32 Quindi Hz / 32 = Hz (incrementi in un secondo) incrementi in un secondo / incrementi per ciclo TMR0 = numero di cicli TMR0 per far trascorrere un secondo quindi / 250 = 125 cicli = 7D hex Abbiamo trovato un numero di ripetizioni consone. In definitiva imposteremo il setting del prescaler in modo da avere una frequenza di Hx e faremo ripetere 125 (7d) volte il conteggio del TMR0 partendo da 6 fino a FF L insieme delle istruzioni da inviare sarà: movlw B ;carichiamo in W il valore binario indicato movwf OPTION ;TOCS = 0 PSA=0 PS2 = 1 PS1=0 PS0=0 label_ritardo movlw 6H ;carichiamo 6H in W movwf TMRO ;TMR0 = 6H movlw 7Dh ;inseriamo il numero di ripetizioni del ciclo da fare movwf 0Ch ;e le mettiamo in un registro (nell esempio 0C) label_tmr0 movf TMR0,w ;ogni incremento di TMRO viene copiato in W btfss STATUS, Z ;se W = 0 (esaurito un ciclo di 250 conteggi di TMR0 Z varrà 1 è sarà saltata l istruzione successiva) goto label_tmr0 ;fintanto che il ciclo TMR0 non termina si continua a ciclare movlw 6H ;carichiamo 6H in W movwf TMRO ;TMR0 = 6H decfsz,0ch ;è una istruzione nuova per noi signific decrementa il contenuto del file registro f (nel nostro caso 0Ch) e salta la istruzione successiva quando arriva a zero goto label_tmr0 ;si fa ripetere il conteggio per un numero di volte pari al contenuto del file registro 0Ch (125 dec o 7d hex) return ;passato un secondo si torna alla istruzione CALL che ha chiamato la label_ritardo 14
15 I FILES REGISTER INDF E FSR Sono dei registri particolari che vengono utilizzati quando si vuole attingere o inserire dati in registri differenti a seconda delle condizioni che si vengono a creare nel corso del programma. Il registro INDF non è un vero registro fisico, ma un registro indefinito che assume il valore dato dall ultimo richiamo fatto sul registro FSR che quindi funziona da puntatore. Come al solito si capirà molto meglio con un esempio: Supponiamo di voler memorizzare 4 byte ricevuti dal nostro programma nei registri 0C, 0D, 0E e 0F. Questo è un tipico caso che consiglia l impiego dei registri INDF e FSR vediamo il programma: labciclo movlw 0x0C ;inseriamo il valore di 0C nell accumulatore movwf FSR ;lo carichiamo in FSR che ora punterà al registro 0C CALL ricevi il byte ; chiamiamo una label (non stiamo a svilupparla) che raccoglie il byte in ricezione è lo carica in W movwf INDF ; il byte ricevuto, contenuto in W viene passato nel registro che assume il valore del puntatore FSR (quindi 0C per il primo ciclo, 0D per il secondo, 0E per il terzo e 0F per il quarto) incr FSR, f ;viene incrementato il puntatore che varrà 0D..0E..0F etc btfss FSR, 4 ;abbiamo detto che dobbiamo ricevere solo 4 byte, percui dovremo eseguire 4 cicli. Questa instruzione ci dice che quando il bit 4 di FSR è settato si deve saltare l istruzione successiva. Settare il bit 4 vuol dire che si è raggiunto il valore di b = 10hex. Ne consegue che fino al valore di 0F si esegue il ciclo poi quando il valora arriva a 10 il ciclo viene saltato (NB è solo un altro esempio di come si possano contare i cicli) goto labciclo ;si ripete per 4 volte il ciclo altre istruzioni ;dopo la quarta volta il programma procede Al termine delle operazioni avremo: registro 0x0C primo byte ricevuto registro 0x0D secondo byte ricevuto registro 0x0E terzo byte ricevuto registro 0x0F quarto byte ricevuto Note: nel pic 16F84 abbiamo detto che ci sono solo 2 bank. Il bit 7 di FSR agisce come indicatore di bank ad esempio FSR = 91 = bank 1 FSR = 11 = bank 0 nel caso del pic 16F876 abbiamo bank 0, 1, 2, 3 ne deriva che dovremo sfruttare il bit 7 del registro STATUS (non attivo nel 16f84): se = 0 bank 0 1, se = 1 bank
16 I FILE REGISTER PORT E TRIS Nela visione della struttura del pic abbiamo recepito la presenza di linee I/O (in/out). Queste linee sercono per comunicare con strutture esterne al pic. Le linee I/O nel 16F84 sono 13 e vengono divise in due raggruppamenti. Le linee A (cinque) e le linee B (otto), ogni linea è associata ad un pin del pic, così come illustrato nella fase di descrizione dello stesso. Riassumendo abbiamo: Linea A PIN 17 PIN 18 PIN1 PIN 2 PIN 3 RA0 RA1 RA2 RA3 RA4 Linea B PIN 6 PIN 7 PIN 8 PIN 9 PIN 10 PIN 11 PIN 12 PIN 13 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 Per la gestione di queste porte vengono utilizzati i registri TRIS (A e B) e PORT (A e B). I primi siti nel bank 1 i secondi nel bank 0. Per prima cosa dovremo scegliere quali porte sono in ingresso e quali in uscita, ossia quelle abilitate a ricevere (ingresso) od ad inviare informazioni (uscita). Per questa operazione si ricorre ai registri TRIS. Poichè, come accennato i registri TRIS sono nel bank 1, dovremo settare il bit RP0 del registro Status per accedervi usando l opcode: BSF STATUS, RP0 Adesso per definire se linee sono in ingresso o in uscita setteremo o meno dei bit tenendo come al solito presente che 0 = uscita e 1 = ingresso. Supponiamo di volere settare in ingresso le porte RA1, RA3, RB4 e RB7 ed in uscita tutte le altre (nota bene alla partenza e dopo ogni reset le porte sono tutte in ingresso) dovremo usare il seguente schemino TRIS A bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 xxx xxx xxx RA4 RA3 RA2 RA1 RA0 TRIS B bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 I valori binari da caricare saranno quindi: TRIS A = = 09hex TRIS B = = 90 hex I comandi da inviare sono quindi BSF STATUS, RP0 MOVLW 0X09 MOVWF TRISA MOVLW 0X90 MOVWF TRIS B BCF STATUS, RP0 16
17 Nota. esiste una istruzine che è considerata opsoleta, in quanto non più in uso in pic recenti, che consente di avere un accesso diretto ai registri TRIS senza dover settare il bank 1. Si tratta dell istruzione TRIS F. Ad esempio a posto di quanto scritto di sopra potremo ottenere lo stesso risultato con le seguenti istruzioni: MOVLW 0X09 TRIS PORT A MOVLW 0X90 TRIS PORT B (risparmio due opcode) A questo punto siamo nelle condizioni di comunicare con l esterno, attraverso un adeguato circuito possiamo ad esempio predisporre l accensione di un led settando a 1 il bit di una porta in uscita. se consideriamo ad esempio RB7 dovremo scrivere per accendere un led ad essa collegato: BSF PORTB, 7 ;setta a 1 il bit 7 della PORTB => RB7 = 1 avremo comunque occasione di vedere altri esempi in appendice. Va ricordato, rimanendo in tema di porte, che alcune di esse sono associate a funzioni accessorie. Ad esempio: RA4, se il bit TOCS (5) del registro OPTION è settato ed è configurata in ingresso viene utilizata per il TMR0 RB0, in uscita con il settaggio del bit RBIE (4) del registro INTCON viene utilizzata per attivare un INTERRUPT (vedi avanti) Per concludere favviamo un cenno al bit RBPU (7) del registro OPTION, questo infatti agisce sulle porte B configurate in ingresso. Quando RBPU =0 il pullups è abilitato ciò significa che se ad esempio colleghiamo in ingresso ad una porta B un pulsante, la logica 1, che si attiva premendolo, permane anche dopo il rilascio del pulsante in questione. In altre parole la linea in ingresso rimane sempre allo stato 1 salvo comando contrario. Questo sserve ad esempio qualora non si voglia che si instauri una condizione indeterminata o per evitare rischi di corticircuiti in alcuni dispositivi. Fermo restante l impiego generico dobbiamo dire che ogni porta, o gruppi di porte, ha comunque spesso delle caratteristiche specifiche che le rendono consigliabili rispetto ad altre in talune applicazioni, per queste funioni si rimanda però ai datasheets del pic in oggetto. 17
18 I FILES REGISTER PCL E PCLATH Parlando della struttura interna del pic abbiamo accenato al PC (program Counter). La gestione pratica del PC avviene tramite i registri PCL e PCLATH. Il PC è costituito da 13 bits (0000H- 1FFFH) Poichè si tratta di un valore elevato (non contenibile in un solo byte)un solo file register non è sufficiente e per tanto viene scomposto. I primi 8 bits vengono contenuti nel PCL (PC Low byte) ed i rimanenti 5 nel PCLATH (PC latch Hight). Gli ultimi 3 bits ( 7, 6, 5 ) del PCLATH non sono utilizzati. I bits del PCLATH sono "sommati" a quelli del PCL (formando il valore del PC) in caso di istruzione CALL, GOTO o nel caso in cui il valore dell'accumulatore W venga trasferito in in PCL. Le modalità di somma dei bits contenuti in pclath sono però differenti a seconda del caso si tratti di GOTO o CALL rispetto a trasferimenti di W in PCL (movwf PCL, ADDWF PCL o similari distinguiamo quindi un: PROGRAM MEMORY PAGING ed un GOTO COMPUTATO >> PROGRAM MEMORY PAGING<< Il Pic 16F84 ha circa 1 K (1024) di memoria programmabile. Le istruzioni CALL e GOTO hanno 11 bits (7FF) di indirizzo che gli consentono di coprire fino a 2K (2047) di memoria programmabile. Per i futuri Pic 16FXX sono previste espansioni di memoria per cui sono già predisposti due ulteriori bits per specificare le pagine di memoria programmabile. Questi due bits sono il bit 3 o 4 del PCLATH. NB. Il pic 16F84 ignora i bits 3 e 4 del PCLATH, comunque l'uso di questi due bits non è consigliato in quanto può risultare incompatibile con ulteriori prodotti. Al fin e di comprendere il discorso possiamo riferirci ad un processore più potente come il pic 16F876. Analizziamo la seguente routine ORG 00H Start BCF PCLATH, 4 BSF PCLATH, 3 GOTO Start ;questa è una direttiva che indica che l istruzione che segue parte dalla numerazione indicata A prima vista sembrerebbe una routine ciclica senza fine, ma in realtà il GOTO start non porta alla Label Start (00H), infatti dobbiamo considerare i due bits del PCLATH + gli 11 bits del GOTO quindi 01 dal PCLATH dal GOTO (che rimandava alla locazione 00H)= bin = 800 H 18
19 Il goto start equivale quindi a puntare il PC a 800 H ( in altre parole come se fosse GOTO opcode 800H Riepilogando Ogni opcode ha un numero che è sempre quello a prescindere dal nome "label" che gli si da. Se si scrive GOTO Label_scema se la label scema è nella locazione con numero 025H non si fa altro che indirizzare il PC su 25H. (analogo discorso per il call). La faccenda si complica se gli indirizzi a cui si vuole fare rimando sono superiori ad un certo valore e più precisamente a 7FF in quanto l'istruzione goto e call sopprotano solo 11 bits. In pratica non posso scrivere GOTO "locazione 800" perchè l'opcode non lo sopporta. E' ovvio che questo problema non si pone nel 16f84 in quanto gli opcode scrivibili sono meno di 800H, mentre si fa sentire in processori come il 16F876 Per richiamare locazioni superiori a 7FF occorre ricorrere al registo PCLATH ed in particolare ai suoi bits 3 e 4 Facciamo un esempio GOTO locazione 821 come devo fare? Scomponiamo 821 H in binario = in rosso e due in nero 11 bits (meno significativi) sono segnati 11 bits sono supportati dal comando goto quindi avremo (bit rossi in hex ) =21 per l'invio a questa locazione dovremo quindi fare BCF pclath, 4 (primo bit = 0) BSF pclath, 3 (secondo bit = 1) GOTO 0x21 (11 bits = ) In definitiva con; PCLH, 3 = 0 PCLH, 4 = 0 si deve aggiungere 00H al riferimento Call o Goto che si utilizza (range 00 7FF h) PCLH, 3 = 1 PCLH, 4 = 0 si deve aggiungere 800H al riferimento Call o Goto che si utilizza (range 800 FFF h) PCLH, 3 = 0 PCLH, 4 = 1 si deve aggiungere 1000H al riferimento Call o Goto che si utilizza (range FF h) PCLH, 3 = 1 PCLH, 4 = 1 si deve aggiungere 1800H al riferimento Call o Goto che si utilizza (range FFF) E' quindi opportuno, nel caso sia usato il registro PCLATH per altri scopi, ad esempio da flag, prestare attenzione al suo contenuto in caso il PC venga attivato. 19
20 >>GOTO COMPUTATO<< Si tratta di ottenere un GOTO con destinazione variabile a seconda del valore dell'accumulatore. Questo risulta utilissimo quando si voglia far si che il risultato di una operazione sia utilizzato come puntatore di serie di istruzioni differenti. Il goto computato si attiva automaticamente quando un valore dell'accumulatore W è caricato in PCL. In questa circostanza e come se avessimo scritto GOTO (" W + PCLH") Il senso della somma "W+PCLH" è da intendere in questo modo: W= PCL = bits 0-7 PCLH = bits 8-12 ad es PCL = W = PCLATH = xxx operazione equivalente GOTO opcode n = = 398 H Facciamo come al solito un esempio pratico 0005: Lab_005 CLRF PCLATH ;azzera banco salti 0006: MOVF 0x46,W ;il valore di 0x46 fa da puntatore 0007: ADDWF PCL,F ;si salta di tanti opcode quanto è il valore di W 0008: RETLW 0x3a ;0x46=1 0009: RETLW 0x3c ;0x46=2 000a: RETLW 0x40 ;0x46=3 000b: RETLW 0x34 ;0x46=4 000c: RETLW 0x32 ;0x46=5 Si tratta di una subroutine. A seconda del valore con caricato in 0x46 si ottiene un salto ad una diversa istruzione, vediamo perchè. Analizziamo l istruzione n 0007 ADDWF PCL,F Con questa istruzione incrementiamo il valore di PCL di un valore pari a quello contenuto in W (che nella istruzione precedente era stato caricato con il valore del registro 0x46) Quanto valeva PCL prima dell addizione? Ovviamente 0007 (valore della locazione dell opcode) Quanto vale ora? ovviamente 07 + W ad esempio = 09 Quanto vale il PC (program counter) dopo questa operazione = bit da PCLATH azzerato nell opcode = bit da PCL (09) PC = = 09 Nell esempio citato quindi ADDWF PCL,F = goto 0x09 ( = RETLW 0x3c) si rtorna quindi al call di rimando con il valore dell accumulatore pari a 3C Ovviamente se il registro 0x46 conteneva altri valori il salto computato sarebbe stato indirizzato in altro loco 20
21 IL FILE REGISTER INTCON Bit 7 Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 GIE EEIE TOIE INTE RBIE TOIF INTF RBIF RW RW RW RW RW RW RW RW R= LEGGIBILE W= SCRIVIBILE Valore al primo e successivi reset = x x = Sconosciuto IL file register INTCON serve per la gestione degli INTERRUPT. Un interrupt è una procedura percui quando si verifica una condizione esterna il pic interrompe ciò che stava facendo e attiva una porzione di porgramma specifico terminata la quale riprende il programma principale la dove lo aveva lasciato. Il pic 16F84 ha un limitato numero di interrupt, mentre il 16F876 ne ha molti di più tanto che in esso sono presenti spiu registri adibiti al loro controllo. BIT 7 (GIE): interruttore globale 0 = disabilita la gestione di tutti gli interrupt 1 = abilita la gestione di tutti gli interrupt BIT 6 (EEIE): interruttore del eewrite complete interupt = interrupt che si attiva alla fine della scrittura di una locazione eeprom 0 = disabilita la gestione dell interrupt specifico 1 = abilita la gestione dell interrupt specifico BIT 5 (TOIE): interruttore dell overflow interupt = interrupt che si attiva al termine del conteggio del TMR0 0 = disabilita la gestione dell interrupt specifico 1 = abilita la gestione dell interrupt specifico BIT 4 (INTE): interruttore dell external interupt = interrupt che si attiva al cambiamento di stato della porta RB0 0 = disabilita la gestione dell interrupt specifico 1 = abilita la gestione dell interrupt specifico BIT 3 (RBIE): interruttore del Port B change interupt = interrupt che si attiva al cambiamento di stato di una porta RB4- RB7 0 = disabilita la gestione dell interrupt specifico 1 = abilita la gestione dell interrupt specifico fino adesso abbiamo visto degli interruttori i possmi bits sono dei flag di avvenuto interrupt BIT 2 (TOIF): flag di avvenuto overflow interupt = interrupt che si attiva al termine del conteggio del TMR0 0 = evento non avvenuto 1 = evento avvenuto 21
22 BIT 1 (INTF): flag di avvenuto external interupt = interrupt che si attiva al cambiamento di stato della porta RB0 0 = evento non avvenuto 1 = evento avvenuto BIT 1 (INTF): flag di avvenuto Port B change interupt = interrupt che si attiva al cambiamento di stato di una porta RB4- RB7 0 = evento non avvenuto 1 = evento avvenuto Conveniamo che se è avvenuto un interrupt ed i flag relativi ai bits 2, 1 e 0 non sono settati saremo di fronte ad un eewrite complete interupt = interrupt che si attiva alla fine della scrittura di una locazione eeprom Il settaggio di un flag di interrupt impedisce la ripetizione dello stesso interrupt, nel caso non si desideri questo occorrerà predisporre in fase di programmazione delle istruzioni di riazzeramento del flag in questione. Inoltre, durante un interrupt anche il bit 7 viene azzerato, impedendo la sovrapposizione di eventi. L istruzione RETFIE posta al termine del ciclo di comandi specifici dell interrupt oltre a far riprendere il programma principale dove era stato interrotto risetta il bit 7. Abbiamo detto che l interrupt attiva una sorta di subroutine che viene messa in moto in corrispondenza di un evento. Nella pratica le istruzioni dell interrupt vanno scritte a partire della locazione Lo schema di un programma con interrupt è quindi il seguente: ORG 0000h 0000\ 0001 istruzini generali 0002/ 0003 GOTO 000n+2 (salto incondizionato alla fine dell interrupt o oltre) 0004 \ istruzioni interrupt n / 000n+1 RETFIE (ritorno al programma in corso prima dell interrupt) 000n+2 \ 000n+3 istruzioni generali etc / 22
23 I FILES REGISTER EEAADR, EEDATA,EECON1 ED EECON2 Si tratta di quattro registri che consentono la scrittura e la lettura dell eeprom dati del pic. Il file register: EEADR contiene l indirizzo della memoria in cui dobbiamo leggere o scrivere EEDATA contiene il byte da scrivere o su cui viene trasferito il byte letto EECON2 non è un registro fisico ma un registro di controllo che viene utilizzato per impedire scritture accidentali EECON1 è il registro che tra le altre funzioni abilita la scrittura e la lettura della eeprom dati Dei quattro registri in esame EECON1 è l unico che ha dei bit con funzioni particolari EECON1 Bit 7 Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit 1 Bit EEIF WREER WREN WR RD RW RW RW RW RW RW RS RS R= LEGGIBILE W= SCRIVIBILE S=SETTABILE Valore al primo e successivi reset = ---0 x00x x= non noto - = non impiegato letto come 0 BIT non utilizzati letti come zero BIT 4 (EEIF): flag di avvenuta operazione di scrittura 1 = l operazione di scrittura è completata (deve essere cancellato dal software) 0 = l operazione di scrittura non è completata o non è iniziata BIT 3 (WRERR): flag di avvenuto errore 1 = l operazione di scrittura è prematuramente terminata (è avvenuto un reset durante l operazione) 0 = l operazione di scrittura è completata BIT 2 (WRERR): Bit abilitante la scrittura su eeprom dati 1 = consente un ciclo di scrittura 0 = non consente il ciclo di scrittura BIT 1 (WR): Bit controllo scrittura 1 = si attiva all inizio del ciclo di scrittura e si azzera una volta completato (NB questo bit può essere solo settato e non cancellato dal software) 0 = il ciclo di scrittura è terminato BIT 0 (RD): Bit di controllo letturaai 1 = lettura della eeprom attivata 0 = lettura della eeprom disattivata 23
24 Le eeprom dati del pic 16F84 contiene 64 bytes, in essi possiamo scrivere e leggere valori durante l esecuzione di un programma. I dati scritti si mantengono in memoria anche senza tensione elettrica. - Procedura per la scrittura nell eeprom dati. Supponiamo di voler scrivere il valore hex 1B nella locazione 02h della eeprom dati ecco la procedura: bcf STATUS, RP0 ;selezioniamo il bank 0 che contiene EEADR movlw 0x02 ;indichiamo la locazione movwf EEADR ;la carichiamo nel registro EEADR movlw 0x1B ;indichiamo il valore da caricare movwf EEDATA ;lo copiamo nel registro EEDATA bsf STATUS, RP0 ;accediamo al bank 1 dove risiede il file registro EECON1 bsf EECON1, WREN ;settiamo il bit 2 di EECON1 che ci consente la scrittura movlw 0x55 ;introduciamo un valore (0x55) per evitare scritture accidentali movwf EECON2 ;lo copiamo nel registro EECON2 movlw 0xAA ;introduciamo un altro valore (0xAA) per evitare scritture accidentali movwf EECON2 ;e lo copiamo anche lui nel registro EECON2 (serve solo a questo) bsf EECON1, WR ;settiamo il bit 1 (WR) di EECON1 ed iniziamo il ciclo di scrittura label_endwrite btfsc EECON1, WR ;poichè per la scrittura occorre un pò di tempo dobbiamo inserire un ciclo, quando la scrittura è finita il bit WR di azzera e viene saltata la successiva istruzione goto label_endwrite ;finchè non è terminata la scrittura continua a ciclare altre istruzioni ;terminata la scrittura si va avanti con il programma - Procedura per la lettura nell eeprom dati E decisamente più semplice, supponiamo di voler leggere il dato contenuto nella locazione 02h. bcf STATUS, RP0 ;selezioniamo il bank 0 che contiene EEADR movlw 0x02 ;indichiamo la locazione movwf EEADR ;la carichiamo nel registro EEADR bsf STATUS, RP0 ;accediamo al bank 1 dove risiede il file registro EECON1 bsf EECON1, RD ;settiamo il bit 0 (RD)che consente la lettura bcf STATUS, RP0 ;selezioniamo il bank 0 che contiene EEDATA movf EEDATA, w ;il valore lerro trasferito in automatico in EEDATA con questa istruzione passa nell accumulatore 24
25 LA COMUNICAZIONE SERIALE ASINCRONA Il pic può comunicare con il mondo esterno, ricevere ed inviare byte, e a questo scopo abbiamo diversi mezzi. Supponiamo che necessitiamo di inviare e ricevere byte tra il pic ed un altro dispositivo attaraverso un cavo seriale, una delle possibilità è la comunicazione seriale asincrona. Questo tipo di comunicazione richiede un integrato accessorio il MAX 232, il cui scopo principale è quello di convertire i segnali dai +/- 12 V indispensabili per la trasmissione/ricezione di dati attraverso la porta seriale ai +/- 5V gestibili dalle porte del pic. La comunicazione seriale asincrona è quella comunemente disponibile nui normali Personal computer. Si parla di comunicazione seriale in quanto viene utilizzata un unica linea elettrica (più ovviamente la terra ), per cui per la trasmissione ( o ricezione) di un byte dovremo scomporlo negli 8 bits ed inviarli in serie uno alla volta.. Ovviamente se vogliamo che entrambi i dispositivi possano inviare e ricevere avremo bisogno di 2 cavi (più uno di terra) in quanto in ognuno di essi la comunicazione e unidirezionale (ad esempio da A --> B in uno e da B-->A nell altro). Ai fini pratici la prima cosa che dobbiamo stabilire è un segnale che indichi l inizio di una trasmissione (Start) ed un segnale che ne decreti la fine ( Stop). I bits saranno trasmessi, ovviamente tra lo start e lo stop. L importanza dello start è fondamentale in quanto indica anche il tempo zero dal quale ad intervalli impostati, il sistema si aspetta di ricevere bit. Ricordiamo che il sistema pùò presentarsi a: +12 V (trasformati dal max 232 a + 5volt ) = condizione logica 0-12 V (trasformati dal max 232 a + 5volt ) = condizione logica 1 se impostiamo di lavorare ad esempio a 9600 bit/secondo dopo lo start verrà valutato lo stato del sistema ad intervalli di 1/9600 = 0,104 msec. Poichè quando non c è nessuna trasmissione in corso la tensione sulla linea è di -12V, il segnale di start equivarrà al cambio di tensione di +12V (logica 0) per un tempo pari all intervallo impostato (nell esempio 0,104 msec). In altre parole lo start di una trasmissione a 9600 bit/sec equivale all invio di un segnale 0 per un tempo di 0,104 msec Ovviamente il max 232 ridurrà la tensione dai +/- 12V ai +/- 5Volt. Dopo lo start vengono inviati gli 8 bits componenti il byte ed un ultimo bit a 1 che corrisponde allo STOP bit. Può essere anche inviato, prima dello stop un bit di parità che consente una sorta di controllo sulla bontà della trasmissione. La parità si calcola sommando i bit inviati, se viene impostata una parità di tipo pari alla somma viene aggiunto un bit (0 o 1) in modo che il risultato sia pari, mentre se viene impostata una parità di tipo sispari alla somma viene aggiunto un bit (0 o 1) in modo che il risultato sia dispari. Ai fini pratici la parità viene calcolata xorando i bit inviati, se ad esempio dovessimo inviare: dovremmo fare: 1 xor 0 = 1 xor 1 = 0 xor 1 = 1 xor 0 = 1 xor 0 = 1 xor 1 = 0 xor 1 = 1 se avessimo contato i bit settati avremmo trovato 5 = dispari come il risultato dello xor dei bits. A questo punto se la parità e pari sarà 1 (1+ 1 = 0), mentre se è dispari sarà 0 (1 + 0 = 1) 25
26 TRASMISSIONE DI UN BYTE Viene qui riportata l esempio di una subroutine di trasmissione di un Byte. In questo esempio viene anche utilizzata la Parità Per agevolare la lettura le subroutine vengono messe in serie e ripetute, nella realtà saranno accodate al programma. subroutine invia label 0003 MOVWF 0X16 il byte da onviare viene memorizzato nel registro 0x16 MOVLW 0X32 viene caricato in W il temporizzatore di start pari a 0x32 CALL label 0041 richiama la subroutine pausa subroutine pausa label 0041 MOVWF 0X15 copia il valore di 32 (relativo all'ivio dello start bit) nel registro 0x15 label 0044 DECFSZ 0X15 decrementa il contenuto di 0x15 saltando l'istruzione seguente quando arriva a zero GOTO Label 0044 fa ritornare al decremento in modo che vengano contati 32 passaggi RETLW 0X00 esegue un return riportando il valore di W a 0x00 MOVLW 0X7F inserisce in W il valore di 7F in binario TRIS PORTB RB7 in uscita da RB0 a RB6 in ingresso CLRF 0x17 cancelliamo il contenuto di questo registro che verrà usato per la parità BCF PORTB,07 RB7 = 0 è lo start bit che viene inviato MOVLW 0X08 W= 8 in quanto dobbiamo inviare 8 bit di un byte MOVWF 0X14 Il numero 8 viene inserito nel registro 0x14 label 0042 CALL label 0001 richiama la subroutine 0001 = pausa standard subroutine pausa standard label 0001 MOVLW 0X1A Inserisce il valore di 1 in W che rappresenta un tempo di pausa label 0041 MOVWF 0X15 copia il valore di 1A nel registro 0x15 label 0044 DECFSZ 0X15 decrementa il contenuto di 0x15 saltando l'istruzione seguente quando arriva a zero GOTO Label 0044 fa ritornare al decremento in modo che vengano contati 1A passaggi RETLW 0X00 esegue un return riportando il valore di W a 0x00 RRF 0x16,F i bit che compongono il byte contenuto nel registro 0x16 vengono ruotati verso destra, il bit entrante in posizione 7 è il vecchio bit carry mentre il bit uscente(vecchio bit 0 diventa il nuovo bit carry) 26
27 RRF 0x16,W è un artificio per portare il bit carry in posizione 7 dell'accumulatore ANDLW 0X80 Si effettua un and logico con 0x80 = in modo da azzerare i bit da 0 a 6 e tenere uguale il valore del bit 7 che è il bit da inviare XORWF 0X17,F Si esegue uno xor in modo da calcolare la parità; viene xorato ogni bit inviato ad esempio se inviamo dovremmo avere una parità dispari (cinque 1) 1xor 0 = 1 xor 1= 0 xor 1 = 1 xor 0 = 1 xor 0 = 1 xor 1 = 0 xor 1 = 1 (dispari) MOVWF PORTB il bit 7 di port B viene settato o meno a seconda del valore trasferito il bit in questione viene inviato DECFSZ 0X14,F Il valore di 0x14 in origine 0x08 viene decrementato di una unità quando arriva a zero viene saltata la successiva isturzione GOTO label 0042 viene ripetuto il ciclo di invio degli 8 bit componenti il byte CALL label 0001 richiama la subroutine 0001 = pausa standard subroutine pausa standard label 0001 MOVLW 0X1A Inserisce il valore di 1 in W che rappresenta un tempo di pausa label 0041 MOVWF 0X15 copia il valore di 1A nel registro 0x15 label 0044 DECFSZ 0X15 decrementa il contenuto di 0x15 saltando l'istruzione seguente quando arriva a zero GOTO Label 0044 fa ritornare al decremento in modo che vengano contati 1A passaggi RETLW 0X00 esegue un return riportando il valore di W a 0x00 MOVF 0x17,W il contenuto del registro 0x17 (parità) viene caricato su W MOVWF PORTB Il valore della parità (bit 7) viene inviato CALL label 0001 richiama la subroutine 0001 = pausa standard subroutine pausa standard label 0001 MOVLW 0X1A Inserisce il valore di 1 in W che rappresenta un tempo di pausa label 0041 MOVWF 0X15 copia il valore di 1A nel registro 0x15 label 0044 DECFSZ 0X15 decrementa il contenuto di 0x15 saltando l'istruzione seguente quando arriva a zero GOTO Label 0044 fa ritornare al decremento in modo che vengano contati 1A passaggi RETLW 0X00 esegue un return riportando il valore di W a 0x00 MOVLW 0XFF inserisce in W il valore di FF in binario TRIS PORTB da RB0 a RB7 in ingresso MOVLW 0X4F copia il valore di 4F (relativo all'invio dello stopt bit) nel registro 0x15 GOTO label 0041 pausa stop bits label 0041 MOVWF 0X15 copia il valore di 4F nel registro 0x15 label 0044 DECFSZ 0X15 decrementa il contenuto di 0x15 saltando l'istruzione seguente quando arriva a zero GOTO Label 0044 fa ritornare al decremento in modo che vengano contati 4F passaggi RETLW 0X00 esegue un return riportando il valore di W a 0x00 27
28 RICEZIONE DI UN BYTE Nel caso di una ricezione di un byte, il sistema si metterà in attesa di uno start bit, a tergo viene riprodotto l esempio di una subroutine di ricezione. subroutine ricezione label 0005 BTFSC PORTB, 07 attende uno start bit se non lo riceve continua a ciclare altrimenti salta l'istruzione successiva e procede con l'analisi GOTO label 0005 quando rb7=0 viene saltata MOVLW 0X2A carica su W il valore di 2A che rappresenta il tempo di ricezione dello start bit CALL label 0041 chiama una pausa label 0041 MOVWF 0X15 copia il valore di 2A nel registro 0x15 label 0044 DECFSZ 0X15 decrementa il contenuto di 0x15 saltando l'istruzione seguente quando arriva a zero GOTO Label 0044 fa ritornare al decremento in modo che vengano contati 2A passaggi RETLW 0X00 MOVWL 0x09 esegue un return riportando il valore di W a 0x00 carica su W il valore di 09 ossia la ricezione di 9 bit (8bit per un byte più 1 di parità) MOVWF 0X14 il valore di 09 è trasferito nel registro 0x14 label 0043 BCF STATUS, C azzera il bit carry del registro Status BTFSC PORTB, 07 legge il valore di RB7 se è zero salta l'istruzione successiva, quando è 1 esegue l'istruzione successiva BSF STATUS, C nel caso RB7= 1 il bit carry diventa = 1 RRF 0X16, F introduce il bit Carry nella posizione 7 del registro 0x16, nota bene il contenuto iniziale di questo registro non ci interessa in quanto verrà completamente sostituito al termine degli 8 cicli xxxx xxxx diventa Cxxx xxxx CALL label 0001 richiama la subroutine pausa standart già analizzata più volte DECFSZ 0X14, F diminuisce di una unità il valore di 0x14 saltando l'istruzione successiva quando raggiunge il valore di zero GOTO 0043 cicla 9 volte la routine in modo da ricevere i 9 bit (8bit per il byte più 1 per la parità) RLF 0X16, F nel registro 0x16 sono memorizzati 7 bit del byte inviato più il bit della parità, il bit 0 del byte inviato è ancora memorizzato nel bit carry, per rinserire questo bit si esegue una rotazione a sinistra P C(0) RLF --> C(P) P= parità MOVLW 0X28 Carica su w il valore di 0x28 tempo di ricezione stop CALL label 0041 richiama la subroutine pausa già analizzata più volte MOVF 0x16, W memorizza il valore del byte ricevuto in W RETURN 28
29 LA COMUNICAZIONE SERIALE SINCRONA In questo tipo di comunicazione connettiamo un device master con un device slave. In realtà sono possibili anche operazioni multi device (ad esempio un master che comanda più slave o uno slave comandato da più master), ma noi ci limiteremo al caso più semplice. A titolo esemplificativo connetteremo il nostro pic ad una eeprom della famiglia 24LCxx e vedremo come possono essere letti o scritti i dati su di essa. Nella comunicazione seriale sincrona ogni device può trasmettere o ricevere solo che a decidere chi agisce da trasmettitore o ricevitore sarà il master (nel nostro esempio il pic). Lo scambio di segnali avviene tramite due linee: la SDA (Serial Data) e la SCL (Serial Clock) collegate rispettivamente ai pin 4 e 5 della eeprom. Il sincronismo di invio o ricezione è come abbiamo detto gestito dal master che può impostare in ingresso o in uscita le linee impiegate. Come riferimento utilizzeremo una eeprom 24LC16, a fine discorso, capito il meccanismo di massima vedremo le differenze con eeprom di capacità superiore. La 24LC16 supporta un protocollo di trasmissiione bidirezional 2-wire bus. Il device che invia i dati è definito tramittente e quello che li riceve, ricevente. Il bus deve essere controllato dal master device che genera il serial clock (SCL), controlla l'accesso al bus e genera le condizioni di Start e Stop, mentre il 24LC16 funge da slave. Sia il master che lo slave possono operare come riceventi o trasmittenti, ma è il master che determina quale modalità sia attivata. Il seguente protocollo bus è stato definito. Il trasferimento dati è possibile solo quando il bus non è occupato Durante il trasferimento dati la linea dati deve rimanere stabile quando la linea clock è alta. Cambiamenti della linea dati quando la linea clock è alta saranno interpretati come condizioni di Start o Stop. Facciamo degli esempi SCL = 1 SDA = 1 Bus non occupato: sia la linea dati che la linea clock sono alte SCL = 1 SDA 1->0 START: la linea SDA passa da alto a basso, mentre il clock rimane alto SCL = 1 SDA 0 ->1 STOP: la linea SDA passa da basso a alto, mentre il clock riamane alto SCL 0 ->1 SDA = x Dati validi: lo stato della linea dati rappresenta dati validi quando, dopo lo start risuta stabile durante il periodo di segnale clock alto. Il dato da trasmettere va cambiato durante il periodo di clock basso. Per ogni pulsazione (basso alto) del clock verrà quindi trasmesso un bit di dato x (0 o 1) Oltre a questi invii abbiamo troveremo due ulteriori segnali ACK: per ogni ricezione di byte richiede la generazione di un ACK. Il master device deve generare un extra clock che è associato a questo ACK bit. SDA alto mentre con clock alto (in pratica come un segnale di start in cui però è le eeprom a modificare lo stato delle linea dati). Ed un NO ACK, in pratica il master invia un bit allo slave Entrambi verrano spiegati meglio più avanti. Ogni trasferimento dati inizia con una condizione di Start e termina con una condizione di Stop. Il numero di data bytes trasferti, che è determinato dal master, risulta pertanto illimitato, anche se solo gli ultimi 16 possono essere memorizzati durante una operazione di scrittura. Quando avviene una sovrascrittura essa rimpiazzerà i dati in modalità uno a uno. La procedura è differenziata per la scrittura e la lettura, ma presenta delle parti in comune. Consideriamo la portb 4 collegata alla linea dati e la portb5 collegata al clock 29
30 SCRITTURA DI UN BYTE Le fasi sono le seguenti: START INVIO CONTROL BYTE ACK INVIO INDIRIZZO EEPROM ACK INVIO DATO - ACK - STOP START : bsf portb, 04 movlw 0xcf tris portb bsf portb, 05 bcf portb, 04 ;alziamo la linea dati ;cf = => bit 4 e 5 in uscita ;rb4 e rb5 sono in uscita, quindi il master trasmette alla eeprom slave ;viene alzato il clock (tutte le linee sono alte bus non occuato) ;la linea dati viene abbassata lo start è generato INVIO CONTROL BYTE: Un byte di controllo è il primo ricevuto dopo la condizione di start dal master device. Il control Byte ha la seguente struttura: B2 B1 B0 RW I primi 4 bits 1010 sono un codice di controllo. I successivi tre bits (B2, B1, B0) sono i bits di selezione blocco, che sono usati dal master per selezionare quale degli 8/256 word bloks della memoria deve essere considerato. Questi tre bits sono in pratica i tre bits più significativi del word address. In altre parole il protocollo limita la larghezza della memoria in 8 blocchi di 256 words, ne consegue che il protocollo può supportare solo una 24lc16 per sistema. L'ultimo bit (RW) del control byte definisce la operazione che deve essere svolta. Se è 1 una operazione di lettura se è 0 una operazione di scrittura. Supponiamo che l indirizzo dell eeprom da leggere sia 190, noi potremmo aver caricato 90 nel registro EEADR e 1 nel control byte Il control byte da inviare sarà = 0xA2 dove = valore 1 del 190 e 0 = in quanto dobbiamo scrivere. Il tutto viene quindi risolto con i seguenti comandi: bcf portb, 05 ;il clock viene abbassato in quanto i dati si caricano a clock basso movlw 0xA2 ;carichiamo il control byte movwf EEDATA ;copiamo il valore del control byte in un registro movlw 0x08 ;8 bits da inviare movwf 0x0c ;il registro 0x0c fa da contatore label_invio rlf EEDATA, f ;copiamo il bit 7 nel carry e salviamo il nuovo valore in EEDATA btfss status, C ;se il carry è settato bit da inviare = 1 salta l istruzione seguente bcf portb, 04 ;se il bit da inviare è = 0 abbassa la linea dati btfsc status, C ;se il carry non è settato bit da inviare = 0 salta l istruzione seguente bsf portb, 04 ;se il bit da inviare è = 1 alza la linea dati bsf portb, 05 ;si alza il clock (transizione basso alto il bit viene inviato) bcf portb, 05 ; si riabbassa il clock decfsz 0x0c, f ;il registro contatore viene decrementato è l istruzione seguente saltata quando arriva a zero goto label_invio ;fino all invio degli 8 bits 30
31 ACK: In pratica adesso il master si aspetta dal device un segnale che il suo comando è giunto a destinazione, detto segnale è l ACK. I n genere l ACK è associato ad una sorta di controllo denominato POLLING. Poiche la memoria per scivere i dati nelle celle ci mette tempi incostanti, in genere l attesa dell ACK è associata ad una sorta di controllo denominato POLLING, ossia ad un meccanismo che consente di stabilire se la memorie è pronta a ricevere altri dati. Dopo l invio di <start> <10101 aaa 0>, la memoria deve dare l ACK ossia pilotare la linea dati a 0, se ciò non avviene, ossia la linea dati rimane a 1, il pic riconosce che è impegnata e quindi ritenta di continuo la serie <start> <10101 aaa 0> finche non ottiene l ACK desiderato Vediamo come si risolve in pratica la questione: movlw 0xdf tris portb bsf portb, 05 bsf status, c btfss portb, 04 bcf status, c bcf portb, 05 btfsc status, c goto start ;df = => bit 4 in ingresso e 5 in uscita ;rb4 è in ingresso, quindi la eeprom trasmette al master ;viene alzato il clock ;viene settato il carry ;il sistema si mette in attesa dell abbassamento della linea dati ;quando la linea dati si è abbassata (ack arrivato) il carry è azzerato ;il clock viene abbassato ;se il carry è azzerato l ack è stato ricevuto e si prosegue ;se il carry è ancora a 1, l ack non è arrivato e si torna allo start INVIO INDIRIZZO EEPROM: A questo punto risulta evidente che dovremo inviare il byte che completa l indirizzo eeprom da scrivere. Se l indirizzo era 190, avendo già inserito 1 nel control byte dovremo inviare quindi 90. La procedura è ovviamente analoga a quella dell invio del control byte. Supponendo che il valore di 0x90 sia stato memorizzato in EEADR avremo: movlw 0x08 ;8 bits da inviare movwf 0x0c ;il registro 0x0c fa da contatore label_invio rlf EEADR, f ;copiamo il bit 7 nel carry e salviamo il nuovo valore in EEADR btfss status, C ;se il carry è settato bit da inviare = 1 salta l istruzione seguente bcf portb, 04 ;se il bit da inviare è = 0 abbassa la linea dati btfsc status, C ;se il carry non è settato bit da inviare = 0 salta l istruzione seguente bsf portb, 04 ;se il bit da inviare è = 1 alza la linea dati bsf portb, 05 ;si alza il clock (transizione basso alto il bit viene inviato) bcf portb, 05 ; si riabbassa il clock decfsz 0x0c, f ;il registro contatore viene decrementato è l istruzione seguente saltata quando arriva a zero goto label_invio ;fino all invio degli 8 bits ACK: Si aspeta un altro ACK (ripetizione istruzione già visionate) 31
32 INVIO DATO: Il dato da scrivere, memorizzato in un qualche registro viene inviato con la stessa procedura illustrata per l ivio del control byte e dell indirizzo eeprom. ACK: Si aspeta un altro ACK (ripetizione istruzione già visionate) STOP: Terminata la scrittura si invia uno stop con i seguenti comandi bcf portb, 05 bcf portb, 04 movlw 0xcf tris portb bsf portb, 05 bsf portb, 04 bcf portb, 05 ;il clock è abbassato ;la linea dati viene abbassata ;cf = => bit 4 e 5 in uscita ;rb4 e rb5 sono in uscita, quindi il master trasmette alla eeprom slave ;viene alzato il clock (tutte le linee sono alte bus non occuato) ;la linea dati viene alzata a clok alto lo stop è generato ;il clock viene abbassato SCRITTURA DI UNA PAGINA O DI PIU DATI Se al termine della precedente operazione, invece di inviare una condizione di stop si inviano fino ad un massimo di 16 bytes, questi saranno temporaneamente memorizzati in un buffer e quindi scritti nella memoria. Ovviamente al termine della seguenza va comunque inviata una condizione di stop ed i byte inviati saranno scritti con un incremento unitario del pointer dell'indirizzo del primo byte inviato. Se la condizione di stop non viene inviata il 17 byte svrascrivera il primo. NB il limite di 16 byte è legato al limite fisico della pagina per cui il si ottiene solo se il primo byte è indirizzato ad un un multiplo intero di 0F. In pratica, infatti la eeprom è come fosse costitiuita da pagine di multipli di 0f A 0B 0C 0D 0E 0F A 1B 1C 1D 1E 1F Per cui se il primo indirizzo di scrittura è ad esempio 18 potremo scrivere in seguenza i byte dalla locazione 18 fino al completamento della pagina 1F (8 byte) Lo schema è pertanto il seguente: START INVIO CONTROL BYTE ACK INVIO INDIRIZZO EEPROM ACK INVIO DATO - ACK - INVIO DATO n+1 - ACK - INVIO DATO n+.. - ACK- STOP 32
33 LETTURA DI UN BYTE La 24LC16 contiene un counter che memorizza l'ultimo accesso incrementandolo di una unità. Ne consegue che se un accesso sia di scrittura che di lettura era all'indirizzo n, il successivo indirizzo letto sarà n+1. Poichè in generale l indirizzo a cui si vuole leggere un byte non è lo stesso dell ultimo a cui esso è stato scritto si dovrà ricorrere ad un artifizio. In pratica si simula una operazione di scrittura secondo il seguente schema: START INVIO CONTROL BYTE ACK INVIO INDIRIZZO EEPROM ACK START come si può notare dopo l invio dell indirizzo eeprom e la ricezione dell ack si procede con un altro start. In questo modo abbiamo indirizzato il pointer di scrittura (ma anche di lettura) sulla locazione eeprom desiderata. Da qui in avanti si procederà con la lettura vera e propria: INVIO CONTROL BYTE ACK LETTURA BYTE NO ACK STOP Analizziamo queste ultime fasi INVIO CONTROL BYTE: questa fase è del tutto analoga a quella visionata per la scrittura, solo che l ultimo bit anzichè essere 0 sarà 1 (bit RW = lettura) ACK come già visonato LETTURA BYTE: In pratica il sistema si predispone per il ricevimento di un byte dalla eeprom, vediamo i comandi movlw 0xdf ;df = => bit 4 in ingresso e 5 in uscita tris portb ;rb4 è in ingresso, quindi la eeprom trasmette al master movlw 0x08 ;8 bits da ricevere movwf 0x0c ;il registro 0x0c fa da contatore label_ricevi bsf portb, 05 ;viene alzato il clock bsf status, c ;viene settato il carry btfss portb, 04 ;se arriva un 1 viene saltata l istruzione successiva bcf status, c ;quando la linea dati si è abbassata (arrivato uno 0) il carry è azzerato bcf portb, 05 ;il clock viene abbassato rlf EEDATA, f ;il carry che equivale al bit ricebuto viene caricato nel registro decfsz 0x0c, f ;il registro contatore viene decrementato è l istruzione seguente saltata quando arriva a zero goto label_ricevi ;fino alla ricezione degli 8 bits 33
34 NO ACK: Se si vuole limitare la lettura ad un unico byte il master invia un NO ACK seguito da uno STOP bsf status, C movlw 0xcf tris portb btfss status, C bcf portb, 04 btfsc status, C bsf portb, 04 bsf portb, 05 bcf portb, 05 ;Si setta il carry ;cf = => bit 4 e 5 in uscita ;rb4 e rb5 sono in uscita, quindi il master trasmette alla eeprom slave ;se il carry è settato bit da inviare = 1 salta l istruzione seguente ;se il bit da inviare è = 0 abbassa la linea dati ;se il carry non è settato bit da inviare = 0 salta l istruzione seguente ;se il bit da inviare è = 1 alza la linea dati ;si alza il clock (transizione basso alto il bit viene inviato) ; si riabbassa il clock In pratica come si può notare si sono sfruttate le istruzione per l invio di un byte da parte del master, in modo da porterle gestire come una subroutine, in realtà avendo settaro il carry il tutto si risolverà nell invio di un bit 1. STOP Gia visionato NOTA BENE: nel caso non venga inviato il NOACK il sistema continuera a leggere i byte delle locazioni eeprom successive alla prima fino a quando non si arriverà ad inviare un NOACK ed uno stop. LETTURA E SCRITTURA IN EEPROM SUPERIORI ALLA 24LC 16 L unica differenza sostanziale risiede nella necessità di definire indirizzi di memoria di maggiore entità rispetto a quelli massimi raggiungibili in una 24lc16. Nella 24lc16 abbiamo infatti visto che il massimo valore di memoria raggiungibile è: dal control byte dall address byte quindi = 7FF Poichè le eeprom maggiori della 24lc16 hanno più indirizzi di 7FF occcorre un altro byte per definire l indirizzo. In pratica dopo il control byte dovremo SEMPRE inviare due altri byte: CONTROL BYTE - HIGH ADDRESS BYTE LOW ADDRESS BYTE CONTROL BYTE HIGH ADDRESS BYTE x (il bit 7 non viene considerato) LOW ADDRESS BYTE quindi = 3FFFF max 34
35 L ISTRUZIONE SLEEP (da Tanzilli) Facciamo un piccolo passo indietro ed analiziamo alcune funzioni particolari del pic. Il Power Down Mode o Sleep Mode è un particolare stato di funzionamento del PICmicro utilizzato per ridurre il consumo di corrente nei momenti in cui il PICmicro non è utilizzato perchè in attesa di un evento esterno. Se prendiamo come esempio un telecomando per apricancello o per TV vediamo che per la maggior parte del tempo il PICmicro rimane in attesa che qualcuno prema un tasto. Appena premuto il PICmicro effettua una breve trasmissione e si rimette di nuovo in attesa della pressione del prossimo tasto. Il tempo di utilizzo effettivo della CPU del PICmicro è quindi limitato ai pochi millisecondi necessari per effettuare la trasmissione mentre per diverse ore non è richiesta nessuna elaborazione particolare. Per evitare di consumare inutilmente la limitata energia dalla batteria è possibile spegnere buona parte dei circuiti di funzionamento del PICmicro e riaccenderli solo in corrispondenza di un qualche evento esterno. Vediamo come. L'istruzione SLEEP viene utilizzate per mettere il PIC in Power Down Mode e ridurre di conseguenza la corrente assorbita che passerà da circa 2mA (a 5 volt con clock di funzionamento a 4Mhz) a circa 2]A, ovvero 1000 volte di meno! Per entrare in Power Down Mode basta inserire questa istruzione in un punto qualsiasi del nostro programma: SLEEP. Qualsiasi istruzione presente dopo la SLEEP non verrà eseguita dal PICmicro che terminerà in questo punto la sua esecuzione, spegnerà tutti i circuiti interni, tranne quelli necessari a mantenere lo stato delle porte di I/O (stato logico alto, basso o alta impedenza) ed a rilevare le condizioni di "risveglio" di cui perleremo di seguito. Per ridurre il consumo di corrente in questo stato, non devono esserci ovviamente circuiti collegati alle linee di uscita del PIC che consumino corrente. O meglio questi circuiti devono essere progettati in modo da limitare il loro assorbimento nelle condizioni di Power Down. Un altro accorgimento raccomandato dalla Microchip è quello di collegare al positivo (Vdd) o al negativo (Vss) di alimentazione tutte le linee in alta impedenza non utilizzate compresa la linea RA4/T0CKI (pin 3). Il "risveglio" del PICmicro Per risvegliare il PICmicro dal suo sonno possono essere utilizzate diverse tecniche: 1. Reset del PICmicro mettendo a 0 il pin MCLR (pin 4) 2. Timeout del timer del Watchdog (se abilitato) 3. Verificarsi di una situazione di interrupt (interrupt dal pin RB0/INT, cambio di stato sulla porta B, termine delle operazioni di scrittura su EEPROM) Nei casi 1 e 2 il PICmicro viene resettato e l'esecuzione ripresa dalla locazione 0. Nel caso 3 il PICmicro si comporta come nella normale gestione di un interrupt eseguendo per primo l'interrupt handler e quindi riprendendo l'esecuzione dopo l'istruzione SLEEP. Perché il PICmicro venga risvegliato da un interrupt devono essere abilitati opportunamento i flag del registro INTCON. 35
36 IL WATCH DOG TIMER Lo scopo del Watch Dog Timer scopo è quello di migliorare l'affidabilità dei nostri circuiti basati su PICmicro. Il Watch Dog Timer è in pratica un oscillatore interno al PICmicro, ma completamente indipendente dal resto della circuiteria, il cui scopo è quello di rilevare eventuali blocchi della CPU del micro e resettare il PICmicro per riprendere la normale esecuzione del programma. L abilitazione del Watch Dog Timer avviene in fase di programmazione intervenendo su settaggi del programmatore (ad esempio ic prog) o attraverso la direttiva di configurazione attivando il flag WDTE (vedi avanti). Per poter rilevare un eventuale blocco della CPU durante l'esecuzione del programma principale, viene inserita all'interno di questo, una istruzione speciale, la: CLRWDT (CLeaR Watch Dog Timer) la quale azzera ad intervalli regolari il Watch Dog Timer non consentendogli di terminare il suo conteggio. Se la CPU non effettua questa istruzione prima del termine del conteggio allora si assume che il programma si è bloccato per qualche motivo e si effettua il Reset della CPU. Il periodo minimo raggiunto il quale la CPU viene resettata è di circa 18ms (dipende dalla temperatura e dalla tensione di alimentazione). E' possibile però assegnare il PRESCALER al Watch Dog Timer per ottenere ritardi più lunghi fino a 2.3 secondi. Agendo sul bit PSA del registro OPTION è possibile assegnare il prescaler al Watch Dog Timer per ottenere dei tempi di ritardo di intervento maggiori. Il bit PSA và settato ad uno con l'istruzione: BSF OPTION, PSA In caso contrario il prescaler verrà assegnato al TMR0 (vedi capitolo dedicato). Ovviamente assegnado il prescaler al WDT non sarà possibile assegnarlo completamente al TMR0 e viceversa. Intervenendo sui valori dei bit PS0, PS1 e PS2 dello stesso registro OPTION potremmo ottenere diversi intervalli di ritardo. La scelta corretta dovrà essere fatta tenedo conto del massimo ritardo che riusciamo ad ottenere all'interno del nostro programma tra l'esecuzione di due istruzioni CLRWDT successive. Nella tabella seguente è riportato la corrispondenza tra i valori di questi bit e gli intervalli che otterremo. PS2 PS1 PS0 ritardo ms
37 LE DIRETTIVA CONFIG Contrariamente a quanto avviene per le istruzioni assembler, le direttive non vengono tradotte in codici operativi per il micro e della loro presenza nel source non ne rimane alcuna traccia nel file compilato con cui programmeremo il micro. In precedenza abbiamo gia visto la direttiva ORG e INCLUDE prendiamo ora in considerazione la direttiva CONFIG al fine di capire alcuni aspetti delle fasi di programmazione e dei settaggi impiegati nei sw di programmazione (vedi IC PROG). Per le altre direttive si rimanda a testi più aprofonditi CONFIG Descrizione Esempio Con questa direttiva è possibile definire il valore da memorizzare nella word di configurazione. Prima di utilizzare questa direttiva occorre aver specificato nel sorgente quale PICmicro si sta utilizzando con la direttiva LIST. Le differenti famiglie di PICmicro hanno la word di configurazione implementate su indirizzi diversi. Nel PIC16F84 l'indirizzo è 2007 hex. E' necessario inoltre verificare che il programmatore di PICmicro che si sta utilizzando sia in grado di leggere il valore della word di configurazione dal file.hex e di programmarlo correttamente nella giusta locazione del PICmicro. Questa funzione non sempre è disponibile specialmente nei programmatori di basso costo, per cui è perfettamente inutile usare la direttiva CONFIG all'interno del nostro source ma occorre agire direttamente sui comandi messi a disposizione dal programmatore specifico. Nella figura seguente riportiamo la struttura della word di configurazione del PIC16F84 estratta dal datasheet Microchip CONFIGURATION WORD - PIC16F83 AND PIC16F84 R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u CP CP CP CP CP CP CP CP CP CP PWRTE WDTE FOSC1 FOSC0 bit13 bit0 R = Readable bit P = Programmable bit - n = Value at POR reset u = unchanged bit 13:4 CP: Code Protection bit 1 = Code protection off 0 = All memory is code protected bit 3 PWRTE: Power-up Timer Enable bit 1 = Power-up timer is disabled 0 = Power-up timer is enabled bit 2 WDTE: Watchdog Timer Enable bit 1 = WDT enabled 0 = WDT disabled bit 1:0 FOSC1:FOSC0: Oscillator Selection bits 11 = RC oscillator 10 = HS oscillator 01 = XT oscillator 00 = LP oscillator 37
38 Ipotizziamo di voler programmare il nostro PICmicro con la protezione del codice disabilitata (CP=1), il Power-up timer abilitato (PWRTE=0), il Watch dog disabilitato (WDTE=0) e l'oscillatore settato in modo XT (FOSC1=0, FOSC0=1). La word di configurazione dovrà essere programmata con il seguente valore binario: Per cui la direttiva da utilizzare sarà: CONFIG B oppure l'equivalente esadecimale: CONFIG 0x3FF1 Il nostro source al completo sarà: PROCESSOR 16F84 CONFIG 3FF1H ; Inserire qui il nostro programma END Da cui l'assemblatore genera il seguente file.hex: :02400E00F13F80 : FF dove: :02400E00F13F80 : FF è l'indirizzo dove si trova la configuration word nel PIC16F84 pari a 400E / 2 = L'indirizzo deve essere diviso in due perchè il formato.hex a 8 bit prevede l'uso di indirizzi orientati al byte. :02400E00F13F80 : FF è il valore che verrà programmato nella locazione 2007 hex. Il valore deve essere letto con i due byte invertiti, ovvero 3FF1 che corrisponde esattamente a quanto abbiamo inserito noi nel nostro source. 38
39 Questo è il set completo delle istruzioni riconosciute dal PIC16F84: Sintassi Descrizione Microchip Operazione equivalente ADDLW k Add Literal and W W = W + k ADDWF f,d Add W and f d = W + f (dove d può essere W o f) ANDLW k AND Literal with W W = W AND k ANDWF f,d AND W with f d = W AND f (dove d può essere W o f) BCF f,b Bit Clear f f(b) = 0 BSF f,b Bit Set f f(b) = 1 BTFSC f,b Bit Test f, Skip if Clear f(b) = 0? Si, salta una istruzione BTFSS f,b Bit Test f, skip if Set f(b) = 1? Si, salta una istruzione CALL k Subroutine Call Chiama la subroutine all'indirizzo k CLRF f Clear f f = 0 CLRW Clear W Register W = 0 CLRWDT Clear Watchdog Timer Watchdog timer = 0 COMF f,d Complement f d = not f (dove d può essere W o f) DECF f,d Decrement f d = f -1 (dove d può essere W o f) DECFSZ f,d Decrement f, Skip if 0 d = f -1 (dove d può essere W o f) se d = 0 salta GOTO k Go to address Salta all'indirizzo k INCF f,d Increment f d = f +1 (dove d può essere W o f) INCFSZ f,d Increment f, Skip if 0 d = f +1 (dove d può essere W o f) se d = 0 salta IORLW k Inclusive OR Literal with W W = W OR k IORWF f,d Inclusive OR W with f d = f OR W (dove d può essere W o f) MOVLW k Move literal to W W = k MOVF f,d Move f d = f (dove d può essere W o f) MOVWF f Move W to f f = W NOP No Operation Nessuna operazione OPTION Load Option Register OPTION = W RETFIE Return from Interrupt Ritorna da un interrupt handler RETLW k Return Literal to W Ritorna da una subroutine con W = k RETURN Return from Subroutine Ritorna da una subroutine RLF f,d Rotale Left f through Carry d = f << 1 (dove d può essere W o f) RRF f,d Rotale Right f through Carry d = f >> 1 (dove d può essere W o f) SLEEP Go into Standby Mode Mette in standby il PIC SUBLW k Subtract W from Literal W = k - W SUBWF f,d Subtract W from f d = f - W (dove d può essere W o f) 39
40 SWAPF f Swap f f = Swap dei bit 0123 con 4567 di f TRIS f Load TRIS Register TRIS di f = W XORLW k Exclusive OR Literal with W W = W XOR k XORWF f,d Exclusive OR W with f d = f XOR W (dove d può essere W o f) 40
MICROCONTROLLORE PIC16F84A
MICROCONTROLLORE PIC16F84A Il microcontrollore pic16f84a, a differenza di un computer normale e' dotato in un unico integrato di tutti gli elementi fondamentali di un computer, che sono la Cpu, unita'
Lezione 1 Caratteristiche principali del PIC16C84 L'hardware
Lezione 1 Nella prima lezione del corso, cercheremo di comprendere come sia fatto internamente il controller più conosciuto di Microchip, ovvero il PIC16C84 poi evoluto nel PIC16F84. Sebbene i microcontroller
I microcontrollori. In sostanza i pic hanno le seguenti caratteristiche:
I microcontrollori Con il termine di microcontrollori si intende un sistema integrato simile ad un microprocessore ma contente su un unico chip oltre la CPU, anche la memoria RAM, memoria dati, memoria
Lezione 8. Figura 1. Configurazione del registro INTCON
Lezione 8 In questa puntata, ci dedicheremo all'impiego dei cosiddetti "interrupt", che tanto incutono temore ai più inesperti. Ma che cosa sono questi interrupt? Come abbiamo già visto, un programma non
Programmazione del microcontrollore PIC 16F84
Programmazione del microcontrollore PIC 16F84 2 Indice Capitolo 1: Set di istruzioni del PIC 16F84 1.1 Descrizione sintetica 1.2 Simbologia adottata 1.3 Sintassi 1.4 Descrizione completa Capitolo 2: Variabili,
Capitolo X del Testo Ettore Panella Giuseppe Spalierno Corso di Elettronica 3 Edizioni Cupido MICROCONTROLLORE PIC 16F84
Microcontrollore PIC 16F84 1 1. Generalità Capitolo X del Testo Ettore Panella Giuseppe Spalierno Corso di Elettronica 3 Edizioni Cupido MICROCONTROLLORE PIC 16F84 I microcontrollori sono dei circuiti
Lezione 2. Figura 1. Schema del circuito necessario per le prove
Lezione 2 Inizializzazione porte Il primo argomento che tratteremo è la prima operazione da effettuare quando si programma un microcontrollore ovvero settare correttamente le porte ed inizializzare i registri
Gestione Degli INTERRUPT
Gestione Degli INTERRUPT Il PIC 16F876 possiede vari tipi di Interrupt. Si parla di 14 differenti sorgenti di interrupt, ma molto facilmente nella programmazione se ne terranno in considerazione ben pochi:
SISTEMA DI SVILUPPO MC-16
SISTEMA DI SVILUPPO MC-16 per microcontrollori PIC16F84 - PIC16F876 o MANUALE DI PROGRAMMAZIONE 2 Il sistema MC-16 contiene: Scheda di sviluppo a microcontrollore con PIC16F84 e PIC16F876. Unità di programmazione
Lezione 4. Figura 1. Schema di una tastiera a matrice di 4x4 tasti
Lezione 4 Uno degli scogli maggiori per chi inizia a lavorare con i microcontroller, è l'interfacciamento con tastiere a matrice. La cosa potrebbe a prima vista sembrare complessa, ma in realtà è implementabile
Pilotare un motore passo-passo, in questo caso il modello della Sanyo le cui caratteristiche principali sono quelle di figura1.
10. Pilotaggio unipolare di un motore passo-passo Scopo della prova Pilotare un motore passo-passo, in questo caso il modello 103-547-52500 della Sanyo le cui caratteristiche principali sono quelle di
Esercizi di verifica del debito formativo:
Esercizi di verifica del debito formativo: Disegnare il diagramma e scrivere la tabella delle transizioni di stato degli automi sequenziali a stati finiti che rappresentano il comportamento dei seguenti
Componenti principali. Programma cablato. Architettura di Von Neumann. Programma cablato. Cos e un programma? Componenti e connessioni
Componenti principali Componenti e connessioni Capitolo 3 CPU (Unita Centrale di Elaborazione) Memoria Sistemi di I/O Connessioni tra loro 1 2 Architettura di Von Neumann Dati e instruzioni in memoria
Struttura di programmi MAL Elementi lessicali
Elementi lessicali Ogni microistruzione è definita su una linea di programma Le linee vuote vengono ignorate Le linee con solo commenti vengono ignorate Il carattere di fine linea (RETURN ENTER INVIO)
Componenti e connessioni. Capitolo 3
Componenti e connessioni Capitolo 3 Componenti principali CPU (Unità Centrale di Elaborazione) Memoria Sistemi di I/O Connessioni tra loro Architettura di Von Neumann Dati e instruzioni in memoria (lettura
Il µcontrollore PIC 16F84
Il µcontrollore PIC 16F84 Microchip Tecnology D. Ch. 1 Il grande successo dei microcontrollori ha indotto tutte le grandi case costrutrici di semiconduttori come la Intel, la Philips Semiconductors, la
ESERCIZI SUI SISTEMI DI NUMERAZIONE
ESERCIZI SUI SISTEMI DI NUMERAZIONE 1 ) Convertire in base 10 i seguenti numeri rappresentati nelle basi indicate: (1000101) 2 [R. 69] (477) 8 [R. 319] (40F) 16 [R. 1039] (5778) 9 [R. 4283] (126) 9 [R.
Microcontrollori. L ultima parte del corso prevede un approfondimento sui microprocessori, in particolare sul PIC 16F876.
111 Microcontrollori L ultima parte del corso prevede un approfondimento sui microprocessori, in particolare sul PIC 16F876. In elettronica digitale il microcontrollore è un dispositivo elettronico integrato
Introduzione. Corso di Informatica Applicata. Università degli studi di Cassino
Università degli studi di Cassino Corso di Laurea in Ingegneria della Produzione Industriale Corso di Informatica Applicata Introduzione Ing. Saverio De Vito e-mail: [email protected] Tel.:
Applicazioni dei microcontrollori PIC
Applicazioni dei microcontrollori PIC In questa unità vengono esposte le modalità di realizzazione di un circuito hardware con il microcontroller PIC16C84 (o PIC16F84), per la prova dei programmi presentati
Architettura dei computer
Architettura dei computer In un computer possiamo distinguere quattro unità funzionali: il processore la memoria principale (memoria centrale, RAM) la memoria secondaria i dispositivi di input/output La
PROGRAMMAZIONE ASSEMBLER
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
Il processore. Istituzionii di Informatica -- Rossano Gaeta
Il processore Il processore (detto anche CPU, ovvero, Central Processing Unit) è la componente dell unità centrale che fornisce la capacità di elaborazione delle informazioni contenute nella memoria principale
PUNTATORE LASER AUTOMATICO CON COMANDO VIA ETHERNET
Canzian Sara Liberali Marco 5AT A.S.2007/2008 PUNTATORE LASER AUTOMATICO CON COMANDO VIA ETHERNET Questo sistema permette di posizionare una luce laser in una determinata posizione data dalle coordinate
List p=16f84 ;Tipo di processore include "P16F84.INC" ;Definizioni di registri interni. goto Inizio
ESEMPIO 1.1 Autore: Mikel Etxebarria (c) Microsystems Engineering (Bilbao) Esempio per simulazione Sommare due valori immediati (p.e. 5+7) il risultato va depositato nella posizione 0x10 List p=16f84 Tipo
Il precedente programma è scritto in linguaggio Assembly per Z80. Il programma indicato sopra deve essere tradotto in codice Assembly per PIC
[LABEL:] CODICE OP1[,OP2][COMMENTO] MNEM LD E,0H PIO EQU 0CH ORG 100H LD E,0 ciclo: IN A,(PIO) LD B,A IN A,(PIO) LD C,A LD A,E ADD A,B SUB C CP 8CH JRZ (ciclo) LD A,1 OUT (PIO),A HALT END Il precedente
APPUNTI SUL PIC16F84
APPUNTI SUL PIC16F84 Gianluca 'gurutech' Mascolo v0.1 04/04/2004 mailto: gurutech_at_gurutech.it Hackit04 Il PIC16F84 è un microcontrollore a 8-bit dotato di due porte di I/O digitali, una da 5 bit e una
Corso di Informatica Applicata. Lezione 7. Università degli studi di Cassino
Università degli studi di Cassino Corso di Laurea in Ingegneria della Produzione Industriale Corso di Informatica Applicata Lezione 7 Ing. Saverio De Vito e-mail: [email protected] Tel.: +39
CIRCUITO DI TEST E SOFTWARE UTILIZZATI
CIRCUITO DI TEST E SOFTWARE UTILIZZATI Circuito di Test Nello schema elettrico di figura A è rappresentato un circuito, realizzabile anche senza l ausilio di un circuito stampato, che consente di testare
Architettura hardware
Architettura hardware la parte che si può prendere a calci Architettura dell elaboratore Sistema composto da un numero elevato di componenti, in cui ogni componente svolge una sua funzione elaborazione
Assembly PIC16F8X. Dispensa di elettronica sull uso del microcontrollore PIC 16F8X
Dispensa di elettronica sull uso del microcontrollore PIC 16F8X Anno scolastico 2010/2011 Corso di Sistemi, specializzazione elettronica ITIS Galileo Ferraris Prof. Aniello Celentano L obiettivo della
Nel microprocessore 8086 abbiamo una gran quantità di registri
I registri del microprocessore 8086 Nel microprocessore 8086 abbiamo una gran quantità di registri AH AL AX 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 B H B L BX 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 C H C L CX 1 0 1 1
PROCESSOR 16F84A. ;configurazione FUSES: oscillatore XT, WDT disabilitato PWRT abilitato, CP disabilitato config 0x3FF1
---- ; Programma per ROBOT MDB3F2004-05 Evolution ; Autore: MICCI Antonello copyright 2005 ---- ------------------------- ;Piedino RA0 ingresso fotocellula dx livello basso rilevazione ostacolo ;Piedino
Sistemi di Elaborazione delle Informazioni
SCUOLA DI MEDICINA E CHIRURGIA Università degli Studi di Napoli Federico II Corso di Sistemi di Elaborazione delle Informazioni Dott. Francesco Rossi a.a. 2016/2017 1 Programma del corso Informatica di
TM1638 BOARD con ARDUINO
TM1638 BOARD con ARDUINO 8-Bit LED 8-Bit Digital 8-Bit Key TM1638. Ci sono solo tre linee di controllo.c'è una libreria e la scheda ha solo 3 pin di controllo, più alimentazione e la terra. I pin di controllo
Microcontrollori PIC Teoria, Esperimenti, Esercizi HARDWARE DEL PIC SOFTWARE DEL PIC MPLAB MEMORIA PORTE-IO TIMER DISPLAY AUDIO ADC INTERRUPT EEPROM
Microcontrollori PIC Teoria, Esperimenti, Esercizi HARDWARE DEL PIC SOFTWARE DEL PIC MPLAB MEMORIA PORTE-IO TIMER DISPLAY AUDIO ADC INTERRUPT EEPROM HARDWARE DEL PIC Il PIC6F684 (PIC=Peripheral Interface
CONTATORE/TIMER PROGRAMMABILE CTC Z80 1. Piedinatura 2. Struttura interna 4. Modo timer 5. Modo Counter 8. Programmazione del CTC 13
CONTATORE/TIMER PROGRAMMABILE CTC Z80 1 Piedinatura 2 Struttura interna 4 Modo timer 5 Modo Counter 8 Programmazione del CTC 13 Gerarchia di priorità delle interruzioni 17 Interfacciamento 17 Contatore/Timer
COMUNICAZIONE SERIALE a cura dell' Ing. Buttolo Marco
COMUNICAZIONE SERIALE a cura dell' Ing. Buttolo Marco Un PC può comunicare in vari modi con le periferiche. Fondamentalmente esistono due tipi di comunicazione molto comuni: 1. La comunicazione seriale
Architettura Harvard: il PIC possiede memorie separate per i dati e le istruzioni.
Il PIC 16F84 Introduzione Il 16F84 è un microcontrollore RISC a 8 bit della Microchip estremamente versatile e semplice da utilizzare. E' possibile controllare led, rele', motori e attuatori in genere
GESTIONE DEI TEMPI CON IL TIMER1 DEL PIC16F876
GESTIONE DEI TEMPI CON IL TIMER1 DEL PIC16F876 6.0 TIMER1 MODULE The Timer1 module is a 16-bit timer/counter consisting of two 8-bit registers (TMR1H and TMR1L), which are readable and writable. The TMR1
Architettura di una CPU
Massimo VIOLANTE Politecnico di Torino Dipartimento di Automatica e Informatica Sommario Organizzazione di un processore Linguaggio macchina Modi di indirizzamento Tipi di istruzioni 2 M. Violante 1.1
Il Ciclo Fetch-Decode-Execute. C Nyssen/Aberdeen College 2003
Il Ciclo Fetch-Decode-Execute C Nyssen/Aberdeen College 2003 Linguaggio Assembler Op code (Mnemonico) Operando #assembly code program 0000 LDA-24 #loads 0001 ADD-25 #adds 0002 HLT #stops #end of program
ISA Input / Output (I/O) Data register Controller
ISA Input / Output (I/O) Numerose Periferiche di tanti tipi diversi, collegati alla CPU mediante BUS diversi. Solo Input (tastiera, mouse), producono dati che la CPU deve leggere. Solo Output (Schermo),
Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini
Architettura degli Elaboratori e delle Reti Il set istruzioni di MIPS Modalità di indirizzamento Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano
Nicola Amoroso. Corso introduttivo sui microcontrollori A. S La programmazione dei PIC.
Corso introduttivo sui microcontrollori A. S. 2007 2008 La programmazione dei PIC Nicola Amoroso [email protected] NA L3 1 Il software per il PIC Come per qualsiasi sistema a microprocessore, anche
Istruzioni assembler Istruzione N Registri
Istruzioni assembler Istruzione N Registri Aritmetica add a, b, c a = b+c addi a, b, num a = b + sub a, b, c a = b - c mul a, b, c a = b*c div a, b, c a = b/c utilizzati Descrizione 3 Somma. Somma b e
Il Processore: l unità di controllo
Il Processore: l unità di controllo La frequenza con cui vengono eseguiti i cicli di esecuzione è scandita da una componente detta clock Ad ogni impulso di clock la UC esegue un ciclo di esecuzione di
Componenti di un processore
Componenti di un processore Unità di Controllo Bus Interno REGISTRI Program Counter (PC) Registro di Stato (SR) Registro Istruzioni (IR) Registri Generali Unità Aritmetico- Logica Registro Indirizzi Memoria
ARCHITETTURA DI UN ELABORATORE! Ispirata al modello della Macchina di Von Neumann (Princeton, Institute for Advanced Study, anni 40).!
ARCHITETTURA DI UN ELABORATORE! Ispirata al modello della Macchina di Von Neumann (Princeton, Institute for Advanced Study, anni 40).! MACCHINA DI VON NEUMANN! UNITÀ FUNZIONALI fondamentali! Processore
DEC PDP8, III Generazione, '65-'75
Parte I DEC PDP8, III Generazione, '65-'75 PDP8 Architettura (Livello Registri) 12 bit Program Counter PC 12 bit Memory Address Register MAR Random Access Memory RAM 4096 x 16 1 bit I 3 bit Operation Code
Elaborazione dell informazione
Elaborazione dell informazione Primo esempio Ricominciamo dai numeri (45 + 25) è definita rigorosamente Un primo calcolatore (a) Figura 1.1 Configurazione del pallottoliere (a) prima e (b) dopo l esecuzione
Corso introduttivo sui microcontrollori. Un sistema tastierino a matrice 4x4 da collegare alla nostra demoboard AnxaPic.
Corso introduttivo sui microcontrollori Un sistema tastierino a matrice 4x4 da collegare alla nostra demoboard AnxaPic Nicola Amoroso [email protected] na_16f88_key4x4 1 Colleghiamo un tastierino a
Interfacciamento di periferiche I/O al μp 8088
Interfacciamento di periferiche I/O al μp 8088 5.1 Principali segnali della CPU 8086 5.2 Periferiche di I/O e loro gestione 5.3 Collegamento di periferiche di input 5.4 Collegamento di periferiche di output
Il protocollo RS Introduzione. 1.2 Lo Standard RS-232
1 Il protocollo RS232 1.1 Introduzione Come noto un dispositivo di interfaccia permette la comunicazione tra la struttura hardware di un calcolatore e uno o più dispositivi esterni. Uno degli obiettivi
Appunti di informatica. Lezione 3 anno accademico Mario Verdicchio
Appunti di informatica Lezione 3 anno accademico 2015-2016 Mario Verdicchio Numeri binari in memoria In un calcolatore, i numeri binari sono tipicamente memorizzati in sequenze di caselle (note anche come
Istruzioni macchina. Dove sono gli operandi? Ciclo della CPU. Elementi di un istruzione macchina. Rappresentazione delle istruzioni
Istruzioni macchina Linguaggio macchina Insieme delle istruzioni (instruction set) che la CPU puo eseguire Capitolo 10 1 2 Elementi di un istruzione macchina Codice operativo Specifica l operazione da
PIC Esempi - LED. Per i primi esempi viene utilizzato soltanto un LED sulla porta B (PortB), successivamente si utilizzano più LED.
PIC Esempi - LED Per i primi esempi viene utilizzato soltanto un LED sulla porta B (PortB), successivamente si utilizzano più LED. 1.1 Questo semplice programma esegue uno switch ripetutamente su tutti
MANUALE PER L OPERATORE Versione software: 1.0
Sesto S. Giovanni - 19 Maggio 2004 Div. elettronica DATAFLOW Rev.1.0 SW-HW:DATALINK SOFTWARE PER L ELABORAZIONE DEI SEGNALI RILEVATI DALLA SCHEDA DI ACQUISIZIONE MANUALE PER L OPERATORE Versione software:
La codifica digitale
La codifica digitale Codifica digitale Il computer e il sistema binario Il computer elabora esclusivamente numeri. Ogni immagine, ogni suono, ogni informazione per essere compresa e rielaborata dal calcolatore
Architettura degli Elaboratori Lez. 8 CPU MIPS a 1 colpo di clock. Prof. Andrea Sterbini
Architettura degli Elaboratori Lez. 8 CPU MIPS a 1 colpo di clock Prof. Andrea Sterbini [email protected] Argomenti Progetto della CPU MIPS a 1 colpo di clock - Istruzioni da implementare - Unità
EFA Automazione S.r.l. Serial Bridge 3 - Modbus RTU slave to PICnet (01 ITA).doc pag. 1 / 8
EFA Automazione S.r.l. Serial Bridge 3 - Modbus RTU slave to PICnet (01 ITA).doc pag. 1 / 8 Applicazione Integrazione di reti PICnet mediante l interfacciamento del modulo master (PN MAS dotato di porta
Linguaggio macchina. 3 tipi di istruzioni macchina. Istruzioni per trasferimento dati. Istruzioni logico/aritmetiche
3 tipi di istruzioni macchina Linguaggio macchina e assembler 1) trasferimento tra RAM e registri di calcolo della CPU 2) operazioni aritmetiche: somma, differenza, moltiplicazione e divisione 3) operazioni
Calcolatori Elettronici
Esercitazione 2 I Flip Flop 1. ual è la differenza tra un latch asincrono e un Flip Flop? a. Il latch è abilitato da un segnale di clock b. Il latch ha gli ingressi asincroni perché questi ultimi controllano
Laboratorio di Architettura degli Elaboratori A.A. 2016/17 Circuiti Logici
Laboratorio di Architettura degli Elaboratori A.A. 2016/17 Circuiti Logici Per ogni lezione, sintetizzare i circuiti combinatori o sequenziali che soddisfino le specifiche date e quindi implementarli e
Interfaccia seriale per LM709SW
Interfaccia seriale per LM709SW Caratteristiche tecniche : Alimentazione di ingresso : 6.6 VDC 12 VDC Interfaccia di collegamento : RS232 Segnalazione a led di rx e tx seriale Segnalazione a led per errori
Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione dei numeri relativi
Codice BCD Prima di passare alla rappresentazione dei numeri relativi in binario vediamo un tipo di codifica che ha una certa rilevanza in alcune applicazioni: il codice BCD (Binary Coded Decimal). È un
Somma di numeri binari
Fondamenti di Informatica: Codifica Binaria dell Informazione 1 Somma di numeri binari 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10 Esempio: 10011011 + 00101011 = 11000110 in base e una base Fondamenti di
Dalla tabella alla funzione canonica
Dalla tabella alla funzione canonica La funzione canonica è la funzione logica associata alla tabella di verità del circuito che si vuole progettare. Essa è costituita da una somma di MinTerm con variabili
APPUNTI DI INFORMATICA
APPUNTI DI INFORMATICA Per il biennio di liceo scientifico scienze applicate Sommario Il calcolo binario... 2 Numerazione Decimale... 2 Numerazione Binaria... 2 Conversione Binario -> Decimale... 2 Conversione
LEZIONE DI MATEMATICA SISTEMI DI NUMERAZIONE. (Prof. Daniele Baldissin)
LEZIONE DI MATEMATICA SISTEMI DI NUMERAZIONE (Prof. Daniele Baldissin) L'uomo usa normalmente il sistema di numerazione decimale, probabilmente perché ha dieci dita. Il sistema decimale è collegato direttamente
I Circuiti combinatori: LOGISIM
1 ISTITUTO DI ISTRUZIONE SUPERIORE ANGIOY I Circuiti combinatori: LOGISIM Prof. G. Ciaschetti 1. Le porte logiche Un circuito combinatorio (o sistema combinatorio o rete combinatoria) è un circuito elettrico,
Cap. 2 - Rappresentazione in base 2 dei numeri interi
Cap. 2 - Rappresentazione in base 2 dei numeri interi 2.1 I NUMERI INTERI RELATIVI I numeri relativi sono numeri con il segno: essi possono essere quindi positivi e negativi. Si dividono in due categorie:
Facciamo lampeggiare un led
Facciamo lampeggiare un led Passiamo a fare qualche esercizio, il più semplice per iniziare a programmare con Arduino è il canonico esercizio blink, che trovate anche negli esempi del programma. Si tratta
Struttura CPU. Struttura e Funzione del Processore. Capitolo 12. Compiti CPU:
Struttura e Funzione del Processore Capitolo 12 Struttura CPU Compiti CPU: Prelevare istruzioni Interpretare istruzioni Prelevare dati Elaborare dati Scrivere (memorizzare) dati 1 CPU con bus di sistema
Il precedente programma è scritto in linguaggio Assembly per Z80. Il programma indicato sopra deve essere tradotto in codice Assembly per PIC
[LABEL:] CODICE OP1[,OP2][COMMENTO] MNEM LD E,0H PIO EQU 0CH ORG 100H LD E,0 ciclo: IN A,(PIO) LD B,A IN A,(PIO) LD C,A LD A,E ADD A,B SUB C CP 8CH JRZ (ciclo) LD A,1 OUT (PIO),A HALT END Il precedente
Sistemi Web per il turismo - lezione 3 -
Sistemi Web per il turismo - lezione 3 - Software Si definisce software il complesso di comandi che fanno eseguire al computer delle operazioni. Il termine si contrappone ad hardware, che invece designa
Davide Gennaretti, Matteo Nicolini
Seminario sui Microcontrollori Davide Gennaretti, Matteo Nicolini AA 2003-04 II Facoltà di Ingegneria Elettronica Cesena Cosa sono i microcontrollori? Piccoli computer concentrati in un chip Un Datapath
Gateway KNX/DALI 64/16 - da guida DIN GW Manuale Tecnico
Gateway KNX/DALI 64/16 - da guida DIN GW 90872 Manuale Tecnico 1 Sommario 1 Introduzione... 3 2 Applicazione... 3 2.1 Limiti delle associazioni... 3 3 Menù Generale... 4 3.1 Parametri... 4 3.2 Oggetti
Architettura di un calcolatore e linguaggio macchina. Primo modulo Tecniche della programmazione
Architettura di un calcolatore e linguaggio macchina Primo modulo Tecniche della programmazione CPU Central Processing Unit, processore Unita logica/aritmetica: elaborazione dati Unita di controllo: coordina
Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012
Fondamenti di Informatica - 1 Prof. B.Buttarazzi A.A. 2011/2012 Sommario Rappresentazione dei numeri naturali (N) Rappresentazione dei numeri interi (Z) Modulo e segno In complemento a 2 Operazioni aritmetiche
Il Processore. Informatica di Base -- R.Gaeta 27
Il Processore Il processore (detto anche CPU, ovvero, Central Processing Unit) è la componente dell unità centrale che fornisce la capacità di elaborazione delle informazioni contenute nella memoria principale
Corso di programmazione Arduino DI MALVEZZI DAVIDE
Corso di programmazione Arduino DI MALVEZZI DAVIDE Argomenti Pin digitali e pin analogici Gestione di timer e bottoni Utilizzo della porta seriale Oggetto String Controllo di schermi LCD Utilizzo dell
Esercitazione. Excel: le macro. C.1 Registrazione di macro
Esercitazione Excel: le macro C.1 Registrazione di macro Se una serie di operazioni viene eseguita frequentemente, è possibile creare una macro che esegua automaticamente tali operazioni quando viene richiamata.
EEPROM SERIALI IN I2C BUS.
Corso di BASCOM 8051 - (Capitolo 3 0 ) Corso Teorico/Pratico di programmazione in BASCOM 8051. Autore: DAMINO Salvatore. EEPROM SERIALI IN I2C BUS. Tra i dispositivi più utilizzati, nelle applicazioni
All interno di un ATmega16 troviamo moltissimi dispositivi trai quali, timer, gestori delle interupt personalizzabili, convertitori A/D, multiplexer
All interno di un ATmega6 troviamo moltissimi dispositivi trai quali, timer, gestori delle interupt personalizzabili, convertitori A/D, multipleer ecc. Inoltre troviamo 3 tipi di memoria: l EEPROM che
EFA Automazione S.r.l. SB3Conf Help V1.00 (01 ITA).doc pag. 1 / 10
EFA Automazione S.r.l. SB3Conf Help V1.00 (01 ITA).doc pag. 1 / 10 SOMMARIO Requisiti software pag. 2 Istruzioni per l installazione pag. 2 Avvio del Configuratore pag. 2 Creazione di un nuovo progetto
Architettura degli Elaboratori I Esercitazione 5 - Progettazione di Reti di Interconnessione fra Registri Roberto Navigli
Architettura degli Elaboratori I Esercitazione 5 - Progettazione di Reti di Interconnessione fra Registri Roberto Navigli 1 Reti di Interconnessione fra Registri In questa esercitazione vedremo i quattro
senza stato una ed una sola
Reti Combinatorie Un calcolatore è costituito da circuiti digitali (hardware) che provvedono a realizzare fisicamente il calcolo. Tali circuiti digitali possono essere classificati in due classi dette
I circuiti dei calcolatori, le memorie, i bus. I fondamenti della rappresentazione dell informazione e della sua trasmissione ed elaborazione.
I circuiti dei calcolatori, le memorie, i bus. I fondamenti della rappresentazione dell informazione e della sua trasmissione ed elaborazione. Dispensina per gli studenti di Ingegneria Gestionale. A.A.
Manuale per la programmazione del PIC 16F84
Manuale per la programmazione del PIC 16F84 Principi basi per la programmazione Introduzione alla programmazione Strutture basi di programmazione Descrizione del microcontrollore 16F84 Descrizione tecnica
Assembly. Modello x86
Assembly Modello x86 1 Il microprocessore Un MICROPROCESSORE è un circuito integrato dotato di una struttura circuitale in grado di attuare un prefissato SET di ISTRUZIONI 2 Caratteristiche del microprocessore
