;; ;; 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 020h BUF_STARTL EQU 000h BUF_ENDH EQU 023h BUF_ENDL EQU 0BFh ;; I/O Pins ;; PortA C1m EQU .0 C2p EQU .1 AMP_OUT EQU .2 ADC_IN EQU .3 CCP4 EQU .4 ;; PortB SDI EQU .1 SDO EQU .2 INT EQU .3 SCK EQU .4 CS EQU .5 FILTER_EN EQU .7 ;; variables ;; all Pages CNT0 EQU H'0070' CNT1 EQU H'0071' CNT2 EQU H'0072' TMP EQU H'0073' FLAGS EQU H'007F' ;; bits ;; FLAGS UNDERRUN EQU .0 OVERRUN EQU .1 ;; ------------------------------------- ;; OFFSET org .0 goto init ;; ------------------------------------- ;; Interrupts org .4 movlb b'00000000' btfsc PIR1,SSP1IF goto int_spi retfie int_spi bsf PORTA,7 bcf PIR1,SSP1IF movlb b'00000100' movf SSP1BUF,w incf TMP,f movf TMP,w movwf SSP1BUF movlb b'00000000' bcf PORTA,7 retfie ;; ------------------------------------- ;; SUBROUTINES wbuf_reset movlw BUF_STARTH movwf FSR0H movlw BUF_STARTL movwf FSR0L bcf FLAGS,OVERRUN return ;; ------------------- wbuf_next btfsc FLAGS,UNDERRUN goto wbuf_move_ptr movf FSR1H,w xorwf FSR0H,w btfss STATUS,Z goto wbuf_move_ptr movf FSR1L,w xorwf FSR0L,w btfss STATUS,Z goto wbuf_move_ptr bsf FLAGS,OVERRUN return wbuf_move_ptr bcf FLAGS,UNDERRUN addfsr FSR0,1 movf FSR0H,w sublw BUF_ENDH btfss STATUS,C goto wbuf_wraparound btfss STATUS,Z return movf FSR0L,w sublw BUF_ENDL btfsc STATUS,C return wbuf_wraparound movlw BUF_STARTH movwf FSR0H movlw BUF_STARTL movwf FSR0L return ;; ------------------- rbuf_reset movlw BUF_STARTH movwf FSR1H movlw BUF_STARTL movwf FSR1L bsf FLAGS,UNDERRUN ;; ------------------- rbuf_next btfsc FLAGS,OVERRUN goto rbuf_move_ptr movf FSR0H,w xorwf FSR1H,w btfss STATUS,Z goto rbuf_move_ptr movf FSR0L,w xorwf FSR1L,w btfss STATUS,Z goto rbuf_move_ptr bsf FLAGS,UNDERRUN return rbuf_move_ptr bcf FLAGS,OVERRUN addfsr FSR1,1 movf FSR1H,w sublw BUF_ENDH btfss STATUS,C goto rbuf_wraparound btfss STATUS,Z return movf FSR1L,w sublw BUF_ENDL btfsc STATUS,C return rbuf_wraparound movlw BUF_STARTH movwf FSR1H movlw BUF_STARTL movwf FSR1L return ;; ------------------------------------- ;; INIT init ;; BANK 4 movlb b'00000100' movlw b'01000000' movwf SSP1STAT movlw b'00010000' movwf SSP1CON3 movlw b'00100100' movwf SSP1CON1 ;; BANK 3 movlb b'00000011' clrf ANSELA clrf ANSELB ;; BANK 2 movlb b'00000010' ;; BANK 1 movlb b'00000001' movlw b'01111111' movwf TRISA movlw b'01110011' movwf TRISB ; 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 movlw b'00001000' movwf PIE1 ;; BANK 0 movlb b'00000000' clrf PIR1 movlw b'11000000' movwf INTCON bcf PORTA,FILTER_EN bsf PORTB,INT ;; ------------------------------------- ;; MAINLOOP main movlw .255 movwf CNT0 outer1 movlw .255 movwf CNT1 outer movlw .5 movwf CNT2 inner decfsz CNT2,f goto inner decfsz CNT1,f goto outer decfsz CNT0,f goto outer1 movlw b'00001000' xorwf PORTB,f goto main ;; ------------------------------------- ;; END end