La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

ASSEMBLY Seconda parte.

Presentazioni simili


Presentazione sul tema: "ASSEMBLY Seconda parte."— Transcript della presentazione:

1 ASSEMBLY Seconda parte

2 Encoder con pic 16f84 Nella puntata precedente, è stata presentato un piccolo programmino per far comparire il numero 7 su un display a 7 segmenti. In questo file, si riprende lo stesso programmino per creare però un Encoder. Il programma precedente verrà quindi ampliato Stavolta però, sarà necessario conoscere alcuni registri La prima parte del programma verrà scritta nella slide successiva e, si farà riferimento ai registri tramite i rispettivi indirizzi senza associare ad essi un nome

3 Prima parte del programma Encoder
LIST p=16f84 radix dec ; direttiva che indica che i dati sono in base dieci se non è specificata la ;base BSF x x05 ;pone 1 il V bit di status per selezionare bank1 MOVLW 0xff MOVWF 0x ;085h è il registro TRISA CLRW MOVWF 0x ;086h è il registro TRISB

4 Seconda parte del programma:illustrazione
Per poter creare un encoder, bisogna acquisire dei valori in formato binario dall’esterno per poter poi visualizzare su un display a 7 segmenti i rispettivi valori in base dieci. La port_a è stata dichiarata di input; una sequenza di livelli logici stabiliti da interruttori sui pin RA0…RA3 rappresentano un numero binario. Con un solo display a 7 segmenti a c.c., si possono visualizzare numeri da 0 a 9 e quindi, bastano quattro bit Es se RA0=0, RA1=1, RA2=0,RA3=0, il numero binario è 0010 che corrisponde a 2 base dieci Nella seconda parte del programma sarà necessario introdurre una subroutine e una tabella

5 Seconda parte del programma
bcf 0x03, 0x ;azzero il V bit per tornare al bank0 S1: MOVF 0X05,W ; S1 è una label che indica l’inizio di una subroutine ; la prima riga della subroutine indica che il valore ;acquisito in oo5h, PORTA, viene passato in W ANDLW 0X0F ;adesso, i dati acquisiti sono visti come dati binari e sono solo i bit più bassi ; vengono presi in considerazione CALL TABLE ; chiama una subroutine detta table MOVWF 0X ;aggiorna l’uscita PORTB GOTO S1 TABLE ADDWF 0X02,f esegue la somma tra il valore del program counter (indirizzo 002h) al valore in W ;in questo modo, non viene eseguita l’istruzione successiva ma quella del nuovo indirizzo in pc RETLW b’ ’ ;return with literal w RETLW b’ ’ RETLW b’ ’ RETLW b' ' RETLW b' ' RETLW b' ' RETLW b' ' RETLW b' ' RETLW b' ' RETLW b' ‘ END

6 Un piccolo schema circuitale
R=8x220  RBO . RB7 a Corrispondenza tra pin RB e segmenti del display RB1 a RB2 b RB3 c RB4 d RB5 e RB6 f RB7 g RB0 h b f RA0 . RA3 g e c d

7 I registri:introduzione
Per poter comprendere meglio il programma, bisogna conoscere i registri del pic in questione I registri del pic 16fxx si dividono in due banchi: bank0 e bank1 I registri speciali del bank0 vanno dall’indirizzo 00h 0Bh; i registri speciali del bank1 vanno dall’indirizzo 80h a 8Bh Per indirizzare i registri del bank0 c’è bisogno al massimo di 4 bit perché l’indirizzo più grande, 0Bh, corrisponde a (11)10=(1011)2 Per il bank1, gli indirizzi occupano massimo 8 bit perché il più grande, 8Bh=( )2=(139)10 Per poter utilizzare questi indirizzi in una riga di programmi, non dobbiamo sforare i 14 bit. Ciò dipende anche dall’opcode che dobbiamo utilizzare L’opcode, non sempre compare da solo in una linea programma ma, può essere scritto con un indirizzo dati, indirizzo registri o con un dato numerico. Il tutto non deve superare 14 bit di memoria per linea di programma Può capitare che in una linea programma l’opcode insieme all’indirizzo del registro supera la memoria di 14 bit; ciò può capitare solo se i registri fanno parte del bank1

8 I registri: bank0 e bank1 Bisogna immaginare i registri come se fossero scritti in una tabella di più righe e più colonne. Nel caso dei pic 16f628,pi16f84… i banchi sono 2, bank0 e bank1. Le colonne saranno allora solo 2, bank0 per la prima colonna e bank1 per la seconda colonna. Per risparmiare memoria nell’indirizzamento di un registro basta far riferimento solo alla riga, dopo aver specificato la colonna in questione Esistono due tipi di comandi per selezionare bank0 e bank1: BSF 0x03,5 e BCF 0x03,5 BSF= Bit Set f; questo comando pone a 1 un bit del registro in questione. Nel nostro caso pone a 1 il bit 5 del registro di indirizzo 3h, detto registro STATUS che fa parte del bank0. Il bit 5, detto RP0, è quello che indirizza il bank0 o il bank1. Se RP0=0, il bank selezionato è zero, se RP0=1, il bank selezionato è 1 BCF= Bit Clear f; ; questo comando pone a 0 un bit del registro in questione. Nel nostro caso pone a 0 il bit 5 del registro di indirizzo 3h selezionando il bank0 vf Bank0 Bank1 indirizzo registro 00h INDF 80h 01h TMR0 81h OPTION 02h PCL 82h 03h STATUS 83h 04h FSR 84h 05h PORTA 85h TRISA 06h PORTB 86h TRISB …….. …………… …. ………………….

9 Esempio:altro modo per indirizzare TRISA e TRISB
Un modo alternativo per scrivere la prima parte del programma precedente è il seguente: ORG 0X00 MOVLW 0XFF TRIS X ;l’istruzione TRIS fa parte di istruzioni speciali; a questo comando è associato sempre l’indirizzo di PORT A, PORT B.. ; con esso non vengono settati i livelli logici delle porte ma solo la direzione. Ciò vuol dire che quando si utilizza TRIS, si ;fa riferimento ai registri TRIS A e TRISB del bank1. In questo caso, il riferimento è a TRISA all’indirizzo 0x85 CRLW TRIS X ;il dato 0x00 nell’accumulatore viene trasferito al registro TRISB portando tutte i bit di B come OUTPUT MOVF 0x86,W ……………………………………………il resto del programma è uguale al precedente

10 Registro STATUS Si trova all’indirizzo 03h e, i bit che lo compongono sono dei veri e propi flag Bit 0 flag di Carry/Barrow. Segnala un riporto/ prestito nelle operazioni di somma e sottrazione su otto bit Bit 1 flag di Digit Carry/Barrow. Segnala un riporto/prestito sul nibble basso nelle operazioni di somma e sottrazioni. Bit 2 flag di zero : è 1 se il risultato dell’operazione logico/aritmetica precedente è zero altrimenti è 0 Bit 3 flag di Power Down, va a 1 durante la temporizzazione di power-up o nell’istruzione di azzeramento del Watch dog ,CLRWDT; durante l’istruzione di SLEEP, istruzione di attesa, viene riportato a zero Bit 4 flag di Time out, va a 1 durante il power Out o per CLRWDT. Il bit 4 con il bit 3 sono i bit di STATUS che non possono essere scritti ma solo letti Bit 5 e bit 6 sono quelli che selezionano i banchi. Se entrambi 0, siamo nel bank0, se RP0=1 e RP1=0, allora siamo nel bank1. Altre combinazioni di RP0 e RP1 sono utili solo in caso di pic con un numero di banchi superiori Bit 6 non è utilizzato nel caso di pic 16f84 e pic16f628. Serve per l’indirizzamento indiretto. Verrà approfondito più avanti Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 IRP RP1 RP0 TO PD Z DC C

11 Il registro PCL Nella seconda parte del programma compare il program counter all’indirizzo 002h. Questo registro si aggiorna ogni volta che viene eseguita una nuova operazione. In esso è scritto l’indirizzo dell’istruzione successiva da eseguire. È un registro a 13 bit di cui, gli 8 bit meno significativi, si trovano all’indirizzo 002h, i 5 più significativi in un altro indirizzo detto PCLATH all’indirizzo 0Ah Il program counter è utile nelle istruzioni di salto. Ogni volta che c’è un’istruzione di salto GOTO n o CALL, il PC assume il valore dell’indirizzo di istruzione di salto ponendo il valore dell’istruzione successiva nello stack. Terminata l’istruzione di salto (subroutine), il PC acquisisce dallo stack l’indirizzo dell’istruzione dove si era interrotto per ritornare all’esecuzione normale del programma In corrispondenza dell’istruzione ADDWF 0X02,f il PC ha valore 0X0A che è l’indirizzo dell’istruzione successiva. Ma, in seguito all’istruzione di riga, il PC assume il valore del risultato della somma tra il contenuto di w e quello di PC. Questo nuovo risultato è l’indirizzo del contenuto della tabella Eseguita l’istruzione, il programma ritorna all’istruzione dove si era interrotto

12 Esecuzione del programma passo passo
Indiririzzo istruzione PC istruzione Registro Stato bit nel registro 000 0x01 MOVLW 0xff W 1 001 0x02 MOVWF 0x85 TRISA 002 0x03 CLRW 003 0x04 MOVWF 0x86 TRISB 004 0x05 MOVF 0X05,W 005 0x06 ANDLW 0X0F 006 0x07 CALL TABLE 009 0x0A ADDWF 0X02 ,1 pcl 00d RETLW w 007 0x08 PORTB 008 GOTO S1 Abbiamo supposto che l’ingresso su port a sia 11 binario. 00D=00A+003 00A è il contenuto del program counter, 003 è l’ingresso in formato decimale che viene inserito su RA in formato binario. Il programma non esegue l’istruzione in 00A ma quella in 00D

13 Retlw Nella slide precedente, si è visto che l’istruzione ADDWF 0X02, 1 somma il contenuto di W con quello del PC, di indirizzo 0x02 e, pone il risultato nel PC In questo modo, il program counter ha l’indirizzo nuovo che corrisponde a 0x0d dove c’è l’istruzione RETLW Retlw scarica dallo stack l' indirizzo di ritorno salvato dalla call e rientra ponendo in W il suo contenuto Questo contenuto viene trasferito in PORTB che setta i livelli logici delle uscite RB per far accendere determinati segmenti del display a sette segmenti a c.c. In questo caso, il numero 3

14 In conclusione Per questo programma è stato necessario conoscere i seguenti registri: W PC bank0 0x02 PORTA bank0 0x05 PORTB bank0 0x06 TRISA bank x85 TRISB bank x86 STATUS bank0 0x03

15 end


Scaricare ppt "ASSEMBLY Seconda parte."

Presentazioni simili


Annunci Google