X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=power.c;h=681e0a86c98cf446b54beeac35a3532bffbe539c;hb=refs%2Fheads%2Fstable_v1.0;hp=8de0d34c4a48c6cab460ed18c1656fa82b024b56;hpb=11277890e6613079b909f67bd47a2e76be96e6b4;p=openi2cradio%2FOpenI2CRadio.git diff --git a/power.c b/power.c index 8de0d34..681e0a8 100644 --- a/power.c +++ b/power.c @@ -26,8 +26,11 @@ * 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. @@ -35,109 +38,147 @@ 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