- Messaggi: 105
- Ringraziamenti ricevuti 5
[3° PROGRAMMA ASSEMBLY] Sequenza Andata-Ritorno di 5 led con il PIC16F84A
11 Anni 11 Mesi fa - 11 Anni 11 Mesi fa #1
da mikysmcv
[3° PROGRAMMA ASSEMBLY] Sequenza Andata-Ritorno di 5 led con il PIC16F84A è stato creato da mikysmcv
Ragazzi posto il mio terzo programma in assembly, questa volta i led sono 5 e vengono accesi in sequenza per poi ritornare indietro, la complessità è un pò più elevata degli altri infatti ci ho perso qualche oretta , posto video,codice e file asm - HEX .
Come sempre critiche e suggerimenti sul codice sono ben accettati.
;Accensione di 5 led in seguenza, prima andata e poi ritorno
;Direttive
PROCESSOR 16F84A
;Definisce per quale microcontrollore è stato scritto il codice sorgente
RADIX DEC
;Informa il compilatore che i numeri riportati senza notazione, in questo caso (DEC) sono da intendersi decimali
ERRORLEVEL -302
;Esclude la segnalazione di alcuni errori di compilazione, in questo caso (-302) ricordare di commutare il banco di memoria qualora si utilizzino registri che non stanno nel banco 0
INCLUDE "P16F84A.INC"
;Informa il compilatore di includere nel sorgente un secondo file denominato P16F84A.INC
__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF
;Imposta i flag di configurazione che verranno utilizzati dal programmatore in fase di programmazione del micro, in particolare imposta l'oscillatore in modalità XT disabilità la protezione del codice e disabilita il watchdog timer
ORG 0CH
;Consente di definire un indirizzo a partire dal quale il compilatore inizia ad allocare dati
o istruzioni, in questo caso viene definita un'area dati all'interno del PICmicro ovvero un'area
in cui memorizzare variabili/contatori durante l'esecuzione del programma
Count RES 2
;Permette di riservare un certo numero di locazioni di memoria (in questo caso 2)a partire dalla locazione corrente etichettata dalla label Count, dove ciò ci servirà per la Subroutine che inserisce un ritardo per l'accensione e lo spegnimento del led
Shift RES 1
;Permette di riservare un certo numero di locazioni di memoria (in questo caso 1)a partire dalla
locazione corrente etichettata dalla label Shift, dove ciò ci servirà per determinare la sequenza di accensione dei led
;Reset Vector-Punto d'inizio del programma al reset della CPU
ORG 00H
;Questa seconda direttiva ORG fà riferimento ad un indirizzo in area programma(FLASH) anzichè in area dati e da questo punto in poi andranno inserite le istruzioni
;Istruzioni
bsf STATUS,RP0
;Mette ad 1 il quinto bit(grazie ad RP0 definito nel file P16F84A.INC) del file register STATUS(anche esso definito nel file P16F84A.INC), questo per permettere l'acceso al banco di memoria dati 1 a cui appartengono i registri TRISA e TRISB
movlw 00011111B
;Muove il valore costante binario 00011111B nell'accumulatore/registro W
movwf TRISA
;Copia il contenuto del registro W nel registro TRISA, questo per definire il funzionamento di linea di I/O della porta A, in particolare ogni bit ad 1 del registro TRISA determina un ingresso sulla rispettiva linea della porta A, mentre ogni 0 determina una uscita
movlw 11100000B
;Muove il valore costante binario 11100000B nel registro W
movwf TRISB
;Copia il contenuto del registro W nel registro TRISB
bcf STATUS,RP0
;Mette a 0 il quinto bit del file register STATUS questo per permettere l'acceso al banco di memoria dati 0 a cui appartengono i registri PORTA e PORTB
clrf Shift
;Azzera la locuzione di ram riservata in precedenza
MainLoop1
;Questa linea contiene un label ovvero un riferimento simbolico ad un indirizzo di memoria
movlw 00000001B
;Muove il valore costante binario 00000001B nel registro W
movwf Shift
;Copia il contenuto del registro W nel registro Shift, quindi in questo caso viene inizializzato il registro Shift
Andata
;Label Andata
movf Shift,W
;Copia il contenuto del registro Shift nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro PORTB, ottenendo l'accensione del primo led
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
bcf STATUS,C
;Azzera il bit CARRY del registro di stato STATUS
rlf Shift,F
;Sposta di un bit verso sinistra il valore memorizzato nel registro Shift inserendo nella posizione
occupata dal bit 0 il valore del bit di Carry (precedentemente azzerato),a questo punto il registro Shift varrà 00000010, quindi, al ciclo successivo, una volta trasferito tale valore sulla porta B si otterrà lo spegnimento del led1 e l'accensione del led2 e cosi via per i cicli successivi
btfsc Shift,5
;Controlla se il bit 5 del registro Shift vale 1 ed in caso positivo viene eseguita l'istruzione
successiva, altrimenti questa viene saltata, questo perchè quando il bit 5 di Shift varrà 1, significa che tutti i cinque led sono stati accesi almeno una volta ed occorre riaccenderli in senso contrario
goto MainLoop2
;salta alla label MainLoop2
goto Andata
;Salta alla label Andata
MainLoop2
;Label MainLoop2
movlw 00001000B
;Muove il valore costante binario 00001000B nel registro W
movwf Shift
;Copia il contenuto del registro W nel registro Shift, quindi in questo caso viene inizializzato nuovamente il registro Shift
Ritorno
;Label Ritorno
movf Shift,W
;Copia il contenuto del registro Shift nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro PORTB, ottenendo l'accensione del quarto led
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
bcf STATUS,C
;Azzera il bit CARRY del registro di stato STATUS
rrf Shift,F
;Sposta di un bit verso destra il valore memorizzato nel registro Shift inserendo nella posizione occupata dal bit 7 il valore del bit di Carry (precedentemente azzerato),a questo punto il registro Shift varrà 00000100, quindi, al ciclo successivo, una volta trasferito tale valore sulla porta B si otterrà lo spegnimento del led4 e l'accensione del led3 e cosi via per i cicli successivi
btfsc Shift,0
;Controlla se il bit 0 del registro Shift vale 1 ed in caso positivo viene eseguita l'istruzione successiva, altrimenti questa viene saltata, questo perchè quando il bit 0 di Shift varrà 1, significa che tutti i cinque led sono stati accesi almeno una volta ed occore riaccenderli in senso contrario
goto MainLoop1
;Salta alla label MainLoop1
goto Ritorno
;Salta alla label MainLoop
;Subroutines che inserisce un ritardo di circa 1 secondo, eseguendo migliaia di istruzioni che decrementano un contatore interno
Delay
;Label Delay
clrf Count
;Azzera la locuzione di ram riservata in precedenza
clrf Count+1
;Azzera la locuzione successiva alla precedente
DelayLoop
;Label DelayLoop
decfsz Count,1
;Decrementa il valore del registro Count e se il risultato vale zero salta l'istruzione successiva, ed in base al secondo valore il risultato è memorizzato nell'accumulatore W (se il valore è zero) o nello stesso registro Count (se il valore vale 1), quindi nel nostro caso il valore è memorizzato nel registro Count
goto DelayLoop
;Salta alla label DelayLoop
decfsz Count+1,1
;Decrementa il valore del registro Count+1 e se il valore vale zero salta l'istruzione successiva,memorizza il valore nel registro Count
goto DelayLoop
;Salta alla lebel DelayLoop
return
;Istruzione da inserire al termine di ogni subroutine per riprendere l'esecuzione dal programma principale
END
;Direttiva che indica al compilatore la fine del sorgente assembler
File .asm ed .HEX
Come sempre critiche e suggerimenti sul codice sono ben accettati.
;Accensione di 5 led in seguenza, prima andata e poi ritorno
;Direttive
PROCESSOR 16F84A
;Definisce per quale microcontrollore è stato scritto il codice sorgente
RADIX DEC
;Informa il compilatore che i numeri riportati senza notazione, in questo caso (DEC) sono da intendersi decimali
ERRORLEVEL -302
;Esclude la segnalazione di alcuni errori di compilazione, in questo caso (-302) ricordare di commutare il banco di memoria qualora si utilizzino registri che non stanno nel banco 0
INCLUDE "P16F84A.INC"
;Informa il compilatore di includere nel sorgente un secondo file denominato P16F84A.INC
__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF
;Imposta i flag di configurazione che verranno utilizzati dal programmatore in fase di programmazione del micro, in particolare imposta l'oscillatore in modalità XT disabilità la protezione del codice e disabilita il watchdog timer
ORG 0CH
;Consente di definire un indirizzo a partire dal quale il compilatore inizia ad allocare dati
o istruzioni, in questo caso viene definita un'area dati all'interno del PICmicro ovvero un'area
in cui memorizzare variabili/contatori durante l'esecuzione del programma
Count RES 2
;Permette di riservare un certo numero di locazioni di memoria (in questo caso 2)a partire dalla locazione corrente etichettata dalla label Count, dove ciò ci servirà per la Subroutine che inserisce un ritardo per l'accensione e lo spegnimento del led
Shift RES 1
;Permette di riservare un certo numero di locazioni di memoria (in questo caso 1)a partire dalla
locazione corrente etichettata dalla label Shift, dove ciò ci servirà per determinare la sequenza di accensione dei led
;Reset Vector-Punto d'inizio del programma al reset della CPU
ORG 00H
;Questa seconda direttiva ORG fà riferimento ad un indirizzo in area programma(FLASH) anzichè in area dati e da questo punto in poi andranno inserite le istruzioni
;Istruzioni
bsf STATUS,RP0
;Mette ad 1 il quinto bit(grazie ad RP0 definito nel file P16F84A.INC) del file register STATUS(anche esso definito nel file P16F84A.INC), questo per permettere l'acceso al banco di memoria dati 1 a cui appartengono i registri TRISA e TRISB
movlw 00011111B
;Muove il valore costante binario 00011111B nell'accumulatore/registro W
movwf TRISA
;Copia il contenuto del registro W nel registro TRISA, questo per definire il funzionamento di linea di I/O della porta A, in particolare ogni bit ad 1 del registro TRISA determina un ingresso sulla rispettiva linea della porta A, mentre ogni 0 determina una uscita
movlw 11100000B
;Muove il valore costante binario 11100000B nel registro W
movwf TRISB
;Copia il contenuto del registro W nel registro TRISB
bcf STATUS,RP0
;Mette a 0 il quinto bit del file register STATUS questo per permettere l'acceso al banco di memoria dati 0 a cui appartengono i registri PORTA e PORTB
clrf Shift
;Azzera la locuzione di ram riservata in precedenza
MainLoop1
;Questa linea contiene un label ovvero un riferimento simbolico ad un indirizzo di memoria
movlw 00000001B
;Muove il valore costante binario 00000001B nel registro W
movwf Shift
;Copia il contenuto del registro W nel registro Shift, quindi in questo caso viene inizializzato il registro Shift
Andata
;Label Andata
movf Shift,W
;Copia il contenuto del registro Shift nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro PORTB, ottenendo l'accensione del primo led
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
bcf STATUS,C
;Azzera il bit CARRY del registro di stato STATUS
rlf Shift,F
;Sposta di un bit verso sinistra il valore memorizzato nel registro Shift inserendo nella posizione
occupata dal bit 0 il valore del bit di Carry (precedentemente azzerato),a questo punto il registro Shift varrà 00000010, quindi, al ciclo successivo, una volta trasferito tale valore sulla porta B si otterrà lo spegnimento del led1 e l'accensione del led2 e cosi via per i cicli successivi
btfsc Shift,5
;Controlla se il bit 5 del registro Shift vale 1 ed in caso positivo viene eseguita l'istruzione
successiva, altrimenti questa viene saltata, questo perchè quando il bit 5 di Shift varrà 1, significa che tutti i cinque led sono stati accesi almeno una volta ed occorre riaccenderli in senso contrario
goto MainLoop2
;salta alla label MainLoop2
goto Andata
;Salta alla label Andata
MainLoop2
;Label MainLoop2
movlw 00001000B
;Muove il valore costante binario 00001000B nel registro W
movwf Shift
;Copia il contenuto del registro W nel registro Shift, quindi in questo caso viene inizializzato nuovamente il registro Shift
Ritorno
;Label Ritorno
movf Shift,W
;Copia il contenuto del registro Shift nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro PORTB, ottenendo l'accensione del quarto led
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
bcf STATUS,C
;Azzera il bit CARRY del registro di stato STATUS
rrf Shift,F
;Sposta di un bit verso destra il valore memorizzato nel registro Shift inserendo nella posizione occupata dal bit 7 il valore del bit di Carry (precedentemente azzerato),a questo punto il registro Shift varrà 00000100, quindi, al ciclo successivo, una volta trasferito tale valore sulla porta B si otterrà lo spegnimento del led4 e l'accensione del led3 e cosi via per i cicli successivi
btfsc Shift,0
;Controlla se il bit 0 del registro Shift vale 1 ed in caso positivo viene eseguita l'istruzione successiva, altrimenti questa viene saltata, questo perchè quando il bit 0 di Shift varrà 1, significa che tutti i cinque led sono stati accesi almeno una volta ed occore riaccenderli in senso contrario
goto MainLoop1
;Salta alla label MainLoop1
goto Ritorno
;Salta alla label MainLoop
;Subroutines che inserisce un ritardo di circa 1 secondo, eseguendo migliaia di istruzioni che decrementano un contatore interno
Delay
;Label Delay
clrf Count
;Azzera la locuzione di ram riservata in precedenza
clrf Count+1
;Azzera la locuzione successiva alla precedente
DelayLoop
;Label DelayLoop
decfsz Count,1
;Decrementa il valore del registro Count e se il risultato vale zero salta l'istruzione successiva, ed in base al secondo valore il risultato è memorizzato nell'accumulatore W (se il valore è zero) o nello stesso registro Count (se il valore vale 1), quindi nel nostro caso il valore è memorizzato nel registro Count
goto DelayLoop
;Salta alla label DelayLoop
decfsz Count+1,1
;Decrementa il valore del registro Count+1 e se il valore vale zero salta l'istruzione successiva,memorizza il valore nel registro Count
goto DelayLoop
;Salta alla lebel DelayLoop
return
;Istruzione da inserire al termine di ogni subroutine per riprendere l'esecuzione dal programma principale
END
;Direttiva che indica al compilatore la fine del sorgente assembler
File .asm ed .HEX
Ultima Modifica 11 Anni 11 Mesi fa da mikysmcv.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mikysmcv
- Autore della discussione
- Premium Member
Riduci
Di più
11 Anni 11 Mesi fa #2
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Re: [3° PROGRAMMA ASSEMBLY] Sequenza Andata-Ritorno di 5 led con il PIC16F84A
se ad esempio accendi led 1 e 2, poi spegni led 1 e accendi led 3, poi spegni led 2 e accendi led 4...hai un effetto scia..più alla kit..
Ste
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
11 Anni 11 Mesi fa #3
da mikysmcv
Ok allora oggi ci proverò
Risposta da mikysmcv al topic Re: [3° PROGRAMMA ASSEMBLY] Sequenza Andata-Ritorno di 5 led con il PIC16F84A
StefA ha scritto: se ad esempio accendi led 1 e 2, poi spegni led 1 e accendi led 3, poi spegni led 2 e accendi led 4...hai un effetto scia..più alla kit..
Ok allora oggi ci proverò
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mikysmcv
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 105
- Ringraziamenti ricevuti 5
11 Anni 11 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: [3° PROGRAMMA ASSEMBLY] Sequenza Andata-Ritorno di 5 led con il PIC16F84A
...cominciano ad essere esigenti!
Saluti,
Mauro
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
11 Anni 11 Mesi fa #5
da mikysmcv
Risposta da mikysmcv al topic Re: [3° PROGRAMMA ASSEMBLY] Sequenza Andata-Ritorno di 5 led con il PIC16F84A
StefA ho modificato il programma, era questo ciò che intendevi?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mikysmcv
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 105
- Ringraziamenti ricevuti 5
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.