- Messaggi: 105
- Ringraziamenti ricevuti 5
[1° PROGRAMMA ASSEMBLY] Far lampeggiare un led con il PIC16F84A
11 Anni 11 Mesi fa - 11 Anni 11 Mesi fa #1
da mikysmcv
[1° PROGRAMMA ASSEMBLY] Far lampeggiare un led con il PIC16F84A è stato creato da mikysmcv
Ciao a tutti, siccome sto cercando di imparare l'assembly e quindi mi sto divertendo ad inventare semplici programmini, vi riporto le cose cose che combino, nella speranza che qualcuno mi dia qualche diritta su eventuali errori che commetto o su cose che ho fatto che si sarebbero potute fare in modo diverso/migliore, inizio con un esempio preso dal libro che sto studiando, quindi questo primo programma è solo un copia ed incolla, ma ho ampiamente commentato tutte le istruzioni, quindi se ho scritto qualche cavolata fatemelo notare .
PS: Il libro da cui ho preso l'esempio è il seguente:
conoscere-ed-usare-picmicro
;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 programmatorein fase di programmazione del micro, in particolare imposta l'oscillatore in modalità XT disabilità la protezione del codice e disabilita il watchdog timer
LED EQU 0
;Consente di definire delle costanti, in questo caso da adesso in poi la parola/label LED sarà equivalente al valore 0
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 11111110B
;Muove il valore costante binario 11111110B 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 del led
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
btfsc PORTB,LED
;Controlla il bit zero(definito dalla costante LED) all'interno del registro PORTB e salta l'istruzione successiva se questo vale 0,questo per controllare se il led è acceso o spento e quindi agire di conseguenza, infatti se il led è acceso verrà spento(saltando alla label SetToZero grazie all'istruzione goto), se il led è spento verrà acceso saltando l'istruzione goto
goto SetToZero
;Questa istruzione determina un salto del programma alla label SetToZero dove si troveranno le istruzioni per spegnere il led,dove questa istruzione grazie alla precedente verrà saltata se il led è gia spento
bsf PORTB,LED
;Mette ad 1 il bit zero(definito dalla costante LED) di PORTB,accendendo quindi il led
goto MainLoop
;Salta alla label MainLoop
SetToZero
;Label SetToZero
bcf PORTB,LED
;Mette a 0 il bit zero(definito dalla costante LED) di PORTB,spegnendo quindi il led
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
A breve un programma simile però modificato da me
PS: Il libro da cui ho preso l'esempio è il seguente:
conoscere-ed-usare-picmicro
;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 programmatorein fase di programmazione del micro, in particolare imposta l'oscillatore in modalità XT disabilità la protezione del codice e disabilita il watchdog timer
LED EQU 0
;Consente di definire delle costanti, in questo caso da adesso in poi la parola/label LED sarà equivalente al valore 0
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 11111110B
;Muove il valore costante binario 11111110B 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 del led
call Delay
;Determina una chiamata ad una subroutine che inizia in corrispondenza della label Delay
btfsc PORTB,LED
;Controlla il bit zero(definito dalla costante LED) all'interno del registro PORTB e salta l'istruzione successiva se questo vale 0,questo per controllare se il led è acceso o spento e quindi agire di conseguenza, infatti se il led è acceso verrà spento(saltando alla label SetToZero grazie all'istruzione goto), se il led è spento verrà acceso saltando l'istruzione goto
goto SetToZero
;Questa istruzione determina un salto del programma alla label SetToZero dove si troveranno le istruzioni per spegnere il led,dove questa istruzione grazie alla precedente verrà saltata se il led è gia spento
bsf PORTB,LED
;Mette ad 1 il bit zero(definito dalla costante LED) di PORTB,accendendo quindi il led
goto MainLoop
;Salta alla label MainLoop
SetToZero
;Label SetToZero
bcf PORTB,LED
;Mette a 0 il bit zero(definito dalla costante LED) di PORTB,spegnendo quindi il led
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
A breve un programma simile però modificato da me
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 - 11 Anni 11 Mesi fa #2
da mikysmcv
Risposta da mikysmcv al topic Re: [1° PROGRAMMA ASSEMBLY] Far lampeggiare un led con il PIC16F84A
PS: Ho modificato un pò i colori per distinguere i commenti dal codice, altrimenti non si capiva niente, spero che così si capisca qualcosa e posto anche i 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ù
- Messaggi: 105
- Ringraziamenti ricevuti 5
11 Anni 11 Mesi fa - 11 Anni 11 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: [1° PROGRAMMA ASSEMBLY] Far lampeggiare un led con il PIC16F84A
...ottimo,
i colori aiutano.
Avevo provato a salvare il codice dentro la finestra dedicata al codice, ma non riconosce l'assembly per cui non portava vantaggi.
Per aiutare potresti anche includere il file asm.
Saluti,
Mauro
i colori aiutano.
Avevo provato a salvare il codice dentro la finestra dedicata al codice, ma non riconosce l'assembly per cui non portava vantaggi.
Per aiutare potresti anche includere il file asm.
Saluti,
Mauro
Ultima Modifica 11 Anni 11 Mesi fa da Mauro Laurenti.
Si prega Accedi o Crea un account a partecipare alla conversazione.
11 Anni 11 Mesi fa #4
da mikysmcv
Ok li aggiungo subito
Risposta da mikysmcv al topic Re: [1° PROGRAMMA ASSEMBLY] Far lampeggiare un led con il PIC16F84A
Mauro Laurenti ha scritto:
Per aiutare potresti anche includere il file asm.
Ok li aggiungo subito
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 - 11 Anni 11 Mesi fa #5
da mikysmcv
Risposta da mikysmcv al topic Re: [1° PROGRAMMA ASSEMBLY] Far lampeggiare un led con il PIC16F84A
Ragazzi vi riporto il video di questo super fantascientifico primo esperimento... mi raccomando non ridete troppo per la breadboard
PS: Come si regolano le dimensioni dei video?
PS: Come si regolano le dimensioni dei video?
Ultima Modifica 11 Anni 11 Mesi fa da Mauro Laurenti.
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.