* the executable file might be covered by the GNU General Public License.
*/
+#include "commondef.h"
#include "lcd_acm1602.h"
#include "power.h"
+#include "menu.h"
+#include "backlight.h"
/*
* Detect reset condition.
unsigned char chk_reset(void)
{
+#ifdef __SDCC
union {
- __RCONbits_t bit;
+ __RCONbits_t b;
unsigned char byte;
} rcon;
union {
- __STKPTRbits_t bit;
+ __STKPTRbits_t b;
unsigned char byte;
} stkptr;
-
+#else
+ union {
+ RCONbits_t b;
+ unsigned char byte;
+ } rcon;
+ union {
+ STKPTRbits_t b;
+ unsigned char byte;
+ } stkptr;
+#endif
rcon.byte = RCON;
stkptr.byte = STKPTR;
- RCON |= 0b01010011; // SBOREN,*RI,*POR,*BOR = '1'.
- if((rcon.bit.POR ==0) && (rcon.bit.BOR == 0)) {
+ if(rcon.b.POR ==0) {
+ RCONbits.POR = 1;
return RESET_POR;
}
- if(rcon.bit.BOR == 0) return RESET_BOR;
- if(rcon.bit.RI == 0) return RESET_SOFTWARE;
- if(rcon.bit.TO == 0) return RESET_WDT;
- if(rcon.bit.PD == 0) return RESET_POWERDOWN;
- if(stkptr.bit.STKFUL == 1) return RESET_STACK_FULL;
- if(stkptr.bit.STKFUL == 1) return RESET_STACK_UNDER;
+ if(rcon.b.BOR == 0) {
+ RCONbits.BOR = 1;
+ return RESET_BOR;
+ }
+ if(rcon.b.RI == 0) {
+ RCONbits.RI = 1;
+ return RESET_SOFTWARE;
+ }
+ if(rcon.b.TO == 0) return RESET_WDT;
+ if(rcon.b.PD == 0) return RESET_POWERDOWN;
+ if(stkptr.b.STKOVF) return RESET_STACK_FULL;
+ if(stkptr.b.STKUNF) return RESET_STACK_UNDER;
return RESET_MCLR;
}
void power_on_inthook(void)
{
+
IOCB = 0x00;
- IOCB |= 0x10; // IOCB4 ONLY.
- INTCON &= ~(_RBIF | _RBIE);
-// INTCON |= _GIE;
- INTCON |= (_GIE | _PEIE);
+// IOCBbits.IOCB4 = 1;
+ INTCONbits.RBIE = 0;
+ INTCONbits.GIE = 1;
+ INTCONbits.PEIE = 1;
}
void power_on(unsigned char f)
{
if(f == 0x00){
- set_examp_mute(1);
- idle_time_ms(200);
- set_radiopower(0);
+ set_radiopower(0x00);
+// idle_time_ms(200);
+ set_examp_mute(0xff);
} else {
- set_examp_mute(0);
+ set_examp_mute(0x00);
idle_time_ms(100);
- set_radiopower(1);
+ set_radiopower(0xff);
+ }
+}
+
+void rfamp_power(unsigned char b)
+{
+ __bitops_t bx;
+
+ bx.byte = b;
+ if(bx.b0) {
+ _RFAMP_SEL_B0 = 1;
+ } else {
+ _RFAMP_SEL_B0 = 0;
}
+ if(bx.b1) {
+ _RFAMP_SEL_B1 = 1;
+ } else {
+ _RFAMP_SEL_B1 = 0;
+ }
+
}
unsigned char chk_powerbutton(void)
{
unsigned char count = 0;
char i;
- for(i = 0; i < 16; i++) { // 2*16=64ms.
- if(PORTBbits.RB4 == 0) count++;
+
+ TRISBbits.RB4 = 1; // Set Input
+ for(i = 0; i < 24; i++) { // 2*24=48ms.
+ if(PORTBbits.RB4) count++;
_POWER_DELAY();
+ ClrWdt();
}
- if(count > 12) {
+ if(count <= 12) { // 24ms
return 0xff; // Pressed
}
return 0; // Not pressed
}
-void shutdown(unsigned char save)
+void shutdown(unsigned char save_v)
{
- _CLS();
- _LOCATE(0,0);
-// printstr("Bye...");
- idle_time_ms(1500); // 1.5Sec
- lcd_setbacklight(0, 0);
- set_powerlamp(0);
- set_amlamp(0);
- set_fmlamp(0);
-// _CLS();
+ rfamp_power(RFAMP_OFF);
+ power_on(0);
acm1602_suspend(LCD_I2CADDR);
- power_off(save);
+ lcd_setbacklight(0, 0);
+ power_off(save_v);
}
-void power_off(unsigned char save)
+void power_off(unsigned char save_v)
{
unsigned char sts;
- if(save != 0) save_eeprom();
- WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
+ if(save_v != 0) {
+ save_eeprom();
+// save_frequencies();
+ }
+ _AM_STATLAMP = 0;
+ _FM_STATLAMP = 0;
+ set_powerlamp(0);
+
+ WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
+ sts = 0;
do {
- IOCB = 0x00;
- IOCB |= 0x10; // IOCB4 ONLY.
+ RCONbits.IPEN = 1;
+ IOCB = 0x10; // IOCB4 ONLY.
OSCCONbits.IDLEN = 0; // Not Idle.
- INTCON2 |= _RBIP; // Priority = HIGH;
- INTCON &= ~(_RBIF | _GIE | _PEIE);
- INTCON |= _RBIE;
- power_on(0);
+ INTCON2bits.RBIP = 1; // Priority = HIGH;
+ INTCON = 0b00001000;
+ T0CONbits.TMR0ON = 0;
Sleep();
// Wake up
- if(INTCONbits.RBIF == 1) {
- sts = chk_powerbutton();
- } else {
- sts = 0;
+ if(INTCONbits.RBIF) {
+ INTCONbits.RBIF = 0;
+ idle_init();
+ sts = chk_powerbutton();
+ // sts = 0xff;
}
} while(sts == 0);
- INTCONbits.RBIF = 0;
+
INTCONbits.RBIE = 0;
-
- INTCON |= (_GIE | _PEIE);
-
+ INTCONbits.RBIF = 0;
// Button pressed, software reset.
Reset();
}
\ No newline at end of file