;----------------------------------------------------------------------- ; DCF77.ASM - Orologio radiocontrollato - 1.0 ; By Claudio Fin - 5/10/2003 ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ; UTILIZZO PORTE: ;----------------------------------------------------------------------- ; ; RA0 out --> Debug LED (1=acceso) ; RA1 out ; RA2 out --> Clock display ; RA3 out --> Dati display ; RA4 out(oc) ; RA5 out ; RA6 out ; RA7 out ; ; RB0 in(p-up) <-- 250 Hz ; RB1 in(p-up) <-- Impulsi dal demodulatore (1=riposo, 0=impulso) ; RB2 in(p-up) ; RB3 in(p-up) ; RB4 in(p-up) ; RB5 in(p-up) ; RB6 in(p-up) ; RB7 in(p-up) ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ; DEFINIZIONI ;----------------------------------------------------------------------- PROCESSOR 16F628 RADIX DEC INCLUDE "P16F628.INC" __CONFIG 11110100010100B ;Clock interno, MCLR OSCin OSCout = I/O, WDT attivo #define IN_FREQ PORTB,0 #define IN_PULS PORTB,1 #define CK_DSP PORTA,2 #define DA_DSP PORTA,3 #define DBGLED PORTA,0 ORG 20H cont250 RES 1 ;CONTATORE 250ESIMI DI SEC OROLOGIO sec RES 1 ;CONTATORE SECONDI OROLOGIO l_min RES 1 ;CAMPI CON IL VALORE ATTUALE DELL'ORA h_min RES 1 l_ora RES 1 h_ora RES 1 rx_l_min RES 1 ;CAMPI CON VALORI ORARI RICEVUTI rx_h_min RES 1 rx_l_ora RES 1 rx_h_ora RES 1 contdsp RES 1 ;CONTATORE PROCESSO DI VISUALIZZAZIONE cont_blink RES 1 ;CONTATORE PER LAMPEGGIO ORA dsp_byte RES 1 ;BYTE DA INVIARE AL DISPLAY flag1 RES 1 #define pulse flag1,0 ;IMPULSI FILTRATI (1=IMPULSO) #define regolato flag1,1 ;0=ORA NON REGOLATA 1=REGOLATA #define trama_ok flag1,2 ;1= TRAMA 36 BIT RICEVUTA OK #define rx_error flag1,3 ;ERR IN CTRL PARITA'/START/FORMATO #define rx_bit flag1,4 ;BIT RICEVUTO #define parita flag1,5 ;PARITA'PARI #define all6h_ok flag1,6 ;0 SE MANCA SYNC DA + DI 6 ORE #define sync_ok flag1,7 ;1 SE SINCRONIZZATO cont1 RES 1 ;CONTATORE PROCESSO ANTIRIMBALZO ant_stat RES 1 ;STATO PROCESSO ANTIRIMBALZO cont5 RES 1 ;CONTATORE PROCESSO LETTURA BIT legbit_stat RES 1 ;STATO PROCESSO LETTURA BIT cont6 RES 1 cont7 RES 1 legfrm_stat RES 1 ;STATO SUBPROCESSO DECODIF.TRAMA rx_byte RES 1 ;BYTE RICEVUTO flag2 RES 1 #define vis_errore flag2,0 ;1=visualizza errore su led rosso cont_err RES 1 ;CONTAT.TEMPO VISUALIZZ.ERRORE cont6h RES 2 ;CONTAT.16 BIT 6 ORE NO SYNC cont6h250 RES 1 ;----------------------------------------------------------------------- ; PROGRAMMA ;----------------------------------------------------------------------- ORG 0 CLRWDT GOTO inizio ;----------------------------------------------------------------------- ; TABELLA CONVERSIONE BCD->7 SEGMENTI ;----------------------------------------------------------------------- tabdisp ADDWF PCL,F RETLW 11111100B ; 0 RETLW 01100000B ; 1 RETLW 11011010B ; 2 RETLW 11110010B ; 3 RETLW 01100110B ; 4 RETLW 10110110B ; 5 RETLW 10111110B ; 6 RETLW 11100000B ; 7 RETLW 11111110B ; 8 RETLW 11110110B ; 9 ; -------- ; ABCDEFG. ;----------------------------------------------------------------------- ; Predisposizione hardware e inizializzazione variabili ;----------------------------------------------------------------------- inizio MOVLW 7 MOVWF CMCON ;Scollega comparatori da porta A MOVLW 00000100B ;Prescrive valori iniziali porta A MOVWF PORTA BSF STATUS,RP0 ;BANCO 1 CLRF TRISA ;Predispone porta A come uscite BCF OPTION_REG,7 ;Attiva pull-ups su porta B BCF STATUS,RP0 ;BANCO 0 MOVLW 36 ;SEQUENZA RESET AL DISPLAY MOVWF contdsp BCF CK_DSP BSF CK_DSP DECFSZ contdsp,F GOTO $-3 MOVLW 250 ;AZZERA OROLOGIO MOVWF cont250 MOVLW 60 MOVWF sec CLRF h_min CLRF l_min CLRF h_ora CLRF l_ora MOVLW 250 ;CONTATORE BLINK ORA NON REGOLATA MOVWF cont_blink CLRF ant_stat ;AZZERA STATO PROCESSO ANTIRIMBALZO BSF ant_stat,0 CLRF legbit_stat ;AZZERA STATO PROCESSO LETTURA BIT BSF legbit_stat,0 CLRF flag1 CLRF flag2 ;----------------------------------------------------------------------- ; Ciclo principale del programma sincronizzato con i 250 Hz in ; arrivo su RB0. I processi vengono fatti avanzare ogni 4 mS. ;----------------------------------------------------------------------- mainloop CLRWDT BTFSS IN_FREQ GOTO $-1 CALL debounc CALL leggibit CALL orologio CALL visualizza BTFSC IN_FREQ GOTO $-1 GOTO mainloop ;----------------------------------------------------------------------- ; Legge gli impulsi e applica un antirimbalzo di 16 mS in attacco e ; 32 mS in rilascio. Il valore ripulito e invertito di livello viene ; scritto nel flag "pulse". ;----------------------------------------------------------------------- debounc BTFSC ant_stat,1 ;Selettore stato attivo GOTO deb1 BTFSC ant_stat,2 GOTO deb2 BTFSC ant_stat,3 GOTO deb3 deb0 BTFSC IN_PULS ;Attende inizio impulso RETURN MOVLW 4 MOVWF cont1 CLRF ant_stat BSF ant_stat,1 RETURN deb1 BTFSS IN_PULS ;Controlla stabilita'per 16 mS GOTO $+4 CLRF ant_stat BSF ant_stat,0 RETURN DECFSZ cont1,F RETURN BSF pulse CLRF ant_stat BSF ant_stat,2 RETURN deb2 BTFSS IN_PULS ;Attende fine impulso RETURN MOVLW 8 MOVWF cont1 CLRF ant_stat BSF ant_stat,3 RETURN deb3 BTFSC IN_PULS ;Controlla stabilita' per 32 mS GOTO $+4 CLRF ant_stat BSF ant_stat,2 RETURN DECFSZ cont1,F RETURN BCF pulse CLRF ant_stat BSF ant_stat,0 RETURN ;----------------------------------------------------------------------- leggibit BTFSC legbit_stat,1 ;Selettore stato attivo GOTO legbit1 BTFSC legbit_stat,2 GOTO legbit2 BTFSC legbit_stat,3 GOTO legbit3 BTFSC legbit_stat,4 GOTO legbit4 BTFSC legbit_stat,5 GOTO legbit5 legbit0 BTFSS pulse ;CONTROLLA SE ALMENO 1 SECONDO DI PAUSA GOTO $+4 MOVLW 250 MOVWF cont5 RETURN DECFSZ cont5,F RETURN CLRF legbit_stat BSF legbit_stat,1 CLRF legfrm_stat ;AZZERA STATO SUBPROCESSO DECODIF.TRAMA BSF legfrm_stat,0 MOVLW 21 MOVWF cont6 BCF trama_ok BCF parita BCF rx_error RETURN legbit1 BTFSS pulse ;ATTENDE INIZIO PRIMO IMPULSO RETURN CLRF cont5 CLRF legbit_stat BSF legbit_stat,2 RETURN legbit2 BTFSS pulse ;CONTA DURATA IMPULSO GOTO $+3 INCF cont5,F RETURN MOVF cont5,W ;SE <50 mS ERRORE SUBLW 12 BTFSC STATUS,C GOTO legbit_error MOVF cont5,W ;SE >250mS ERRORE SUBLW 63 BTFSS STATUS,C GOTO legbit_error BSF rx_bit ;SE >150 mS = 1 MOVF cont5,W SUBLW 38 BTFSC STATUS,C BCF rx_bit CALL leggitrama BTFSC rx_error GOTO legbit_error BTFSS trama_ok GOTO $+8 MOVLW 250 MOVWF cont6 MOVLW 24 MOVWF cont7 CLRF legbit_stat BSF legbit_stat,5 RETURN MOVLW 187 MOVWF cont5 CLRF legbit_stat BSF legbit_stat,3 RETURN legbit3 DECFSZ cont5,F ;ATTENDE 750mS RETURN MOVLW 63 MOVWF cont5 CLRF legbit_stat BSF legbit_stat,4 RETURN legbit4 BTFSS pulse ;ATTENDE INIZIO SUCCESS.IMPULSO GOTO $+5 ;ENTRO 200 mS CLRF cont5 CLRF legbit_stat BSF legbit_stat,2 RETURN DECFSZ cont5,F RETURN GOTO legbit_error legbit5 DECFSZ cont6,F ;ATTENDE 24 SECONDI RETURN MOVLW 250 MOVWF cont6 DECFSZ cont7,F RETURN MOVF rx_l_min,W ;REGOLA OROLOGIO MOVWF l_min MOVF rx_h_min,W MOVWF h_min MOVF rx_l_ora,W MOVWF l_ora MOVF rx_h_ora,W MOVWF h_ora MOVLW 250 MOVWF cont250 MOVLW 60 MOVWF sec BSF sync_ok BSF regolato BSF all6h_ok CLRF legbit_stat BSF legbit_stat,0 RETURN legbit_error CLRF legbit_stat ;ERR RX, RESET BSF legbit_stat,0 BCF sync_ok MOVLW 80 ;IMPOSTA VISUALIZZ.ERRORE MOVWF cont_err BSF vis_errore RETURN ;----------------------------------------------------------------------- leggitrama RLF flag1,W ;AGGIORNA PARITA' XORWF flag1,W ANDLW 00100000B BCF parita BTFSS STATUS,Z BSF parita BTFSC legfrm_stat,1 ;SELETTORE STATO ATTIVO GOTO legfrm1 BTFSC legfrm_stat,2 GOTO legfrm2 legfrm0 DECFSZ cont6,F ;LETTURA PRIMI 21 BIT RETURN BTFSS rx_bit ;L'ULTIMO DEVE ESSERE A 1 GOTO legfrm_error CLRF legfrm_stat BSF legfrm_stat,1 MOVLW 8 MOVWF cont6 RETURN legfrm1 RRF rx_byte,F ;LETTURA 8 BIT MINUTI BCF rx_byte,7 BTFSC rx_bit BSF rx_byte,7 DECFSZ cont6,F RETURN BTFSC parita ;CONTROLLA PARITA' GOTO legfrm_error MOVF rx_byte,W ANDLW 00001111B MOVWF rx_l_min SWAPF rx_byte,W ANDLW 00000111B MOVWF rx_h_min MOVF rx_l_min,W ;CONTROLLA RANGE VALORI SUBLW 9 BTFSS STATUS,C GOTO legfrm_error MOVF rx_h_min,W SUBLW 5 BTFSS STATUS,C GOTO legfrm_error CLRF legfrm_stat BSF legfrm_stat,2 MOVLW 7 MOVWF cont6 BCF parita RETURN legfrm2 RRF rx_byte,F ;LETTURA 7 BIT ORA BCF rx_byte,7 BTFSC rx_bit BSF rx_byte,7 DECFSZ cont6,F RETURN BTFSC parita ;CONTROLLA PARITA' GOTO legfrm_error RRF rx_byte,F MOVF rx_byte,W ANDLW 00001111B MOVWF rx_l_ora SWAPF rx_byte,W ANDLW 00000011B MOVWF rx_h_ora MOVF rx_l_ora,W ;CONTROLLA RANGE VALORI SUBLW 9 BTFSS STATUS,C GOTO legfrm_error MOVF rx_h_ora,W SUBLW 2 BTFSS STATUS,C GOTO legfrm_error BSF trama_ok RETURN legfrm_error BSF rx_error RETURN ;----------------------------------------------------------------------- orologio DECFSZ cont250,F RETURN MOVLW 250 MOVWF cont250 DECFSZ sec,F RETURN MOVLW 60 MOVWF sec INCF l_min,F MOVLW 10 XORWF l_min,W BTFSS STATUS,Z RETURN CLRF l_min INCF h_min,F MOVLW 6 XORWF h_min,W BTFSS STATUS,Z RETURN CLRF h_min INCF l_ora,F MOVLW 10 XORWF l_ora,W BTFSS STATUS,Z GOTO $+3 CLRF l_ora INCF h_ora,F MOVF l_ora,W XORLW 4 BTFSS STATUS,Z RETURN MOVF h_ora,W XORLW 2 BTFSS STATUS,Z RETURN CLRF l_ora CLRF h_ora RETURN ;----------------------------------------------------------------------- visualizza BTFSS sync_ok ;SE 6 ORE SENZA SYNC ATTIVA ALLARME GOTO $+8 MOVLW 96 MOVWF cont6h MOVLW 84 MOVWF cont6h+1 MOVLW 250 MOVWF cont6h250 GOTO $+11 DECFSZ cont6h250,F GOTO $+9 DECF cont6h,F INCF cont6h,W BTFSC STATUS,Z DECF cont6h+1,F MOVF cont6h,W IORWF cont6h+1,W BTFSC STATUS,Z BCF all6h_ok BTFSS vis_errore ;GESTIONE VISUALIZZ.ERRORE RICEZIONE GOTO $+4 DECFSZ cont_err,F GOTO $+2 BCF vis_errore BTFSS pulse ;SCRIVE VALORE DI pulse SU DEBUG LED GOTO $+3 BSF DBGLED GOTO $+2 BCF DBGLED BSF DA_DSP ;START BIT DISPLAY BCF CK_DSP BSF CK_DSP BTFSC regolato GOTO visualizza3 MOVF cont_blink,W SUBLW 125 BTFSC STATUS,C GOTO visualizza3 BCF DA_DSP ;SEQUENZA 32 BITS ZERO PER BLINK ORA MOVLW 32 MOVWF contdsp BCF CK_DSP BSF CK_DSP DECFSZ contdsp,F GOTO $-3 GOTO visualizza4 visualizza3 MOVF l_min,W CALL tabdisp CALL visualizza2 MOVF h_min,W CALL tabdisp CALL visualizza2 MOVF l_ora,W CALL tabdisp IORLW 1 CALL visualizza2 MOVF h_ora,W XORLW 0 BTFSC STATUS,Z GOTO $+2 CALL tabdisp CALL visualizza2 GOTO visualizza4 visualizza4 BCF DA_DSP ;33esimo bit led rosso BTFSS all6h_ok BSF DA_DSP BTFSC vis_errore BSF DA_DSP BCF CK_DSP BSF CK_DSP BCF DA_DSP ;34esimo bit led verde BTFSC sync_ok BSF DA_DSP BCF CK_DSP BSF CK_DSP BCF DA_DSP ;STOP BIT DISPLAY BCF CK_DSP BSF CK_DSP DECFSZ cont_blink,F ;AGGIORNA CONTATORE BLINK ORA RETURN MOVLW 250 MOVWF cont_blink RETURN visualizza2 MOVWF dsp_byte MOVLW 8 MOVWF contdsp BCF DA_DSP BTFSC dsp_byte,7 BSF DA_DSP BCF CK_DSP BSF CK_DSP RLF dsp_byte,F DECFSZ contdsp,F GOTO $-7 RETURN ;----------------------------------------------------------------------- END