3 * Config & Main routine.
4 * Copyright (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2,
10 * or (at your option) any later version.
11 * This library / program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this library; see the file COPYING. If not, write to the
18 * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21 * As a special exception, if you link this(includeed from sdcc) library
22 * with other files, some of which are compiled with SDCC,
23 * to produce an executable, this library does not by itself cause
24 * the resulting executable to be covered by the GNU General Public License.
25 * This exception does not however invalidate any other reasons why
26 * the executable file might be covered by the GNU General Public License.
36 #include <pic18fregs.h> /* ONLY FOR PIC18x */
48 #include "lcd_acm1602.h"
59 #if defined(pic18f23k22) || defined(pic18f24k22) || defined(pic18f25k22) || defined(pic18f26k22)
60 //#pragma stack 0x200 256 // Set stack size to 256bytes.
61 #pragma config FOSC=INTIO67,BORV=190,BOREN=ON,PWRTEN=ON
62 #pragma config WDTEN=ON,WDTPS=32768
63 #pragma config PBADEN=OFF,MCLRE=EXTMCLR,STVREN=ON,LVP=OFF,DEBUG=ON,XINST=ON
64 //#pragma config PBADEN=OFF,MCLRE=EXTMCLR,STVREN=ON,LVP=OFF//,XINST=ON
65 #pragma config CP0=OFF,CP1=OFF,CPB=OFF,CPD=OFF
66 #pragma config WRT0=OFF,WRT1=OFF,WRTB=OFF,WRTC=OFF,WRTD=OFF
67 #pragma config EBTR0=OFF,EBTR1=OFF,EBTRB=OFF
69 // For 4xK20 or 2xK20 Series
71 #if defined(pic18f43k20) || defined(pic18f44k20) || defined(pic18f45k20) || defined(pic18f46k20) || \
72 defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20)
74 #pragma stack 0x200 256
75 #pragma config FOSC=HS,FCMEN=ON,PWRT=ON,BOREN=NOSLP,BORV=27, \
76 WDTEN=ON,WDTPS=32768,PBADEN=OFF,HFOFST=ON,LPT1OSC=OFF, \
77 MCLRE=ON,STVREN=ON,DEBUG=ON, \
79 //#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
80 //#pragma config CPB=OFF,CPD=OFF
81 //#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
82 //#pragma config WRTC=OFF,WRTB=OFF,WRTD=OFF
83 //#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF
91 unsigned char stereoflag;
92 unsigned char tuneflag;
93 unsigned char cnrlevel;
95 unsigned int batlevel_6955;
96 unsigned int battlevel;
99 int backlight_counter;
100 unsigned char backlight_level;
101 unsigned char pollkeybuf[33];
103 //#define _LCD_DEBUG 1
105 void TMR0_handler(void)
107 SIGHANDLER(TMR0_handler)
112 T0CONbits.TMR0ON = 0;
114 // Clear interrupt flag
115 INTCONbits.TMR0IF = 0;
116 INTCONbits.TMR0IE = 0;;
121 * Interrupt wake up every 1ms.
124 void TMR3_Handler(void)
126 SIGHANDLER(TMR3_Handler)
131 T3CONbits.TMR3ON = 0;
135 void EXINT_Handler(void)
137 SIGHANDLER(EXINT_Handler)
140 INTCONbits.INT0IE = 0;
141 INTCONbits.INT0IF = 0;
142 INTCON3bits.INT1IF = 0;
143 INTCON3bits.INT2IF = 0;
144 INTCON3bits.INT1IE = 0;
145 INTCON3bits.INT2IE = 0;
149 void RBIF_handler(void)
151 SIGHANDLER(RBIF_handler)
155 // if(chk_powerbutton(0, 0) != 0) { // If pressed on
160 void EEPROM_handler(void)
162 SIGHANDLER(EEPROM_handler)
167 // if(chk_powerbutton(0, 0) != 0) { // If pressed on
173 void INADC_handler(void)
175 SIGHANDLER(INADC_handler)
181 // battlevel = adc_rawtobatt(a);
185 void I2C_handler(void)
187 SIGHANDLER(I2C_handler)
193 void I2CBus_handler(void)
195 SIGHANDLER(I2CBus_handler)
204 DEF_INTLOW(intlow_handler)
205 DEF_HANDLER(SIG_TMR0, TMR0_handler)
206 DEF_HANDLER(SIG_INT0, EXINT_Handler)
207 // DEF_HANDLER(SIG_TMR3, I2C_handler)
210 DEF_INTHIGH(inthigh_handler)
211 DEF_HANDLER(SIG_RBIF, RBIF_handler)
212 DEF_HANDLER(SIG_EEIF, EEPROM_handler)
213 DEF_HANDLER(SIG_TMR3, TMR3_Handler)
214 DEF_HANDLER(SIG_TMR0, TMR0_handler)
215 DEF_HANDLER(SIG_INT1, EXINT_Handler)
216 DEF_HANDLER(SIG_INT2, EXINT_Handler)
217 DEF_HANDLER(SIG_AD, INADC_handler)
218 //DEF_HANDLER(SIG_SSP, I2C_handler)
219 //DEF_HANDLER(SIG_BCOL, I2CBus_handler)
222 void interrupt low_priority isr(void)
224 if(INTCONbits.T0IF) TMR0_handler();
225 if(INTCONbits.INT0F) EXINT_Handler();
227 void interrupt isr_high(void)
229 if(INTCONbits.RBIF) RBIF_handler();
230 if(PIR2bits.EEIF) EEPROM_handler();
231 if(PIR2bits.TMR3IF) TMR3_Handler();
232 if(INTCONbits.TMR0IF) TMR0_handler();
233 if(INTCON3bits.INT1F || INTCON3bits.INT2IF) EXINT_Handler();
234 if(PIR1bits.ADIF) INADC_handler();
242 // idle_time_ms(100);
243 printhelp_2lines("Low battery X)", "Press key to suspend");
250 unsigned int sum = 0;
251 unsigned char pbutton;
252 unsigned char reset_status;
256 OSCCON = (0x80 & 0b11111100) | 0b00111000;
258 OSCCON = (_OSCCON_IDLEN_MASK & 0b11111100 ) | 0b00111000;
264 WDTCONbits.SWDTEN = 0; // WDT OFF.
265 reset_status = chk_reset();
266 idle_time_ms(300); // Wait for setup.
268 switch(reset_status){
270 power_off(0); // When press reset, state to power_off.
272 case RESET_WDT: // Workaround random reset.
276 power_off(0); // Save and halt on BOR.
278 case RESET_SOFTWARE: //
280 pbutton = chk_powerbutton();
282 if(pbutton == 0) power_off(0); // Button not pressed.
283 } while(pbutton == 0);
289 WDTCONbits.SWDTEN = 1; // WDT ON.
297 acm1602_init(0xa0, 1); //Init LCD
299 _LOCATE(0,0); // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
302 printstr("Hello;-)");
303 lcd_setbacklight(0xff, 255);
308 /* Push default parameters to AKC6955*/
313 // batlevel_6955 = 330;
319 lcd_setbacklight(0xff, 255);
321 // if(battlevel <= 408) { // 4.80*0.85
326 c = pollkeys(pollkeybuf, 60, 1);
330 setfreq_updown(pollkeybuf[p]);
335 c = pollkey_single();
338 // idle_time_ms(ui_idlecount);
341 pbutton = chk_powerbutton();
342 if(pbutton != 0) shutdown(1); // Button pressed.
344 if(backlight_counter > 0) {
346 lcd_setbacklight(0xff, backlight_level); // Turn ON
348 lcd_setbacklight(0x00, 0); // Turn OFF