;; ;; 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 CMD EQU H'0070' FLAGS EQU H'007F' ;; bits ;; FLAGS #define UNDERRUN FLAGS,0 #define OVERRUN FLAGS,1 #define CMD_READ FLAGS,7 ;; ------------------------------------- ;; 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 ;; void timer2Interrupt() ;; { ;; static char value = 0; ;; if (!overrun) { ;; *writePtr = ++value; ;; wbuf_next(); ;; } ;; } int_tmr2 bcf PIR1,TMR2IF btfsc OVERRUN goto int_end movlb b'00000001' bsf ADCON0,GO int_tmr2_adcon btfsc ADCON0,GO goto int_tmr2_adcon movf ADRESH,w movwf INDFW call wbuf_next goto int_end ;; void sspInterrupt() ;; { ;; if (cmd_read && spiData == 0) { ;; *readPtr = 0; ;; rbuf_next(); ;; spiData = underrun ? -1 : *readPtr; ;; } else if (spiData == 'r') { ;; cmd_read = TRUE; ;; spiData = underrun ? -1 : *readPtr; ;; } else { ;; cmd_read = FALSE; ;; printf("%s\n", "I don't like you!"); ;; } ;; } int_spi bcf PIR1,SSP1IF movlb b'00000100' movf SSP1BUF,w movwf CMD movwf SSP1BUF 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 ;; void buf_init() ;; { ;; writePtr = bufferStart; ;; readPtr = bufferStart; ;; overrun = FALSE; ;; underrun = TRUE; ;; cmd_read = FALSE; ;; } buf_init movlw BUF_STARTH movwf FSRWH movlw BUF_STARTL movwf FSRWL movlw BUF_STARTH movwf FSRRH movlw BUF_STARTL movwf FSRRL bcf OVERRUN bsf UNDERRUN bcf CMD_READ movf BSR,w clrf BSR bsf INT bsf DBG1 bcf DBG2 movwf BSR return ;; ------------------- ;; void wbuf_next() ;; { ;; if (!overrun) { ;; writePtr++; ;; writePtr = writePtr > bufferEnd ? bufferStart : writePtr; ;; underrun = FALSE; ;; if(writePtr == readPtr) { ;; overrun = TRUE; ;; } ;; } ;; } wbuf_next btfsc OVERRUN return inc_fsr FSRW,FSRWH,FSRWL bcf UNDERRUN movf FSRRH,w xorwf FSRWH,w btfss STATUS,Z return movf FSRRL,w xorwf FSRWL,w btfss STATUS,Z return bsf OVERRUN return ;; ------------------- ;; void rbuf_next() ;; { ;; if(!underrun) { ;; readPtr++; ;; readPtr = readPtr > bufferEnd ? bufferStart : readPtr; ;; overrun = FALSE; ;; if(readPtr == writePtr) { ;; underrun = TRUE; ;; } ;; } ;; } rbuf_next btfsc UNDERRUN return inc_fsr FSRR,FSRRH,FSRRL bcf OVERRUN movf FSRWH,w xorwf FSRRH,w btfss STATUS,Z return movf FSRWL,w xorwf FSRRL,w btfss STATUS,Z return bsf UNDERRUN 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 buf_init bsf T2CON,TMR2ON bsf INTCON,GIE ;; ------------------------------------- ;; MAINLOOP main btfsc DBG0 goto main call rbuf_next goto main ;; ------------------------------------- ;; END end