;**************************************************************************************** ; WRITTEN BY : ROBERT WESTER ; DATE : 05 JANUARI 2010 ; VERSION : 3.0 ; FILE SAVED AS : MAF_8.ASM ; TYPE : PIC16F628 @ 4MHZ ; ; 8-point Moving Average Filter ;**************************************************************************************** list p=16f628A #include "p16F628A.inc" __CONFIG _CP_OFF & _LVP_OFF &_BODEN_ON & _MCLRE_ON & _PWRTE_ON & _WDT_OFF &_INTRC_OSC_NOCLKOUT ; ########################################### ; # EPROM: DEFINE AND EQUATES # ; ########################################### #DEFINE CS0 PORTA,0 ; CHIPSELECT FOR AD ; PIN 17 #DEFINE CS1 PORTA,1 ; CHIPSELECT FOR DA / ADC CONV START ; PIN 18 CBLOCK 0X20 SAMP_1 ; SAMPLE 1 SAMP_2 ; SAMPLE 2 SAMP_3 ; SAMPLE 3 SAMP_4 ; SAMPLE 4 SAMP_5 ; SAMPLE 5 SAMP_6 ; SAMPLE 6 SAMP_7 ; SAMPLE 7 SAMP_8 ; SAMPLE 8 SUM_L ; SUM LOW BYTE SUM_H ; SUM HIGH BYTE ENDC ; *** START PROGRAM *** ORG 00 ; START OF PROGRAM ; ########################################### ; # EPROM: INIT ROUTINE # ; ########################################### INIT MOVLW 0X07 ; MOVWF CMCON ; USE PORTA AS I/O BSF STATUS,RP0 ; BCF STATUS,RP1 ; SELECT BANK 1 (TRISA/TRISB/ADCON1) CLRF TRISA ; PORTA AS OUTPUT BCF STATUS,RP0 ; SELECT BANK 0 BSF CS0 ; CS0 (AD) HIGH BSF CS1 ; CS1 (DA) HIGH BSF STATUS,RP0 ; SELECT BANK 1 (TRISA/TRISB/ADCON1) CLRF TRISB ; PORTB AS OUTPUT BCF STATUS,RP0 ; SELECT BANK 0 CLRF SAMP_1 ; CLRF SAMP_2 ; CLRF SAMP_3 ; CLRF SAMP_4 ; CLRF SAMP_5 ; CLRF SAMP_6 ; CLRF SAMP_7 ; CLRF SAMP_8 ; CLRF SUM_L ; CLRF SUM_H ; CLEAR USED MEMORY LOCATIONS MOVLW 0X20 ; BEGIN SAMPLE MEMORY MOVWF FSR ; MOVE TO FSR (INDIRECT DATA MEMORY ADDRESS POINTER) LOOP MOVF INDF,W ; GET DATA FROM ADRES WHERE FSR POINT'S TO SUB_SUM SUBWF SUM_L,F ; SUBSTRACT OLDEST SAMPLE FROM SUM BTFSS STATUS,C ; DECF SUM_H,F ; CHECK FOR CARRY, IF CARRY SUM_H - 1 BTFSC STATUS,C ; NOP ; INSTRUCTION SKIP COMPENSATION ADC BSF STATUS,RP0 ; SELECT BANK 1 (TRISA/TRISB/ADCON1) DECF TRISB,F ; PORTB AS INPUT BCF STATUS,RP0 ; SELECT BANK 0 BCF CS0 ; SELECT ADC MOVF PORTB,W ; GET DATA FROM ADC MOVWF INDF ; SAVE SAMPLE BSF CS0 ; HIGHSTATE ADC ADD_SUM ADDWF SUM_L,F ; ADD NEW SAMPLE TO SUM BTFSC STATUS,C ; INCF SUM_H,F ; CHECK FOR CARRY, IF CARRY SUM_H + 1 BTFSS STATUS,C ; NOP ; INSTRUCTION SKIP COMPENSATION BCF STATUS,C ; CLEAR CARRY DAC BSF STATUS,RP0 ; SELECT BANK 1 (TRISA/TRISB/ADCON1) CLRF TRISB ; PORTB AS OUTPUT BCF STATUS,RP0 ; SELECT BANK 0 MOVF SUM_L,W ; PUT SUM_L IN W ANDLW 0xFC ; AND W WITH '11111100' CLEAR FIRST TWO BITS MOVWF PORTB ; PUT W ON PORTB RRF SUM_H,W ; ROTATE SUM_H RIGHT THROUGH CARRY PUT IN W IORWF PORTB,F ; OR PORTB WITH W RRF PORTB,F ; ROTATE PORTB RIGHT RRF PORTB,F ; ROTATE PORTB RIGHT RRF PORTB,F ; ROTATE PORTB RIGHT INC_POINT INCF FSR,F ; INCREASE POINTER BCF CS1 ; SELECT DAC / START ADC CONV BTFSS FSR,3 ; NOP ; INSTRUCTION SKIP COMPENSATION BSF CS1 ; HIGHSTATE DAC (LATCH OUTPUT) BTFSC FSR,3 ; IF BIT 3 IS SET BCF FSR,3 ; CLEAR BIT 3 (28 > 20) GOTO LOOP ; GET NEXT SAMPLE END