Implementazione
firmware
L’implementazione del chip
oscillatore passa solo attraverso il firmware con cui programmare il
micro. Analizziamo le diverse parti che compongono il firmware e la
loro funzione :
;*****************************************************************
;
; Filename: pic_555.asm
; Date: 21/06/2016
; File Version: 1.0
;
;*****************************************************************
;
; File required: p10F322.inc *
;*****************************************************************
;
; Firmware for emulazione del NE555 mediante pic 10f322 *
;
;*****************************************************************
;*****************************************************************
; Configurazione e definizione del micro utilizzato:
; si utilizza l'oscillatore interno, no watchdog e pin MCLR usato come
pin
; Nessuna potezione della memoria in scrittura,nessuna funzione di
Brown out
#include p10f322.inc
__CONFIG _CP_OFF & _FOSC_INTOSC & _WDTE_OFF
& _MCLRE_OFF & _LVP_OFF & _BOREN_OFF
ERRORLEVEL -306
;*************************************************************************
;***** definizione delle varibili usate e locate a partire
dall'indirizzo 60h mediante la funzione cblock
CBLOCK 0x60 ; nessuna variabili usata in
questo codice!!
ENDC
;*************************************************************************
;***** Definizione e funzione dei pin
#define CAP PORTA,1 ; INPUT NODO CAPACITIVO
#define DSCH PORTA,2 ; OUTPUT DISCHARGE
#define OUT PORTA,0 ; OUTPUT USCITA FREQUENZA
#define RST PORTA,3 ; INPUT RESET
;***** Definizione delle costanti
_LTH EQU .255-.85 ; soglia comparazione a 1/3
VDD in valore espresso come complementare a 255
_HTH EQU .255-.170 ; soglia di comparazione a
2/3 VDD in valore espresso come complementare a 255
;*************************************************************************
;***** INIZIO CODICE
ORG 0x000
; locazione origine del codice
GOTO MAIN ; salta la zona di interrupt e vai
alla routine di configurazione
;*************************************************************************
; locazione origine per interrupt
ORG 0X04
RETFIE
;*************************************************************************
;****** programma principale
ORG 0x00A
MAIN
CALL REGISTERS ; chiama la routine di
settaggio dei registri di configurazione
BCF OUT ; metti l'uscita a zero
;*************************************************************************
;****** Loop principale di funzionamento: comprende la funzione di
reset e due sotto loop di carica e scarica
LOOP_MAIN
; loop funzione di RESET; valuta l'ingresso RST. Se RST=0 pone
OUT a continua il loopesce se RST=1
_RESET
BTFSC RST ; E' BASSO?
GOTO OUT_RST ; FALSE E' ALTO continua con il
loop successivo
BCF OUT ; TRUE E' BASSO METTI A ZERO L'USCITA
BCF TRISA,2 ; rendo il pin DSCH come uscita:
BCF DSCH ; Pongo a zero DSCH per scaricare il
nodo CAP
GOTO _RESET ; continua lo stato di reset
OUT_RST
BSF TRISA,2 ; rendo il pin DSCH come input:
BSF OUT ; poni l'uscita a 1 perche parte da una
carica
; loop gestione fase di carica: converte il nodo CAP e lo
confronta con il valore di soglia HTH
; esce dal loop solo se CAP e' maggiore di HTH.Il loop continua fino a
che CAP e' minore di HTH
LP_HTH
; Converte la tensione presente sul nodo CAP;
; Il risultato della converione e' memorizzato nella variabile ADRES
BSF ADCON,1 ; START THE CONVERSION
BTFSC ADCON,1 ; IS GO/DONE RESET
GOTO $-1 ; FALSE THEN WAIT
; Comparatore digitale; confronta la soglia HTH ( 2/3 VDD) con
il valore del nodo CAP= ADRES
; la comparazione avviene sommando il valore di ADRES con HTH
; se la somma va in overfloow vuol dire che ADRES = CAP e' maggiore di
HTH
; in tal caso il bit C del registro di stato va a 1 e si esce dal loop
altrimenti continua il loop
; fino a che C=1
MOVLW _HTH ; W=_HTH
ADDWF ADRES,0 ; somma ADRES e W
BTFSS STATUS,C ; ADRES > _HTH ?
GOTO LP_HTH ; FALSE C=0 continuo il loop
BCF OUT ; TRUE C=1 esco dal loop e metto
l'uscita a 0
; inizia la fase di scarica forzando a zero DSCH
_DISCHARGE
BCF TRISA,2 ; rendo il pin DSCH come
uscita:
BCF DSCH ; Pongo a zero DSCH per scaricare il
nodo CAP : inizia la fase di scarica
; loop gestione fase di scarica:
; converte il nodo CAP e lo confronta con il valore di soglia HTL
; esce dal loop solo se CAP e' minore di HTL: il loop continua fino a
che CAP e' maggiore di HTH
LP_LTH
; Converte la tensione presente sul nodo CAP;
; Il risultato della converiosne e' memorizzato nella variabile ADRES
BSF ADCON,1 ; START THE CONVERSION
BTFSC ADCON,1 ; IS GO/DONE RESET
GOTO $-1 ; FALSE THEN WAIT
; Comparatore digitale; confronta la soglia HTL ( 1/3 VDD) con
il valore del nodo CAP
; la comparazione avviene sommando il valore di ADRES con HTL
; se la somma va in overfloow vuol dire che ADRES = CAP e' maggiore di
HTL
; in tal caso il bit C del registro di stato va a 1 e si continua nel
loop altrimenti si esce dal loop
; fino a che C=0
MOVLW _LTH ; W=_HTL
ADDWF ADRES,0 ; somma ADRES e W
BTFSS STATUS,C ; ADRES > LTS ?
GOTO $+2 ; FALSE C=0 esco dal loop
GOTO LP_LTH ; TRUE C=1 continuo il loop
BSF OUT ; metto l'uscita alta
; inizia la fase di carica liberando il nodo DSCH
_CHARGE
BSF TRISA,2 ; rendo il pin DSCH come ingresso
; continua il loop principale di funziomanto
GOTO LOOP_MAIN ;
;*************************************************************************
; ROUTINES DI CONFIGURAZIONE
;*************************************************************************
; configura i resgistri delle periferiche coinvolte:
; TUTTE LE ALTRE PERIFERICHE SONO DISABILITATE DI DEFAULT
; oscillatore di sistema
; ADC
; porta A
REGISTERS
;*******************************
; configura il pull up per l'ingressi:
_OPT_REG
BCF OPTION_REG,NOT_WPUEN ; Weak pull-ups
are enabled also by individual PORT WPUA register
;*******************************
; configura l'oscillatore interno di sistema a 16 MHz senza buttarlo
fuori
_OSC
BCF CLKRCON,CLKROE ; no Reference Clock output
MOVLW 0X70 ; 0X70 = 16 MHz
MOVWF OSCCON
;*******************************
; configura la porta A settando
; bit0= output
; bit1 input analogico
; bit2,3= input
; setta il pull up per pin RST
_PORTA
CLRF PORTA ;
MOVLW 0X0E ; W=0X0E
MOVWF TRISA ; TRISA= W
; setta RA1 come input analogico per la conversine ADC: 1 =
Analog input 0 = Digital I/O.
MOVLW 0X02 ; W=0X02
MOVWF ANSELA ; ANSELA=W
MOVLW 0X08 ; W=0X08 setta il pull up per pin RST
MOVWF WPUA ; WPUA = W
;*******************************
; accende e configura il convertitore ADC collegandolo al canale 1 e
settando la frequenza di campionamneto pari a fosc/32
_ADC
MOVLW 0X45 ; W = 0X45
MOVWF ADCON ; ADCON = W
RETURN
;*************************************************************************
; fine ROUTINES DI CONFIGURAZIONE
;*************************************************************************
;;*******************************
;*** FINE CODICE
END
|