;; ;; spreadspace pic utils ;; ;; ;; Copyright (C) 2011 Christian Pointner ;; ;; This file is part of spreadspace pic utils. ;; ;; spreadspace pic utils is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; any later version. ;; ;; spreadspace pic utils is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with spreadspace pic utils. If not, see . ;; ;; ------------------------------------- ;; PREAMBLE LIST p=16F1847 include "p16f1847.inc" __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF ;; ------------------------------------- ;; DEFINES ;; constants BUF_STARTH EQU H'0020' BUF_STARTL EQU H'0000' BUF_ENDH EQU H'0023' BUF_ENDL EQU H'00BF' #define FSRW FSR0 #define FSRWH FSR0H #define FSRWL FSR0L #define INDFW INDF0 #define FSRR FSR1 #define FSRRH FSR1H #define FSRRL FSR1L #define INDFR INDF1 ;; I/O Pins ;; PortA #define C1m PORTA,0 #define C2p PORTA,1 #define AMP_OUT PORTA,2 #define ADC_IN PORTA,3 #define SPEAKER PORTA,4 #define DBG2 PORTA,6 #define DBG1 PORTA,7 ;; PortB #define DBG0 PORTB,0 #define SDI PORTB,1 #define SDO PORTB,2 #define INT PORTB,3 #define SCK PORTB,4 #define CS PORTB,5 #define FILTER_EN PORTB,7 ;; variables ;; all Pages TMP EQU H'0070' FLAGS EQU H'007F' ;; bits ;; FLAGS #define UNDERRUN FLAGS,0 #define OVERRUN FLAGS,1 ;; ------------------------------------- ;; Macros inc_fsr MACRO PTR,PTRH,PTRL LOCAL fsr_wraparound,inc_fsr_end addfsr PTR,1 movf PTRH,w sublw BUF_ENDH btfss STATUS,C goto fsr_wraparound btfss STATUS,Z goto inc_fsr_end movf PTRL,w sublw BUF_ENDL btfsc STATUS,C goto inc_fsr_end fsr_wraparound movlw BUF_STARTH movwf PTRH movlw BUF_STARTL movwf PTRL inc_fsr_end ENDM ;; ------------------------------------- ;; Reset Vector org .0 movlb .1 ; movlw b'01011000' ; 1 MHz ; movlw b'01100000' ; 2 MHz ; movlw b'01101000' ; 4 MHz ; movlw b'01110000' ; 8 MHz movlw b'01111000' ; 16 MHz movwf OSCCON goto init ;; ------------------------------------- ;; Interrupts org .4 movlb b'00000000' btfsc PIR1,TMR2IF goto int_tmr2 btfsc PIR1,SSP1IF goto int_spi retfie int_tmr2 bcf PIR1,TMR2IF bsf DBG0 movlb b'00000001' bsf ADCON0,GO call wbuf_next btfsc OVERRUN goto int_end int_tmr2_adcon btfsc ADCON0,GO goto int_tmr2_adcon movf ADRESH,w movwf INDFW goto int_end int_spi bcf PIR1,SSP1IF movlb b'00000100' movf SSP1BUF,w incf TMP,f movf TMP,w movwf SSP1BUF movlb b'00000000' int_end movlb .31 movf FSR0H,w movwf FSR0H_SHAD movf FSR0L,w movwf FSR0L_SHAD movf FSR1H,w movwf FSR1H_SHAD movf FSR1L,w movwf FSR1L_SHAD retfie ;; ------------------------------------- ;; SUBROUTINES wbuf_reset movlw BUF_STARTH movwf FSRWH movlw BUF_STARTL movwf FSRWL bcf OVERRUN movf BSR,w clrf BSR bcf DBG2 movwf BSR return ;; ------------------- wbuf_next btfsc UNDERRUN goto wbuf_move_ptr btfsc OVERRUN return movf FSRRH,w xorwf FSRWH,w btfss STATUS,Z goto wbuf_move_ptr movf FSRRL,w xorwf FSRWL,w btfss STATUS,Z goto wbuf_move_ptr bsf OVERRUN movf BSR,w clrf BSR bsf DBG2 movwf BSR return wbuf_move_ptr movf BSR,w clrf BSR bcf INT bcf DBG1 movwf BSR bcf UNDERRUN inc_fsr FSRW,FSRWH,FSRWL return ;; ------------------- rbuf_reset movlw BUF_STARTH movwf FSRRH movlw BUF_STARTL movwf FSRRL bsf UNDERRUN movf BSR,w clrf BSR bsf INT bsf DBG1 movwf BSR return ;; ------------------- rbuf_next btfsc OVERRUN goto rbuf_move_ptr btfsc UNDERRUN return movf FSRWH,w xorwf FSRRH,w btfss STATUS,Z goto rbuf_move_ptr movf FSRWL,w xorwf FSRRL,w btfss STATUS,Z goto rbuf_move_ptr bsf UNDERRUN movf BSR,w clrf BSR bsf INT bsf DBG1 movwf BSR return rbuf_move_ptr movf BSR,w clrf BSR bcf DBG2 movwf BSR bcf OVERRUN inc_fsr FSRR,FSRRH,FSRRL return ;; ------------------------------------- ;; INIT init ;; BANK 4 movlb b'00000100' movlw b'01000000' movwf SSP1STAT movlw b'00010000' movwf SSP1CON3 movlw b'00100100' movwf SSP1CON1 bsf DBG0 ;; BANK 3 movlb b'00000011' movlw b'00001111' ; PORTA0:3 analog, PORTA4:7, digital movwf ANSELA ; PORTB0:7 digital clrf ANSELB ;; BANK 2 movlb b'00000010' ;; BANK 1 movlb b'00000001' movlw b'00101111' movwf TRISA movlw b'01110010' movwf TRISB movlw b'01010000' ; Left Justified, FOSC/16, NEG=VSS,POS=VDD movwf ADCON1 movlw b'00001101' ; AN3, ADC On movwf ADCON0 movlw b'00001010' ; SSPIE,TMR2IE movwf PIE1 ;; BANK 0 movlb b'00000000' movlw .124 ; 8 kHz @ 16MHz movwf PR2 clrf TMR2 ; reset TMR2 movlw b'00000101' ; Postscaler 1:1,Timer Off,Prescaler 1:4 movwf T2CON clrf PIR1 ; reset all used interupt flags movlw b'01000000' ; PEIE movwf INTCON bcf FILTER_EN bsf INT call wbuf_reset call rbuf_reset bsf T2CON,TMR2ON bsf INTCON,GIE ;; ------------------------------------- ;; MAINLOOP main btfsc DBG0 goto main call rbuf_next goto main ;; ------------------------------------- ;; END end