EMULARE IL 555 CON UN MICRO - 5




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