1 / 15

ASSEMBLY

ASSEMBLY. Seconda parte. Encoder con pic 16f84 . Nella puntata precedente, è stata presentato un piccolo programmino per far comparire il numero 7 su un display a 7 segmenti.

bedros
Download Presentation

ASSEMBLY

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 radixdec ; direttiva che indica che i dati sono in base dieci se non è specificata la ;base MOVLW 0xff MOVWF 0x85 ;085h è il registro TRISA CLRW MOVWF 0x86 ;086h è il registro TRISB

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

  5. Seconda parte del programma S1: MOVF 0X05,W ; S1 è una label che indica l’inizio di una subroutine ; la prima riga della subroutine indica che il valore ;acquisito in oo5h, PORTA, viene passato in W ANDLW 0X0F ;adesso, i dati acquisiti sono visti come dati binari e sono solo i bit più bassi ; vengono presi in considerazione CALL TABLE ; chiama una subroutine detta table MOVWF 0X06 ;aggiorna l’uscita PORTB GOTO S1 TABLE ADDWF 0X02,f esegue la somma tra il valore del programcounter (indirizzo 002h) al valore in W ;in questo modo, non viene eseguita l’istruzione successiva ma quella del nuovo indirizzo in pc RETLW b’01111111’ ;returnwithliteral w RETLW b’00001010’ RETLW b’01111111’ RETLW b'10011111' RETLW b'11001101' RETLW b'11011011' RETLW b'11111011' RETLW b'00001111' RETLW b'11111111' RETLW b'11001111‘ END

  6. Un piccolo schema circuitale R=8x220  RBO . . . . . . . . . RB7 a 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=(10001011)2=(139)10 • Per poter utilizzare questi indirizzi in una riga di programmi, non dobbiamo sforare i 14 bit. Ciò dipende anche dall’opcode che dobbiamo utilizzare • L’opcode, non sempre compare da solo in una linea programma ma, può essere scritto con un indirizzo dati, indirizzo registri o con un dato numerico. Il tutto non deve superare 14 bit di memoria per linea di programma • Può capitare che in una linea programma l’opcode insieme all’indirizzo del registro supera la memoria di 14 bit; ciò può capitare solo se i registri fanno parte del bank1 • Nell’esempio precedente, abbiamo utilizzato gli indirizzi del bank1,085h e 086h senza problemi. L’indirizzamento di questi registri poteva essere fatto in un altro modo che verrà spiegato nella slide successiva

  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 eBCF 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

  9. Esempio:altri due modi per indirizzare TRISA e TRISB • Un modo alternativo per scrivere la prima parte del programma precedente è il seguente: LIST p=16f84 org 0x00 BSF 3,5 ;pone a 1 il bit 5 del registro status selezionando così bank1. ciò vuol dire che da questo momento, tutti gli indirizzi di riga si ;riferiscono al bank1 MOVLW 0xFF ; inserisce ffh ne registro accumulatore MOVWF 0X05 ; trasferisce i dati dall’accumulatore al registro di riga 005 del bank1, cioè quello di indirizzo 85h del bank1 CLRW ;azzera l’accumulatore MOVWF 0X06 ;trasferisce i dati dall’accumulatore al registro di riga 006 del bank1, cioè di indirizzo 086h del bank1 BCF 3,5 ;pone a 0 il bit 5 del registro status selezionando così bank0. ciò vuol dire che tutti gli indirizzi di riga si riferiscono al bank0 MOVF 0X05,W ;trasferisce i dati dall’indirizzo 005 del bank0 all’accumulatore …………………………………..il resto del programma è uguale al precedente • Il programma può essere scritto ancora in un altro modo: ORG 0X00 MOVLW 0XFF TRIS 0X05 ;l’istruzione TRIS fa parte di istruzioni speciali; a questo comando è associato sempre l’indirizzo di PORT A, PORT B.. ; con esso non vengono settati i livelli logici delle porte ma solo la direzione. Ciò vuol dire che quando si utilizza TRIS, si ;fa riferimento ai registri TRIS A e TRISB del bank1. In questo caso, il riferimento è a TRISA all’indirizzo 0x85 CRLW TRIS 0X06 ;il dato 0x00 nell’accumulatore viene trasferito al registro TRISB portando tutte i bit di B come OUTPUT MOVF 0x86,W ……………………………………………il resto del programma è uguale al precedente

  10. Registro STATUS • Si trova all’indirizzo 03h e, i bit che lo compongono sono dei veri e propiflag • Bit 0 flag di Carry/Barrow. Segnala un riporto/ prestito nelle operazioni di somma e sottrazione su otto bit • Bit 1 flag di DigitCarry/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

  11. Il registro PCL • Nella seconda parte del programma compare il programcounter 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 programcounter è 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 Abbiamo supposto che l’ingresso su port a sia 11 binario. 00D=00A+003 00A è il contenuto del programcounter, 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 programcounter ha l’indirizzo nuovo che corrisponde a 0x0d dove c’è l’istruzione RETLW 10011111 • Retlw scarica dallo stack l' indirizzo di ritorno salvato dalla call e rientra ponendo in W il suo contenuto • Questo contenuto viene trasferito in PORTB che setta i livelli logici delle uscite RB per far accendere determinati segmenti del display a sette segmenti a c.c. In questo caso, il numero 3

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

  15. end

More Related