- Messaggi: 105
- Ringraziamenti ricevuti 5
[2° PROGRAMMA ASSEMBLY] Lampeggio in modo alternato di 4 led con il PIC16F84A
11 Anni 11 Mesi fa - 11 Anni 11 Mesi fa #1
da mikysmcv
[2° PROGRAMMA ASSEMBLY] Lampeggio in modo alternato di 4 led con il PIC16F84A è stato creato da mikysmcv
Ragazzi questo è il primo programma che ho scritto da solo, prendendo spunto dal primo esempio scopiazzato sul libro che sto studiando, ho cercato di modificare quel programma, accendendo 4 led, 2 per volta, prima i 2 led collegati alle linee RB0-RB1, poi facevo spegnere questi ed accendevo i 2 led collegati alle linee RB6-RB7.
Eventuali critiche o commenti sono ben accettati in quanto sono un asinello che cerca di imparare
;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
;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 00000000B
;Muove il valore costante binario 00000000B 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
bsf PORTB,LED
;Mette ad 1 il bit zero(definito dalla costante LED) di PORTB(definito nel file P16F84A.INC), dove siccome la linea 0 della porta B è configurata come uscita, saranno inviati 5V al led collegato a tale linea, il quale si accenderà
;Inizio ciclo
MainLoop
;Questa linea contiene un label ovvero un riferimento simbolico ad un indirizzo di memoria, in questo caso il label viene utilizzato come punto di ingresso di un ciclo di accensione e spegnimento dei led
clrf PORTB
;Azzera il registro PORTB, dove questa operazione è necessaria nel ciclo per spegnere i led accesi
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
movlw 00000011B
;Muove il valore costante binario 00000011B nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro TRISB, accendendo così tutti i led collegati alle
linee di numero pari
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
clrf PORTB
;Azzera il registro PORTB, dove questa operazione è necessaria nel ciclo per spegnere i led accesi
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
movlw 11000000B
;Muove il valore costante binario 11000000B nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro TRISB, accendendo cosi tutti i led collegati alle
linee di numero dispari
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
goto MainLoop
;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 Hex ed asm:
Eventuali critiche o commenti sono ben accettati in quanto sono un asinello che cerca di imparare
;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
;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 00000000B
;Muove il valore costante binario 00000000B 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
bsf PORTB,LED
;Mette ad 1 il bit zero(definito dalla costante LED) di PORTB(definito nel file P16F84A.INC), dove siccome la linea 0 della porta B è configurata come uscita, saranno inviati 5V al led collegato a tale linea, il quale si accenderà
;Inizio ciclo
MainLoop
;Questa linea contiene un label ovvero un riferimento simbolico ad un indirizzo di memoria, in questo caso il label viene utilizzato come punto di ingresso di un ciclo di accensione e spegnimento dei led
clrf PORTB
;Azzera il registro PORTB, dove questa operazione è necessaria nel ciclo per spegnere i led accesi
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
movlw 00000011B
;Muove il valore costante binario 00000011B nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro TRISB, accendendo così tutti i led collegati alle
linee di numero pari
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
clrf PORTB
;Azzera il registro PORTB, dove questa operazione è necessaria nel ciclo per spegnere i led accesi
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
movlw 11000000B
;Muove il valore costante binario 11000000B nel registro W
movwf PORTB
;Copia il contenuto del registro W nel registro TRISB, accendendo cosi tutti i led collegati alle
linee di numero dispari
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
goto MainLoop
;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 Hex ed asm:
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 Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: [2° PROGRAMMA ASSEMBLY] Lampeggio in modo alternato di 8 led con il PIC16F84A
...con questo siamo a quota 2!
Come suggerito, se oltre al file hex metti anche il file asm sarai di aiuto e renderai la vita piu' facile agli altri.
...la tua rimmarra' dura come per tutti i pionieri..!
Saluti,
Mauro
Come suggerito, se oltre al file hex metti anche il file asm sarai di aiuto e renderai la vita piu' facile agli altri.
...la tua rimmarra' dura come per tutti i pionieri..!
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
11 Anni 11 Mesi fa #3
da mikysmcv
Aggiunto anche qui il file asm ed a breve altri 2 programmini, uno scopiazzato dal libro (però commentato passo passo da me) ed uno inventato da me.
PS: Sarà anche difficile questo linguaggio, però è divertente o meglio almeno queste cose iniziali mi stanno divertendo ( spero di non rimangiarmi queste parole a breve )
Risposta da mikysmcv al topic Re: [2° PROGRAMMA ASSEMBLY] Lampeggio in modo alternato di 8 led con il PIC16F84A
Mauro Laurenti ha scritto: ...con questo siamo a quota 2!
Come suggerito, se oltre al file hex metti anche il file asm sarai di aiuto e renderai la vita piu' facile agli altri.
...la tua rimmarra' dura come per tutti i pionieri..!
Saluti,
Mauro
Aggiunto anche qui il file asm ed a breve altri 2 programmini, uno scopiazzato dal libro (però commentato passo passo da me) ed uno inventato da me.
PS: Sarà anche difficile questo linguaggio, però è divertente o meglio almeno queste cose iniziali mi stanno divertendo ( spero di non rimangiarmi queste parole a breve )
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: [2° PROGRAMMA ASSEMBLY] Lampeggio in modo alternato di 8 led con il PIC16F84A
Quando l'esempio e' del libro, metti il riferimento allo stesso.
Per evitare problemi pero' accertati della licenza del software al fine di vedere che tu abbia i diritti di renderli "pubblici". In alcuni casi non e' lecito per ragioni di copyright. Quando sono scritti da te non ci sono problemi.
Saluti,
Mauro
Per evitare problemi pero' accertati della licenza del software al fine di vedere che tu abbia i diritti di renderli "pubblici". In alcuni casi non e' lecito per ragioni di copyright. Quando sono scritti da te non ci sono problemi.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
11 Anni 11 Mesi fa - 11 Anni 11 Mesi fa #5
da mikysmcv
Risposta da mikysmcv al topic Re: [2° PROGRAMMA ASSEMBLY] Lampeggio in modo alternato di 8 led con il PIC16F84A
Mauro su questo guidami tu non vorrei fare casini , il libro che ho acquistato e sto studiando è il seguente:
conoscere-ed-usare-picmicro
solo il primo programma è riportato sul testo, però non è riportato con tutti quei commenti ( quelle sono cose che ho scritto io ), il secondo programma l'ho inventato io, mi consigli di postare solo programmi da me inventati/modificati ?
Io riportavo anche quelli sul libro per un paragone tra l'esempio che c'era lì ed esempi che inventavo io, però se può creare qualche problema, metto solo i miei ok?
conoscere-ed-usare-picmicro
solo il primo programma è riportato sul testo, però non è riportato con tutti quei commenti ( quelle sono cose che ho scritto io ), il secondo programma l'ho inventato io, mi consigli di postare solo programmi da me inventati/modificati ?
Io riportavo anche quelli sul libro per un paragone tra l'esempio che c'era lì ed esempi che inventavo io, però se può creare qualche problema, metto solo i miei ok?
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ù
- 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.