;----------------------------------------------------- ; CONTAGIRI - Contagiri elicottero t-rex ; By Claudio Fin 16/7/2005 - Versione 1.0 ;----------------------------------------------------- PROCESSOR 16F628 ;4MHz RADIX DEC INCLUDE "P16F628.INC" __CONFIG 11110100100001B ;----------------------------------------------------- ; Uilizzo porte: ; RB3 (in) - Ingresso frequenza ; RB5 (out) - Clock display ; RB6 (out) - Dati display ; RB7 (out) - Strobe display ;----------------------------------------------------- ;----------------------------------------------------- ; Variabili del programma e definizioni ;----------------------------------------------------- ORG 20H AL RES 1 CL RES 1 CH RES 1 QL RES 1 QH RES 1 DL RES 1 DM RES 1 DH RES 1 VL RES 1 VH RES 1 VU RES 1 FL1 RES 1 FL2 RES 1 DIGIT1 RES 1 DIGIT2 RES 1 DIGIT3 RES 1 DIGIT4 RES 1 #DEFINE CLOCK PORTB,5 #DEFINE SEROUT PORTB,6 #DEFINE STROBE PORTB,7 #DEFINE PULSEIN PORTB,3 ;----------------------------------------------------- ; Inizio programma all'indirizzo 0. ;----------------------------------------------------- ORG 0 GOTO INIZIO ; Tabella conversione bcd -> 7 segmenti TABDISP ADDWF PCL,F RETLW 01111110B ;0 RETLW 00110000B ;1 RETLW 01101101B ;2 RETLW 01111001B ;3 RETLW 00110011B ;4 RETLW 01011011B ;5 RETLW 01011111B ;6 RETLW 01110000B ;7 RETLW 01111111B ;8 RETLW 01111011B ;9 RETLW 00000000B ;10 (blank) ; Init porte e variabili INIZIO CLRF PORTB ;preazzera latch porta B BSF STATUS,RP0 ;attiva banco1 BCF TRISB,5 ;RB5 uscita BCF TRISB,6 ;RB6 uscita BCF TRISB,7 ;RB7 uscita BCF STATUS,RP0 ;torna a banco 0 CLRF DIGIT1 CLRF DIGIT2 CLRF DIGIT3 CLRF DIGIT4 ;----------------------------------------------------- ; Ciclo principale ;----------------------------------------------------- CALL VISUALIZZA ;display a 000 MAINLOOP BTFSC PULSEIN ;attende impulso a 0 GOTO $-1 CLRF CL ;azzera conteggio CLRF CH BTFSS PULSEIN ;attende impulso a 1 GOTO $-1 CONTEGGIA INCF CL ;incrementa conteggio MOVF CL,W BTFSC STATUS,Z INCF CH BTFSC PULSEIN ;se fine impulso skip GOTO CONTEGGIA ;else continua conteggio CALL CALCOLA ;4285714/CH:CL CALL SCOMPONI ;bin -> BCD CALL VISUALIZZA GOTO MAINLOOP ;----------------------------------------------------- ; Calcola CH:CL = 4285714 / CH:CL ;----------------------------------------------------- CALCOLA MOVF CH,W ;se CH:CL <129 ritorna 0 BTFSS STATUS,Z GOTO $+7 MOVF CL,W SUBLW 128 BTFSS STATUS,C GOTO $+3 CLRF CL RETURN MOVLW 65 ;dividendo=4285714 MOVWF DH MOVLW 101 MOVWF DM MOVLW 18 MOVWF DL MOVF CL,W ;divisore=CH:CL MOVWF VL MOVF CH,W MOVWF VH CALL DIVIDI MOVF QL,W MOVWF CL MOVF QH,W MOVWF CH RETURN ;----------------------------------------------------- ; Scomposizione binario -> BCD ; CH:CL -> DIGIT4..DIGIT1 ;----------------------------------------------------- SCOMPONI MOVF CL,W MOVWF DL MOVF CH,W MOVWF DM CLRF DH MOVLW 232 MOVWF VL MOVLW 3 MOVWF VH CALL DIVIDI MOVF QL,W MOVWF DIGIT1 SUBLW 3 ;se DIGIT1>3 BTFSC STATUS,C GOTO $+6 CLRF DIGIT1 ;azzera tutto CLRF DIGIT2 CLRF DIGIT3 CLRF DIGIT4 RETURN MOVLW 100 MOVWF VL CLRF VH CALL DIVIDI MOVF QL,W MOVWF DIGIT2 MOVLW 10 MOVWF VL CLRF VH CALL DIVIDI MOVF QL,W MOVWF DIGIT3 MOVF DL,W MOVWF DIGIT4 RETURN ;----------------------------------------------------- ; Visualizza valori DIGIT1..DIGIT4 su display LCD ;----------------------------------------------------- VISUALIZZA BCF SEROUT CALL PULSECLOCK CALL PULSECLOCK CALL PULSECLOCK CALL PULSECLOCK MOVF DIGIT1,W BTFSC STATUS,Z ;se DIGIT1=0 MOVLW 10 ;sopprime zero iniziale CALL VISUAL2 MOVF DIGIT2,W CALL VISUAL2 MOVF DIGIT3,W CALL VISUAL2 MOVF DIGIT4,W CALL VISUAL2 CALL PULSESTROBE RETURN VISUAL2 CALL TABDISP MOVWF AL MOVLW 7 MOVWF CL BTFSS AL,0 BCF SEROUT BTFSC AL,0 BSF SEROUT CALL PULSECLOCK RRF AL,F DECFSZ CL,F GOTO $-7 RETURN PULSECLOCK BSF CLOCK ;impulso 14uS MOVLW 4 MOVWF CH DECFSZ CH,F GOTO $-1 BCF CLOCK RETURN PULSESTROBE BSF STROBE ;impulso 14uS MOVLW 4 MOVWF CH DECFSZ CH,F GOTO $-1 BCF STROBE RETURN ;----------------------------------------------------- ; Divisione intera senza segno 24/16bit. ; Operazione: QH:QL = DH:DM:DL / VH:VL ; DH:DM:DL=resto ; Usa: CL, FL1, FL2, VU ;----------------------------------------------------- DIVIDI CLRF QL ;azzera quoziente CLRF QH CLRF VU CLRF CL ;Azzera contatore di ciclo INCF CL,F ;CL=CL+1 BTFSC VU,7 ;Se bit 7 di VH=0 skip GOTO DIVIDI2 BCF STATUS,C ;Azzera carry RLF VL,F ;Ruota divisore a sinistra RLF VH,F RLF VU,F GOTO $-7 DIVIDI2 CALL SUB24_16 ;sottraz.DH:DM:DL-VU:VH:VL RLF QL,F ;Ruota carry a destra nel quoziente RLF QH,F BTFSS QL,0 ;Se non overflow skip CALL RESTORE ;altrimenti risomma DH:DM:DL+VH:VL BCF STATUS,C ;Azzera carry RRF VU,F RRF VH,F ;Ruota divisore a destra RRF VL,F DECFSZ CL,F ;Decrementa contat.ciclo, skip se 0 GOTO DIVIDI2 ;altrimenti vai a DIVIDI2 RETURN ;----------------------------------------------------- ; DH:DM:DL = DH:DM:DL - VU:VH:VL (con regolazione corretta flag C) ; FL1 e 2 = salvataggio intermedio flag C ;----------------------------------------------------- SUB24_16 BSF FL1,4 BSF FL2,4 MOVF VL,W SUBWF DL,F BTFSC STATUS,C GOTO SUB24_16_2 MOVLW 1 SUBWF DM,F BTFSC STATUS,C GOTO SUB24_16_2 SUBWF DH,F SWAPF STATUS,W MOVWF FL1 SUB24_16_2 MOVF VH,W SUBWF DM,F BTFSC STATUS,C GOTO SUB24_16_3 MOVLW 1 SUBWF DH,F SWAPF STATUS,W MOVWF FL2 SUB24_16_3 MOVF VU,W SUBWF DH,F BTFSS FL1,4 BCF STATUS,C BTFSS FL2,4 BCF STATUS,C RETURN ;----------------------------------------------------- ; DH:DM:DL = DH:DM:DL + VU:VH:VL (senza regolazione flag C) ;----------------------------------------------------- RESTORE MOVF VL,W ADDWF DL,F BTFSS STATUS,C GOTO $+4 INCFSZ DM,F GOTO $+2 INCF DH,F MOVF VH,W ADDWF DM,F BTFSC STATUS,C INCF DH,F MOVF VU,W ADDWF DH,F RETURN ;----------------------------------------------------- END