void idle(unsigned int initial)
{
- unsigned int i;
+ unsigned int i;
WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
/* Enable IDLE */
/* Set TMR0 for interrupt*/
#include "adc_int.h"
#include "i2c_eeprom.h"
#include "backlight.h"
+#include "rencoder.h"
/*
* Config words.
* Interrupt wake up every 1ms.
*/
#ifdef __XC
-void TMR3_Handler(void)
+void TMR1_Handler(void)
#else
-SIGHANDLER(TMR3_Handler)
+SIGHANDLER(TMR1_Handler)
#endif
{
- PIR2bits.TMR3IF = 0;
- PIE2bits.TMR3IE = 0;
- T3CONbits.TMR3ON = 0;
+ rencoder_count();
+// rencoder_restart();
+ T1CON = 0b10110100;// RD16, T1RUN=0, 1/32 fOSC, TNR1CS=0, TMR1ON=0;
+ TMR1H = 63036 >> 8; // Tick = 4us, Count = 2500
+ TMR1L = 63036 & 255;
+ PIR1bits.TMR1IF = 0;
+ PIE1bits.TMR1IE = 1;
+ IPR1bits.TMR1IP = 1;
+ T1CONbits.TMR1ON = 1;
}
#ifdef __XC
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_TMR1, I2C_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_TMR1, TMR1_Handler)
DEF_HANDLER(SIG_INT1, EXINT_Handler)
DEF_HANDLER(SIG_INT2, EXINT_Handler)
DEF_HANDLER(SIG_AD, INADC_handler)
{
if(INTCONbits.RBIF) RBIF_handler();
if(PIR2bits.EEIF) EEPROM_handler();
- if(PIR2bits.TMR3IF) TMR3_Handler();
+ if(PIR1bits.TMR1IF) TMR1_Handler();
// if(INTCONbits.TMR0IF) TMR0_handler();
- if(INTCON3bits.INT1IF) EXINT_Handler();
- if(INTCON3bits.INT2IF) EXINT_Handler();
+// if(INTCON3bits.INT1IF) EXINT_Handler();
+// if(INTCON3bits.INT2IF) EXINT_Handler();
if(PIR1bits.ADIF) INADC_handler();
// if(PIR1bits.SSPIF) I2C_handler();
ClrWdt();
ui_idlekey = setup.ui_idlecount / 92;
ui_idlepad = setup.ui_idlecount % 23;
-
+ rencoder_start();
do {
+
#if 1
if(battlevel < 340) { // 3.4V
lvcount++;
}
#endif
/* Main routine*/
+
+
for(i = 0; i < 4; i++) {
c = pollkey_single_timeout(ui_idlekey, 1); // 23*41 = 943ms
p = 0;
acm1602_resume(LCD_I2CADDR);
dispf = 0xff;
}
+ rencoder_stop();
setfreq_updown(c);
update_status();
update_display();
+ rencoder_start();
}
+ if(renc_dir == RENC_LEFT) {
+ akc6955_down_freq(renc_count);
+ rencoder_init();
+ } else if(renc_dir == RENC_RIGHT) {
+ akc6955_up_freq(renc_count);
+ rencoder_init();
+ }
ClrWdt();
}
update_status();
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE}
# Source Files Quoted if spaced
-SOURCEFILES_QUOTED_IF_SPACED=ui.c i2c_io.c main.c idle.c lcd_acm1602.c akc6955.c eeprom.c ioports.c menu.c power.c adc_int.c menu_defs.c eepromutil.c ui_updown.c ui_display.c radio_getstat.c helps.c menu_memoryfreq.c i2c_eeprom.c backlight.c menu_scan.c menu_setup.c menu_userband.c menu_volume.c
+SOURCEFILES_QUOTED_IF_SPACED=ui.c i2c_io.c main.c idle.c lcd_acm1602.c akc6955.c eeprom.c ioports.c menu.c power.c adc_int.c menu_defs.c eepromutil.c ui_updown.c ui_display.c radio_getstat.c helps.c menu_memoryfreq.c i2c_eeprom.c backlight.c menu_scan.c menu_setup.c menu_userband.c menu_volume.c rencoder.c
# Object Files Quoted if spaced
-OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/ui.p1 ${OBJECTDIR}/i2c_io.p1 ${OBJECTDIR}/main.p1 ${OBJECTDIR}/idle.p1 ${OBJECTDIR}/lcd_acm1602.p1 ${OBJECTDIR}/akc6955.p1 ${OBJECTDIR}/eeprom.p1 ${OBJECTDIR}/ioports.p1 ${OBJECTDIR}/menu.p1 ${OBJECTDIR}/power.p1 ${OBJECTDIR}/adc_int.p1 ${OBJECTDIR}/menu_defs.p1 ${OBJECTDIR}/eepromutil.p1 ${OBJECTDIR}/ui_updown.p1 ${OBJECTDIR}/ui_display.p1 ${OBJECTDIR}/radio_getstat.p1 ${OBJECTDIR}/helps.p1 ${OBJECTDIR}/menu_memoryfreq.p1 ${OBJECTDIR}/i2c_eeprom.p1 ${OBJECTDIR}/backlight.p1 ${OBJECTDIR}/menu_scan.p1 ${OBJECTDIR}/menu_setup.p1 ${OBJECTDIR}/menu_userband.p1 ${OBJECTDIR}/menu_volume.p1
-POSSIBLE_DEPFILES=${OBJECTDIR}/ui.p1.d ${OBJECTDIR}/i2c_io.p1.d ${OBJECTDIR}/main.p1.d ${OBJECTDIR}/idle.p1.d ${OBJECTDIR}/lcd_acm1602.p1.d ${OBJECTDIR}/akc6955.p1.d ${OBJECTDIR}/eeprom.p1.d ${OBJECTDIR}/ioports.p1.d ${OBJECTDIR}/menu.p1.d ${OBJECTDIR}/power.p1.d ${OBJECTDIR}/adc_int.p1.d ${OBJECTDIR}/menu_defs.p1.d ${OBJECTDIR}/eepromutil.p1.d ${OBJECTDIR}/ui_updown.p1.d ${OBJECTDIR}/ui_display.p1.d ${OBJECTDIR}/radio_getstat.p1.d ${OBJECTDIR}/helps.p1.d ${OBJECTDIR}/menu_memoryfreq.p1.d ${OBJECTDIR}/i2c_eeprom.p1.d ${OBJECTDIR}/backlight.p1.d ${OBJECTDIR}/menu_scan.p1.d ${OBJECTDIR}/menu_setup.p1.d ${OBJECTDIR}/menu_userband.p1.d ${OBJECTDIR}/menu_volume.p1.d
+OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/ui.p1 ${OBJECTDIR}/i2c_io.p1 ${OBJECTDIR}/main.p1 ${OBJECTDIR}/idle.p1 ${OBJECTDIR}/lcd_acm1602.p1 ${OBJECTDIR}/akc6955.p1 ${OBJECTDIR}/eeprom.p1 ${OBJECTDIR}/ioports.p1 ${OBJECTDIR}/menu.p1 ${OBJECTDIR}/power.p1 ${OBJECTDIR}/adc_int.p1 ${OBJECTDIR}/menu_defs.p1 ${OBJECTDIR}/eepromutil.p1 ${OBJECTDIR}/ui_updown.p1 ${OBJECTDIR}/ui_display.p1 ${OBJECTDIR}/radio_getstat.p1 ${OBJECTDIR}/helps.p1 ${OBJECTDIR}/menu_memoryfreq.p1 ${OBJECTDIR}/i2c_eeprom.p1 ${OBJECTDIR}/backlight.p1 ${OBJECTDIR}/menu_scan.p1 ${OBJECTDIR}/menu_setup.p1 ${OBJECTDIR}/menu_userband.p1 ${OBJECTDIR}/menu_volume.p1 ${OBJECTDIR}/rencoder.p1
+POSSIBLE_DEPFILES=${OBJECTDIR}/ui.p1.d ${OBJECTDIR}/i2c_io.p1.d ${OBJECTDIR}/main.p1.d ${OBJECTDIR}/idle.p1.d ${OBJECTDIR}/lcd_acm1602.p1.d ${OBJECTDIR}/akc6955.p1.d ${OBJECTDIR}/eeprom.p1.d ${OBJECTDIR}/ioports.p1.d ${OBJECTDIR}/menu.p1.d ${OBJECTDIR}/power.p1.d ${OBJECTDIR}/adc_int.p1.d ${OBJECTDIR}/menu_defs.p1.d ${OBJECTDIR}/eepromutil.p1.d ${OBJECTDIR}/ui_updown.p1.d ${OBJECTDIR}/ui_display.p1.d ${OBJECTDIR}/radio_getstat.p1.d ${OBJECTDIR}/helps.p1.d ${OBJECTDIR}/menu_memoryfreq.p1.d ${OBJECTDIR}/i2c_eeprom.p1.d ${OBJECTDIR}/backlight.p1.d ${OBJECTDIR}/menu_scan.p1.d ${OBJECTDIR}/menu_setup.p1.d ${OBJECTDIR}/menu_userband.p1.d ${OBJECTDIR}/menu_volume.p1.d ${OBJECTDIR}/rencoder.p1.d
# Object Files
-OBJECTFILES=${OBJECTDIR}/ui.p1 ${OBJECTDIR}/i2c_io.p1 ${OBJECTDIR}/main.p1 ${OBJECTDIR}/idle.p1 ${OBJECTDIR}/lcd_acm1602.p1 ${OBJECTDIR}/akc6955.p1 ${OBJECTDIR}/eeprom.p1 ${OBJECTDIR}/ioports.p1 ${OBJECTDIR}/menu.p1 ${OBJECTDIR}/power.p1 ${OBJECTDIR}/adc_int.p1 ${OBJECTDIR}/menu_defs.p1 ${OBJECTDIR}/eepromutil.p1 ${OBJECTDIR}/ui_updown.p1 ${OBJECTDIR}/ui_display.p1 ${OBJECTDIR}/radio_getstat.p1 ${OBJECTDIR}/helps.p1 ${OBJECTDIR}/menu_memoryfreq.p1 ${OBJECTDIR}/i2c_eeprom.p1 ${OBJECTDIR}/backlight.p1 ${OBJECTDIR}/menu_scan.p1 ${OBJECTDIR}/menu_setup.p1 ${OBJECTDIR}/menu_userband.p1 ${OBJECTDIR}/menu_volume.p1
+OBJECTFILES=${OBJECTDIR}/ui.p1 ${OBJECTDIR}/i2c_io.p1 ${OBJECTDIR}/main.p1 ${OBJECTDIR}/idle.p1 ${OBJECTDIR}/lcd_acm1602.p1 ${OBJECTDIR}/akc6955.p1 ${OBJECTDIR}/eeprom.p1 ${OBJECTDIR}/ioports.p1 ${OBJECTDIR}/menu.p1 ${OBJECTDIR}/power.p1 ${OBJECTDIR}/adc_int.p1 ${OBJECTDIR}/menu_defs.p1 ${OBJECTDIR}/eepromutil.p1 ${OBJECTDIR}/ui_updown.p1 ${OBJECTDIR}/ui_display.p1 ${OBJECTDIR}/radio_getstat.p1 ${OBJECTDIR}/helps.p1 ${OBJECTDIR}/menu_memoryfreq.p1 ${OBJECTDIR}/i2c_eeprom.p1 ${OBJECTDIR}/backlight.p1 ${OBJECTDIR}/menu_scan.p1 ${OBJECTDIR}/menu_setup.p1 ${OBJECTDIR}/menu_userband.p1 ${OBJECTDIR}/menu_volume.p1 ${OBJECTDIR}/rencoder.p1
# Source Files
-SOURCEFILES=ui.c i2c_io.c main.c idle.c lcd_acm1602.c akc6955.c eeprom.c ioports.c menu.c power.c adc_int.c menu_defs.c eepromutil.c ui_updown.c ui_display.c radio_getstat.c helps.c menu_memoryfreq.c i2c_eeprom.c backlight.c menu_scan.c menu_setup.c menu_userband.c menu_volume.c
+SOURCEFILES=ui.c i2c_io.c main.c idle.c lcd_acm1602.c akc6955.c eeprom.c ioports.c menu.c power.c adc_int.c menu_defs.c eepromutil.c ui_updown.c ui_display.c radio_getstat.c helps.c menu_memoryfreq.c i2c_eeprom.c backlight.c menu_scan.c menu_setup.c menu_userband.c menu_volume.c rencoder.c
CFLAGS=
@-${MV} ${OBJECTDIR}/menu_volume.d ${OBJECTDIR}/menu_volume.p1.d
@${FIXDEPS} ${OBJECTDIR}/menu_volume.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
+${OBJECTDIR}/rencoder.p1: rencoder.c nbproject/Makefile-${CND_CONF}.mk
+ @${MKDIR} ${OBJECTDIR}
+ @${RM} ${OBJECTDIR}/rencoder.p1.d
+ @${RM} ${OBJECTDIR}/rencoder.p1
+ ${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --emi=wordwrite --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-download,-config,+clib,+plib --output=-mcof,+elf "--errformat=%f:%l: error: %s" "--warnformat=%f:%l: warning: %s" "--msgformat=%f:%l: advisory: %s" -o${OBJECTDIR}/rencoder.p1 rencoder.c
+ @-${MV} ${OBJECTDIR}/rencoder.d ${OBJECTDIR}/rencoder.p1.d
+ @${FIXDEPS} ${OBJECTDIR}/rencoder.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
+
else
${OBJECTDIR}/ui.p1: ui.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} ${OBJECTDIR}
@-${MV} ${OBJECTDIR}/menu_volume.d ${OBJECTDIR}/menu_volume.p1.d
@${FIXDEPS} ${OBJECTDIR}/menu_volume.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
+${OBJECTDIR}/rencoder.p1: rencoder.c nbproject/Makefile-${CND_CONF}.mk
+ @${MKDIR} ${OBJECTDIR}
+ @${RM} ${OBJECTDIR}/rencoder.p1.d
+ @${RM} ${OBJECTDIR}/rencoder.p1
+ ${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --double=24 --float=24 --emi=wordwrite --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=require --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-download,-config,+clib,+plib --output=-mcof,+elf "--errformat=%f:%l: error: %s" "--warnformat=%f:%l: warning: %s" "--msgformat=%f:%l: advisory: %s" -o${OBJECTDIR}/rencoder.p1 rencoder.c
+ @-${MV} ${OBJECTDIR}/rencoder.d ${OBJECTDIR}/rencoder.p1.d
+ @${FIXDEPS} ${OBJECTDIR}/rencoder.p1.d $(SILENT) -rsi ${MP_CC_DIR}../
+
endif
# ------------------------------------------------------------------------------------
#
-#Sun Oct 20 21:11:40 JST 2013
+#Mon Oct 21 01:29:40 JST 2013
default.languagetoolchain.dir=/opt/microchip/xc8/v1.21/bin
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=0d2b1469ad71adb787c711a416386331
default.languagetoolchain.version=1.21
<itemPath>menu_volume.c</itemPath>
<itemPath>eeprom_util.h</itemPath>
<itemPath>menu_ui.h</itemPath>
+ <itemPath>rencoder.c</itemPath>
+ <itemPath>rencoder.h</itemPath>
</logicalFolder>
<sourceRootList>
<Elem>/usr/local/share/sdcc/lib/src/pic16/libc</Elem>
<defaultConf>0</defaultConf>
<confs>
<conf name="default" type="2">
- <platformToolSN>:=MPLABCommUSB:=04D8:=900A:=0002:=Microchip Technology Inc.:=PICkit 3:=DEFAULT_PK3 :=x:=en</platformToolSN>
+ <platformToolSN></platformToolSN>
<languageToolchainDir>/opt/microchip/xc8/v1.21/bin</languageToolchainDir>
<mdbdebugger version="1">
<placeholder1>place holder 1</placeholder1>
// batlevel_6955 = akc6955_get_battery();
//ADC:reference
- CVRCON2bits.FVREN = 1;
- while(CVRCON2bits.FVRST == 0) idle(100);
// Workaround of Errata:
// Section 5 of http://ww1.microchip.com/downloads/en/DeviceDoc/80000425K.pdf .
// Sample twice on first.
startadc(_REF_ADC);
ref = polladc2();
TRISEbits.TRISE2 = 1;
- startadc(_BATT_ADC);
- adc = polladc2();
+ CVRCON2bits.FVREN = 1;
+ while(CVRCON2bits.FVRST == 0) idle(100);
+// startadc(_BATT_ADC);
+// adc = polladc2();
startadc(_BATT_ADC);
adc = polladc2();
CVRCON2bits.FVREN = 0;
--- /dev/null
+/*
+ * OpenI2CRADIO
+ * Rotary encoder routine.
+ * Copyright (C) 2013-10-21 K.Ohta <whatisthis.sowhat ai gmail.com>
+ * License: GPL2+LE
+ *
+ * This program 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 2,
+ * or (at your option) any later version.
+ * This library / program 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 this library; see the file COPYING. If not, write to the
+ * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * As a special exception, if you link this(includeed from sdcc) library
+ * with other files, some of which are compiled with SDCC,
+ * to produce an executable, this library does not by itself cause
+ * the resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ */
+#include "rencoder.h"
+
+unsigned char renc_state_a;
+unsigned char renc_state_b;
+unsigned char renc_dir;
+unsigned char renc_count;
+unsigned char renc_reset_count;
+
+void rencoder_up(unsigned char dir)
+{
+ if(dir == RENC_NONE) return;
+ if(dir == renc_dir) {
+ renc_count++;
+ } else {
+ renc_count = 0;
+ renc_dir = dir;
+ }
+}
+
+void rencoder_init(void)
+{
+ RENC_TRIS_A = 1;
+ RENC_TRIS_B = 1;
+ renc_count = 0;
+ renc_dir = RENC_NONE;
+ renc_state_a = 0;
+ renc_state_b = 0;
+ renc_reset_count = 0;
+}
+
+
+void rencoder_restart(void)
+{
+}
+
+void rencoder_start(void)
+{
+ T1CON = 0b10110100;// RD16, T1RUN=0, 1/32 fOSC, TNR1CS=0, TMR1ON=0;
+ TMR1H = 63036 >> 8; // Tick = 4us, Count = 2500
+ TMR1L = 63036 & 255;
+ PIR1bits.TMR1IF = 0;
+ PIE1bits.TMR1IE = 1;
+ IPR1bits.TMR1IP = 1;
+ T1CONbits.TMR1ON = 1;
+ rencoder_init();
+}
+
+void rencoder_stop(void)
+{
+ T1CON = 0b10110100;
+ TMR1H = 0;
+ TMR1L = 0;
+ PIR1bits.TMR1IF = 0;
+ PIE1bits.TMR1IE = 0;
+ IPR1bits.TMR1IP = 1;
+ rencoder_init();
+}
+
+
+void rencoder_count(void)
+{
+ unsigned char dir = 0;
+
+ if(RENC_PH_B != 0) {
+ if(renc_state_a != 0){
+ if(RENC_PH_A == 0) {
+ dir = RENC_RIGHT;
+ }
+ } else {
+ if(RENC_PH_A != 0) {
+ dir = RENC_LEFT;
+ }
+ }
+ }
+ if(dir != RENC_NONE) {
+ if(dir == renc_dir) {
+ renc_count++;
+ } else {
+ renc_count = 0;
+ renc_dir = dir;
+ }
+ renc_reset_count = 0;
+ } else{
+ renc_reset_count++;
+ if(renc_reset_count >= 100) { // 1000ms
+ renc_count = 0;
+ renc_dir = RENC_NONE;
+ renc_state_a = 0;
+ renc_state_b = 0;
+ renc_reset_count = 0;
+ }
+ }
+
+
+// rencoder_up(dir);
+ renc_state_a = RENC_PH_A;
+ renc_state_b = RENC_PH_B;
+}
+
+
+
--- /dev/null
+/*
+ * OpenI2CRADIO
+ * Rotary encoder routine(Header).
+ * Copyright (C) 2013-10-21 K.Ohta <whatisthis.sowhat ai gmail.com>
+ * License: GPL2+LE
+ *
+ * This program 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 2,
+ * or (at your option) any later version.
+ * This library / program 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 this library; see the file COPYING. If not, write to the
+ * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * As a special exception, if you link this(includeed from sdcc) library
+ * with other files, some of which are compiled with SDCC,
+ * to produce an executable, this library does not by itself cause
+ * the resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ */
+
+#if defined(__SDCC)
+#include <sdcc-lib.h>
+#include <pic18fregs.h> /* ONLY FOR PIC18x */
+#include <delay.h>
+#else
+#include <xc.h>
+#endif
+
+#include "iodef.h"
+
+#define RENC_PH_A PORTBbits.RB5
+#define RENC_PH_B PORTCbits.RC5
+#define RENC_TRIS_A TRISBbits.TRISB5
+#define RENC_TRIS_B TRISCbits.TRISC5
+#define RENC_NONE 0x00
+#define RENC_LEFT 0x7f
+#define RENC_RIGHT 0xff
+
+extern unsigned char renc_state_a;
+extern unsigned char renc_state_b;
+extern unsigned char renc_dir;
+extern unsigned char renc_count;
+
+extern void rencoder_up(unsigned char dir);
+extern void rencoder_init(void);
+extern void rencoder_count(void);
+extern void rencoder_start(void);
+extern void rencoder_restart(void);
+extern void rencoder_stop(void);
+