#include "menu.h"
#include "power.h"
#include "adc_int.h"
+#include "i2c_eeprom.h"
+#include "backlight.h"
+#include "rencoder.h"
+#include "euart.h"
+#include "uart_termio.h"
+#include "shell_strutl.h"
+#include "term_shell.h"
/*
* Config words.
#pragma config EBTR0=OFF,EBTR1=OFF,EBTRB=OFF
#endif
// For 4xK20 or 2xK20 Series
-#if defined(__SDCC)
#if defined(pic18f43k20) || defined(pic18f44k20) || defined(pic18f45k20) || defined(pic18f46k20) || \
- defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20)
+ defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20) || \
+ defined(_18F43K20) || defined(_18F44K20) || defined(_18F45K20) || defined(_18F46K20) || \
+ defined(_18F23K20) || defined(_18F24K20) || defined(_18F25K20) || defined(_18F26K20)
+#ifdef __SDCC
#pragma stack 0x200 256
+#endif
+
#pragma config FOSC=HS,FCMEN=ON,PWRT=ON,BOREN=NOSLP,BORV=27, \
WDTEN=ON,WDTPS=32768,PBADEN=OFF,HFOFST=OFF,LPT1OSC=OFF, \
- MCLRE=ON,STVREN=ON,DEBUG=ON, \
+ MCLRE=ON,STVREN=ON,DEBUG=ON,LVP=OFF, \
XINST=OFF
-//#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
-//#pragma config CPB=OFF,CPD=OFF
-//#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
-//#pragma config WRTC=OFF,WRTB=OFF,WRTD=OFF
-//#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF
#endif
-#elif defined(__XC8)
-#endif
+
/*
* Statuses
*/
int diffstat;
unsigned int batlevel_6955;
unsigned int battlevel;
+unsigned char ui_idlekey;
+unsigned char ui_idlepad;
int recv_signal;
-int backlight_counter;
-unsigned char backlight_level;
unsigned char pollkeybuf[33];
//#define _LCD_DEBUG 1
T0CONbits.TMR0ON = 0;
// Clear interrupt flag
- INTCONbits.TMR0IF = 0;
+// INTCONbits.TMR0IF = 0;
INTCONbits.TMR0IE = 0;;
return;
* Interrupt wake up every 1ms.
*/
#ifdef __XC
+void TMR1_Handler(void)
+#else
+SIGHANDLER(TMR1_Handler)
+#endif
+{
+// rencoder_count();
+ rencoder_tmrhook();
+}
+
+#ifdef __XC
void TMR3_Handler(void)
#else
SIGHANDLER(TMR3_Handler)
#endif
{
- PIR2bits.TMR3IF = 0;
- PIE2bits.TMR3IE = 0;
- T3CONbits.TMR3ON = 0;
+ PIR2bits.TMR3IF = 0;
+ PIE2bits.TMR3IE = 0;
+ IPR2bits.TMR3IP = 0;
}
#ifdef __XC
SIGHANDLER(RBIF_handler)
#endif
{
- power_on_inthook();
-// if(chk_powerbutton(0, 0) != 0) { // If pressed on
-// power_off(1); //
-// }
+ if(IOCBbits.IOCB4 != 0) {
+ power_on_inthook();
+ } else {
+ rencoder_inthook();
+ }
}
#ifdef __XC
-void EEPROM_handler(void)
+void EEPROM_handler(void)
#else
SIGHANDLER(EEPROM_handler)
#endif
// if(a != 0xffff) {
// battlevel = adc_rawtobatt(a);
// }
+ PIR1bits.ADIF = 0;
}
#ifdef __XC
void I2C_handler(void)
PIR2bits.BCLIF = 0;
}
+#ifdef __XC
+void UART_R_Handler(void)
+#else
+SIGHANDLER(UART_R_Handler)
+#endif
+{
+ uart_inthdr_rx();
+}
#ifdef __SDCC
DEF_INTLOW(intlow_handler)
DEF_HANDLER(SIG_TMR0, TMR0_handler)
DEF_HANDLER(SIG_INT0, EXINT_Handler)
-// DEF_HANDLER(SIG_TMR3, I2C_handler)
+// DEF_HANDLER(SIG_TMR3, TMR3_Handler)
END_DEF
DEF_INTHIGH(inthigh_handler)
- DEF_HANDLER(SIG_RBIF, RBIF_handler)
- DEF_HANDLER(SIG_EEIF, EEPROM_handler)
- DEF_HANDLER(SIG_TMR3, TMR3_Handler)
- DEF_HANDLER(SIG_TMR0, TMR0_handler)
- DEF_HANDLER(SIG_INT1, EXINT_Handler)
- DEF_HANDLER(SIG_INT2, EXINT_Handler)
- DEF_HANDLER(SIG_AD, INADC_handler)
+ DEF_HANDLER(SIG_RBIF, RBIF_handler)
+ DEF_HANDLER(SIG_RCIF, UART_R_handler)
+// DEF_HANDLER(SIG_TMR1, TMR1_Handler)
+// DEF_HANDLER(SIG_INT1, EXINT_Handler)
+ DEF_HANDLER(SIG_INT2, EXINT_Handler)
+ DEF_HANDLER(SIG_AD, INADC_handler)
//DEF_HANDLER(SIG_SSP, I2C_handler)
//DEF_HANDLER(SIG_BCOL, I2CBus_handler)
END_DEF
#else
-void interrupt low_priority isr(void)
+void interrupt low_priority intlow_handler(void)
{
- if(INTCONbits.T0IF) TMR0_handler();
- if(INTCONbits.INT0F) EXINT_Handler();
+ if(INTCONbits.TMR0IF) TMR0_handler();
+ if(INTCONbits.INT0IF) EXINT_Handler();
+// if(PIR1bits.TMR1IF) TMR1_Handler();
}
-void interrupt isr_high(void)
+
+void interrupt high_priority inthigh_handler(void)
{
- if(INTCONbits.RBIF) RBIF_handler();
- if(PIR2bits.EEIF) EEPROM_handler();
- if(PIR2bits.TMR3IF) TMR3_Handler();
- if(INTCONbits.TMR0IF) TMR0_handler();
- if(INTCON3bits.INT1F || INTCON3bits.INT2IF) EXINT_Handler();
+ if(INTCONbits.RBIF) RBIF_handler();
+ if(PIR1bits.TMR1IF) TMR1_Handler();
+ if(PIR1bits.RC1IF) UART_R_Handler();
+// if(PIR2bits.TMR3IF) TMR3_Handler();
+// if(INTCON3bits.INT1IF) EXINT_Handler();
+// if(INTCON3bits.INT2IF) EXINT_Handler();
if(PIR1bits.ADIF) INADC_handler();
+
+// if(PIR1bits.SSPIF) I2C_handler();
}
+
+#ifdef __XC
+
+
+#endif
#endif
shutdown(1);
}
+
int main(void)
{
unsigned char c;
- unsigned int sum = 0;
unsigned char pbutton;
unsigned char reset_status;
unsigned char p;
-
-#ifdef __SDCC
+ unsigned char lvcount = 0;
+ unsigned char dispf = 0xff;
+ unsigned char i;
+ unsigned int step;
+
OSCCON = (0x80 & 0b11111100) | 0b00111000;
// OSCCON = (0x80 & 0b11111100) | 0b00110010; // 8MHz
-#else
- OSCCON = (_OSCCON_IDLEN_MASK & 0b11111100 ) | 0b00111000;
-#endif
idle_init();
keyin_init();
keyin_ioinit();
-
- WDTCONbits.SWDTEN = 0; // WDT OFF.
+ i2c1_init();
reset_status = chk_reset();
idle_time_ms(300); // Wait for setup.
-#if 1
+ WDTCONbits.SWDTEN = 0; // WDT OFF.
switch(reset_status){
case RESET_MCLR:
- power_off(0); // When press reset, state to power_off.
- break;
- case RESET_WDT: // Workaround random reset.
- power_off(0);
- break;
case RESET_BOR:
- power_off(0); // Save and halt on BOR.
+ shutdown(0); // Save and halt on BOR.
break;
case RESET_SOFTWARE: //
-// do {
-// pbutton = chk_powerbutton();
-// ClrWdt();
- // if(pbutton == 0) power_off(0); // Button not pressed.
-// } while(pbutton == 0);
+ RCONbits.RI = 0;
+ pbutton = chk_powerbutton();
+ if(pbutton == 0) shutdown(0); // Not-Pressed power-button -> shutdown( not save).
+ break;
+ case RESET_POR:
+ case RESET_WDT: // Workaround random reset.
+ // shutdown(0);
break;
default:
break;
}
-#endif
WDTCONbits.SWDTEN = 1; // WDT ON.
- i2c1_init();
power_on(1);
- intadc_init();
- set_powerlamp(1);
- idle_time_ms(125);
+ //intadc_init();
valinit();
-
- acm1602_init(0xa0, 1); //Init LCD
- idle_time_ms(125);
- _LOCATE(0,0); // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
- _PUTCHAR(' '); //
- _LOCATE(0,1);
- printstr("Hello;-)");
+ acm1602_init(LCD_I2CADDR, 1); //Init LCD
lcd_setbacklight(0xff, 255);
- idle_time_ms(1000);
- check_eeprom();
- // Init AKC6955
/* Check EEPROM */
- /* Push default parameters to AKC6955*/
+ check_eeprom();
+ /* Push default parameters to AKC6955*/
setup_akc6955();
_CLS();
- _LOCATE(0,0);
+ uart_init();
+ //_LOCATE(0,0);
_PUTCHAR(' ');
- // batlevel_6955 = 330;
- update_status();
- update_display();
+ update_status();
+ update_display();
ClrWdt();
-// _LOCATE(0,0);
-// printstr("OK");
- lcd_setbacklight(0xff, 255);
- do {
-// set_powerlamp(0);
- if(battlevel <= 340) { // 3.4V
- lowbatt();
+ ui_idlekey = setup.ui_idlecount / 92;
+ ui_idlepad = setup.ui_idlecount % 23;
+ rencoder_init();
+ rencoder_start();
+ do {
+
+ if(battlevel < 340) { // 3.4V
+ lvcount++;
+ if(lvcount > 4) {
+ if(dispf == 0) {
+ acm1602_resume(LCD_I2CADDR);
+ dispf = 0xff;
+ }
+ lowbatt(); //Zap 4Times on LowVoltage.
+ }
+ } else {
+ lvcount = 0;
}
/* Main routine*/
- c = pollkeys(pollkeybuf, 10, 1); // 23*10=230ms
- p = 0;
- while(c > 0) {
- ClrWdt();
- setfreq_updown(pollkeybuf[p]);
- c--;
- p++;
- }
-// set_powerlamp(1);
-// idle_time_ms(ui_idlecount);
- // Putstring to LCD.
- _LOCATE(0,0);
- pbutton = chk_powerbutton();
- if(pbutton != 0) shutdown(1); // Button pressed.
-
- if(backlight_counter > 0) {
- backlight_counter--;
- lcd_setbacklight(0xff, backlight_level); // Turn ON
- } else {
- lcd_setbacklight(0x00, 0); // Turn OFF
- }
- update_status();
-// ClrWdt();
- update_display();
- ClrWdt();
+
+ term_shell(0); // Steel Shell
+ for(i = 0; i < 4; i++) {
+ c = pollkey_single_timeout(ui_idlekey, 1); // 23*41 = 943ms
+ p = 0;
+ if(c != charcode_null) {
+ ClrWdt();
+ if(dispf == 0) {
+ acm1602_resume(LCD_I2CADDR);
+ dispf = 0xff;
+ }
+ setfreq_updown(c);
+ update_status();
+ update_display();
+ rencoder_start();
+ }
+ ClrWdt();
+ }
+ dispf = setfreq_renc_updown(dispf);
+ update_status();
+ dispf = backlight_dec(dispf);
+ if(dispf != 0) update_display();
+ if(ui_idlepad != 0) idle_time_ms(ui_idlepad);
+ ClrWdt();
} while(1);
}