; *************************************************************** ; * Copyright (C) 2005, Embed Inc (http://www.embedinc.com) * ; * * ; * Permission to copy this file is granted as long as this * ; * copyright notice is included in its entirety at the * ; * beginning of the file, whether the file is copied in whole * ; * or in part and regardless of whether other information is * ; * added to the copy. * ; * * ; * The contents of this file may be used in any way, * ; * commercial or otherwise. This file is provided "as is", * ; * and Embed Inc makes no claims of suitability for a * ; * particular purpose nor assumes any liability resulting from * ; * its use. * ; *************************************************************** ; ; Top module for the QQ2 project. See the QQ2.INS.ASPIC include ; file for a description of the project. ; /include "qq2.ins.aspic" extern regs ;force general registers to be defined extern init ;system startup after individual modules initialized /show " Instruction clock = " [eng freq_inst 4] "Hz" /if debug_icd then /show " Configured for ICD debugging" /endif ;******************************************************************************* ; ; Set static processor configuration bits. ; ; ; Sample for 16F628. ; __config b'11111101000010' ; 1111---------- code protection off ; -----1-------- data memory protection off ; ------0------- low voltage programming disabled ; -------1------ brown out detect enabled ; --------0----- RA5 is digital input, not MCLR ; ----------0--- power up timer enabled ; -----------0-- watchdog timer disabled ; ---------0--10 HS oscillator mode ; ; Sample for 16F876. ; __config b'11111101110010' ; 11------11---- code protection disabled ; --1----------- no in circuit debugging, RB6,RB7 general I/O ; ---X---------- unused ; ----1--------- flash memory is writeable by program ; -----1-------- EEPROM read protection disabled ; ------0------- low volt in circ prog off, RB3 is general I/O ; -------1------ brown out reset enabled ; ----------0--- power up timer enabled ; -----------0-- watchdog timer disabled ; ------------10 high speed oscillator mode ; ; Sample for 18F47J53. ; .config code_pack cfg_adr db b'10101100' ;CONFIG1L ; 1------- RB6/RB7 debugging disabled ; -0------ disable extended instruction set ; --1----- reset on stack overflow or underflow ; ---0---- 96 MHz PLL enabled ; ----110- input to PLL is divided by 2 (8 MHz osc) ; -------0 watchdog timer disabled db b'11111111' ;CONFIG1H ; XXXXX--- unused ; -----1-- code protection disabled ; ------11 CPU clock not divided from USB clock db b'00001101' ;CONFIG2L ; 0------- two speed startup disabled ; -0------ failsafe clock monitor disabled ; --0----- don't drive clock on CLKO (unused with XTAL) ; ---01--- timer 1 oscillator set to low power ; -----101 HSPLL oscillator mode (XTAL with PLL) db b'11111111' ;CONFIG2H ; 1111---- unused ; ----1111 watchdog timer prescaler divides by 32768 db b'11110101' ;CONFIG3L ; 1111---- deep sleep watchdog maximum postscaler ; ----0--- deep sleep watchdog disabled ; -----1-- brownout reset enabled in deep sleep ; ------0- real time clock uses INTRC as source ; -------1 deep sleep watchdog uses INTRC for clock db b'11111101' ;CONFIG3H ; 1111---- unused ; ----1--- select MSSP 8 bit adr mode, not 5 bit ; -----X-- unused ; ------0- select A/D 12 bit mode, not 10 bit ; -------1 pin select unlock only allowed once db b'11111111' ;CONFIG4L ; 1------- config words not write/erase protected ; -1111111 WPFP, write/erase page start/end (not used) db b'11111111' ;CONFIG4H ; 1111---- unused ; ----1--- indicate USB clock is 48 MHz ; -----X-- unused ; ------1- protect from WPFP to config words (not used} ; -------1 write protection disabled, WPFP ignored ; ; Sample for 16F630, 12F625, etc. ; __config b'11111110000100' ; XX------------ band gap cal, preserved by programmer ; --XXX--------- unused ; -----1-------- data EEPROM protection disabled ; ------1------- program memory code protection disabled ; -------0------ brownout detect disabled ; --------0----- MCLR disabled, RA3 is digital input ; ---------0---- power up timer enabled ; ----------0--- watchdog timer disabled ; -----------100 internal oscillator, RA4 is normal I/O pin osc_cal_call equ h'3FF' ;internal osc in use, adr of RETLW calibration value ;******************************************************************************* ; ; Global state. ; defram gbankadr ; ; Declare global flag bytes GFL0 - GFLn. The assembly constant ; NFLAGB is set to the number of these flag bytes by the /FLAG ; preprocessor directives in QQ2.INS.ASPIC. ; flags_define ;define the variables for the global flag bits ;******************************************************************************* ; ; Executable code. ; ; Reset vector. ; .reset code 0 clrf intcon ;disable all interrupts gjump relstart ;jump to relocatable startup code ; ; Relocatable code. ; ; This code only initializes the individual modules. The remaining ; system initialization is done in the QQ2_INIT module, which jumps ; to MAIN when done. ; .strt code relstart unbank ; ; Set the oscillator calibration value if this processor has one and ; we are using the internal oscillator. The constant OSC_CAL_CALL ; is defined in the processor configuration section if the internal ; oscillator is being used and the factory calibration value is ; stored in a RETLW instruction at a particular address. ; ifdef osc_cal_call ;internal oscillator being used, get value via RETLW setpage osc_cal_call ;set up for calling the specific address call osc_cal_call ;get the calibration value into W dbankif osccal movwf osccal ;adjust the oscillator to the factory calibrated value mypage ;restore paging state to this page endif ; ; Init the interrupt system to completely off and default configuration. ; ifdef intcon2 dbankif intcon2 movlw b'10000000' ; 1------- disable port B passive pullups ; -0000000 init interrupts to disabled movwf intcon2 ;init interrupts off to extent possible endif ifdef intcon3 dbankif intcon3 clrf intcon3 endif ; ; Make sure all interrupts are individually disabled. ; ifdef pie1 dbankif pie1 clrf pie1 endif ifdef pie2 dbankif pie2 clrf pie2 endif ifdef pie3 dbankif pie3 clrf pie3 endif ; ; Clear any existing interrupt conditions. ; ifdef pir1 dbankif pir1 clrf pir1 endif ifdef pir2 dbankif pir2 clrf pir2 endif ifdef pir3 dbankif pir3 clrf pir3 endif ; ; Init all interrupt priorities to the lowest priority. ; ifdef ipr1 dbankif ipr1 clrf ipr1 endif ifdef ipr2 dbankif ipr2 clrf ipr2 endif ifdef ipr3 dbankif ipr3 clrf ipr3 endif ifdef rcon dbankif rcon bcf rcon, ipen endif ; ; Initialize the global flag bits that are declared with /FLAG ; directives in the main include file. ; flags_clear ;initialize all global flag bits to 0 ; ; Initialize the separate modules. ; gcallnr stack_init ;init the software data stack gcallnr port_init ;init I/O ports gcallnr uart_init ;init serial I/O gcallnr cmd_init ;init host command processing gcallnr intr_init ;init interrupt management and enable interrupts ; ; All the individual modules have been initialized. Now start up the ; overall system. ; gjump init ;go to system initialization module end