[Build] Enable to boot , compiled with XC8. Some functions wtill work wrong.
}
-#if 0
-void startadc(unsigned char ch)
-{
- unsigned char a;
- ADCON1bits.VCFG1 = 0;
- ADCON1bits.VCFG0 = 0;
- ADCON2 = 0b10110110;
- a = 0b00000001; // Select AN7, Start.
- switch(ch){
- case 0:
- a |= 0b00011100; // AN7
- break;
- default:
- a |= 0b00011100; // AN7
- break;
- }
- ADCON0 = a;
- // Delay = 5uS + Tc + (tempalature - 25) * 0.05uS
-// delay10tcy(8); // Tc = -13.5pF*(1K + 700 + (13K//39K)) = 1.52uS
- // Wait < 1.52 + 5 + 1.25 = 7.77uS-> 8uS
- PIR1bits.ADIF = 0;
- PIE1bits.ADIE = 0;
- IPR1bits.ADIP = 1; // High
- ADCON0bits.GO_NOT_DONE = 1;
-}
-
-unsigned int polladc(void)
-{
- unsigned int a;
- if(ADCON0bits.DONE == 1){ // converting or not enable.
- PIE1bits.ADIE = 1;
- PIR1bits.ADIF = 0;
- return 0xffff;
- } else { // Done, Clear interrupt
-// if(ADCON0bits.ADON == 0){
-// a = 0xffff;
-// } else {
- a = ((ADRESH << 8) + ADRESL) & 0x03ff;
-// }
- PIE1bits.ADIE = 0;
- PIR1bits.ADIF = 0;
-// ADCON0bits.GO_NOT_DONE = 0;
-// ADCON0bits.ADON = 0;
- return a;
- }
-}
-
-unsigned int polladc2(void)
-{
- unsigned int a = 0;
- do {
- delay10tcy(8); // 10uS
- a = ((ADRESH << 8) + ADRESL) & 0x03ff;
- } while(ADCON0bits.DONE);
- return a;
-}
-
-void stopadc(void)
-{
- ADCON0bits.GO_NOT_DONE = 0;
-// ADCON0bits.ADON = 0;
- PIR1bits.ADIF = 0;
- PIE1bits.ADIE = 0;
-}
-#else // Using sdcc's library.
unsigned int polladc(void)
{
}
}
-#endif
unsigned int adc_rawtobatt(unsigned int b, unsigned int reflevel)
{
* ADCON1bits.VCFG0 = 0;
* ADCON2 = 0b10110110;
*/
-#define startadc(c, p) { \
- OpenADC(ADC_FOSC_64 | ADC_RIGHT_JUST | ADC_20_TAD, c, p); \
- SetChanADC(c); \
- ConvertADC(); \
+#define startadc(c) { \
+ OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_20_TAD, (ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS & (0x0f << 2)) | (c << 2) , 0x0001 << c); \
+ ADCON0bits.GO = 1; \
}
#endif
void akc6955_writecmd(unsigned char reg, unsigned char data)
{
-#ifdef __SDCC
- i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
- I2C_START();
- i2c_writechar(0x20);
- i2c_writechar(reg);
- i2c_writechar(data);
- I2C_STOP();
- i2c_close();
- delay100tcy(2);
-#else
- OpenI2C(MASTER, SLEW_ON);
- SSPADD = 0x5;
-// IdleI2C();
- StartI2C();
- WriteI2C(0x20);
- //delay1ktcy(8);
- WriteI2C(reg);
- //delay1ktcy(8);
- WriteI2C(data);
- //delay1ktcy(8);
- StopI2C();
- // delay1ktcy(8);
- CloseI2C();
-#endif // i2c_idle();
+ i2c_send_byte(AKC6955_ADDRESS, reg, data);
}
unsigned char akc6955_readcmd(unsigned char reg)
{
- unsigned char c;
- // OPENASMASTER();
-#ifdef __SDCC
- i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
- I2C_START();
- i2c_writechar(0x20);
- i2c_writechar(reg);
- I2C_STOP();
- delay100tcy(2);
- I2C_START();
- i2c_writechar(0x21);
- c = i2c_readchar();
- I2C_ACK();
- I2C_STOP();
- i2c_close();
-#else
- OpenI2C(MASTER, SLEW_ON);
- SSPADD = 0x5;
-// IdleI2C();
- StartI2C();
- WriteI2C(0x20);
- // delay1ktcy(8);
- WriteI2C(reg);
- // delay1ktcy(8);
- StopI2C();
- __delay_us(13);
- StartI2C();
- WriteI2C(0x21);
- // delay1ktcy(8);
- c = ReadI2C();
- AckI2C();
- StopI2C();
- // delay1ktcy(8);
- CloseI2C();
-#endif
- // CLOSEASMASTER();
-
- return c;
+ return i2c_read_byte(AKC6955_ADDRESS, reg);
}
void akc6955_chg_fm(unsigned char f, unsigned int freq)
#ifndef AKC6955_H
#define AKC6955_H
+#include "i2c_io.h"
+
#ifdef __cplusplus
extern "C" {
#endif
extern void akc6955_set_thresh_amcnr(unsigned char a);
extern void akc6955_set_thresh_width(unsigned char a);
+
+
+
#define akc6955_set_fmbandwidth(bw) { \
unsigned char c = akc6955_readcmd(AKC6955_STEREO); \
c = (c & 0xfc) | (bw & 0x03); \
#include <stdarg.h>
#include <stdio.h>
#ifdef __SDCC
+#include <delay.h>
#include <pic18fregs.h>
#endif
{
// unsigned char b;
// b = _SSPEN | _SSPM3;
- SSPCON1bits.SSPEN = 1;
- SSPCON1bits.SSPM3 = 1;
- SSPADD = 4; // Fosc:8000[KHz] / (4 * I2C:Clock:400[KHz]) - 1
- SSPSTAT = 0x80;
+ // SSPCON1bits.SSPEN = 1;
+// SSPCON1bits.SSPM3 = 1;
+// SSPADD = 4; // Fosc:8000[KHz] / (4 * I2C:Clock:400[KHz]) - 1
+// SSPSTAT = 0x80;
PIR1bits.SSPIF = 0;
PIE1bits.SSPIE = 0;
IPR1bits.SSPIP = 1;
{
}
#endif
+// I2C_IO
+void i2c_send_byte(unsigned char addr, unsigned char reg, unsigned char data)
+{
+#ifdef __SDCC
+ i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
+ I2C_START();
+ i2c_writechar(addr);
+ i2c_writechar(reg);
+ i2c_writechar(data);
+ I2C_STOP();
+ i2c_close();
+// delay100tcy(2);
+#else
+ OpenI2C(MASTER, SLEW_ON);
+ SSPADD = 0x5;
+// IdleI2C();
+ StartI2C();
+ while (SSPCON2bits.SEN);
+ WriteI2C(addr);
+ WriteI2C(reg);
+ WriteI2C(data);
+ StopI2C();
+ while (SSPCON2bits.PEN);
+ CloseI2C();
+#endif // i2c_idle();
+}
+
+unsigned char i2c_read_byte(unsigned char addr, unsigned char reg)
+{
+ unsigned char c;
+ #ifdef __SDCC
+ i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
+ I2C_START();
+ i2c_writechar(addr);
+ i2c_writechar(reg);
+ I2C_STOP();
+ i2c_idle();
+// delay100tcy(2);
+ I2C_START();
+ i2c_writechar(addr | 1);
+ c = i2c_readchar();
+ I2C_ACK();
+ I2C_STOP();
+ i2c_close();
+#else
+ OpenI2C(MASTER, SLEW_ON);
+ SSPADD = 0x5;
+ StartI2C();
+ while(SSPCON2bits.SEN);
+ WriteI2C(addr);
+ // delay1ktcy(8);
+ WriteI2C(reg);
+ // delay1ktcy(8);
+ StopI2C();
+ IdleI2C();
+ StartI2C();
+ WriteI2C(addr | 1);
+ if (!SSPCON2bits.ACKSTAT){
+ SSPCON2bits.RCEN = 1;
+ while(SSPCON2bits.RCEN);
+ NotAckI2C();
+ while (SSPCON2bits.ACKEN);
+ StopI2C();
+ while (SSPCON2bits.PEN);
+ }
+ c = SSPBUF;
+ // delay1ktcy(8);
+ // delay1ktcy(8);
+ CloseI2C();
+#endif
+ // CLOSEASMASTER();
+ return c;
+
+}
+
#endif
\ No newline at end of file
#define CLOSEASMASTER() i2c_close()
extern void i2c1_init(void);
extern void i2c2_init(void);
+extern void i2c_send_byte(unsigned char addr, unsigned char reg, unsigned char data);
+extern unsigned char i2c_read_byte(unsigned char addr, unsigned char reg);
#ifdef __cplusplus
void idle_init(void)
{
-#if defined(__SDCC)
+ RCONbits.IPEN = 1;
+// INTCONbits.GIE = 1;
+
INTCONbits.TMR0IF = 0;
+ INTCONbits.TMR0IE = 1;
INTCONbits.RBIF = 0;
INTCON2bits.TMR0IP = 0;
// INTCON = INTCON & ~(_TMR0IF | _RBIF); // Enable tmr0 as interrupt and clear interrupt flags.
// INTCON2 = ~_TMR0IP & _TMR0IP; // Interrupt is lower.
-#else
- INTCON = INTCON & ~(_INTCON_TMR0IF_MASK | _INTCON_RBIF_MASK); // Enable tmr0 as interrupt and clear interrupt flags.
- INTCON2bits.TMR0IP = 0; // Interrupt is lower.
-#endif
WDTCON = 1; // OK? WDT=Disabled.
}
/* 1Tick = 1/1000 ms*/
T0CON = 0b00001000; // 1/2
OSCCONbits.IDLEN = 1;
- INTCON2bits.TMR0IP = 0;
INTCONbits.TMR0IF = 0;
- INTCONbits.TMR0IE = 1; // Enable tmr0 as interrupt and clear interrupt flags.
// TMR0H = initial >> 8; // Write order : L->H
TMR0H = initial >> 8; // Write order : H->L
TMR0L = initial & 0xff;
T0CONbits.TMR0ON = 0;
// Clear interrupt flag
-// INTCONbits.TMR0IF = 0;
+ INTCONbits.TMR0IF = 0;
INTCONbits.TMR0IE = 0;;
return;
//DEF_HANDLER(SIG_BCOL, I2CBus_handler)
END_DEF
#else
-void interrupt high_priority intlow_handler(void)
+void interrupt low_priority intlow_handler(void)
{
if(INTCONbits.TMR0IF) TMR0_handler();
if(INTCONbits.INT0IF) EXINT_Handler();
idle_time_ms(300); // Wait for setup.
switch(reset_status){
case RESET_MCLR:
- shutdown(0); // When press reset, state to power_off.
- break;
case RESET_WDT: // Workaround random reset.
- shutdown(0);
- break;
case RESET_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;
break;
default:
break;
power_on(1);
intadc_init();
set_powerlamp(1);
- idle_time_ms(125);
+// idle_time_ms(125);
valinit();
acm1602_init(0xa0, 1); //Init LCD
- idle_time_ms(125);
+// idle_time_ms(125);
_LOCATE(0,0); // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
_PUTCHAR(' '); //
_LOCATE(0,1);
_CLS();
_LOCATE(0,0);
_PUTCHAR(' ');
-// battlevel = 350;
+ battlevel = 350;
update_status();
update_display();
ClrWdt();
} else {
lcd_setbacklight(0x00, 0); // Turn OFF
}
-// ClrWdt();
- // Debug routines
+ ClrWdt();
update_status();
update_display();
ClrWdt();
IOCB = 0x00;
// IOCBbits.IOCB4 = 1;
INTCONbits.RBIE = 0;
- INTCONbits.RBIF = 0;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
}
}
-unsigned char chk_powerbutton(void)
+volatile unsigned char chk_powerbutton(void)
{
unsigned char count = 0;
char i;
WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
sts = 0;
do {
- IOCB = 0x00;
- IOCBbits.IOCB4 = 1; // IOCB4 ONLY.
+ RCONbits.IPEN = 1;
+ IOCB = 0x10; // IOCB4 ONLY.
OSCCONbits.IDLEN = 0; // Not Idle.
INTCON2bits.RBIP = 1; // Priority = HIGH;
- INTCONbits.RBIF = 0;
- INTCONbits.GIE = 0;
- INTCONbits.PEIE = 0;
- INTCONbits.RBIE = 1;
+ //INTCONbits.GIE = 0;
+ //INTCONbits.RBIF = 0;
+ //INTCONbits.PEIE = 0;
+
+ //INTCONbits.TMR0IF = 0;
+ //INTCONbits.TMR0IE = 0;
+ //INTCONbits.RBIE = 1;
+ INTCON = 0b0000100;
+ T0CONbits.TMR0ON = 0;
Sleep();
// Wake up
if(INTCONbits.RBIF) {
+ INTCONbits.RBIF = 0;
sts = chk_powerbutton();
}
} while(sts == 0);
- INTCONbits.RBIF = 0;
INTCONbits.RBIE = 0;
- OSCCONbits.IDLEN = 1; // Not Idle.
+ INTCONbits.RBIF = 0;
+// OSCCONbits.IDLEN = 1; // Not Idle.
- INTCONbits.GIE = 1;
- INTCONbits.PEIE = 1;
- WDTCONbits.SWDTEN = 1; //WDT ON.
+// INTCONbits.GIE = 1;
+// INTCONbits.PEIE = 1;
+// WDTCONbits.SWDTEN = 1; //WDT ON.
// Button pressed, software reset.
Reset();
#endif
#ifdef __SDCC
-#define _POWER_DELAY() delay1ktcy(10*8) // 10ms
+#define _POWER_DELAY() delay1ktcy(2*8) // 2ms
#else
#define _POWER_DELAY() __delay_ms(2)
#endif
extern void rfamp_power(unsigned char b);
extern void power_on_inthook(void);
extern void power_on(unsigned char f);
- extern unsigned char chk_powerbutton(void);
+ extern volatile unsigned char chk_powerbutton(void);
extern void power_off(unsigned char save);
extern void shutdown(unsigned char save);
tuneflag = akc6955_tune();
cnrlevel = akc6955_get_cnr();
batlevel_6955 = akc6955_get_battery();
-#ifdef __SDCC
- startadc(7);
-#else
- startadc(ADC_CH7 | ADC_INT_OFF ,ADC_7ANA);
-#endif
- idle_time_ms(1);
+ startadc(7);
+ idle_time_ms(1);
polladc2(adc);
battlevel = adc_rawtobatt(adc, batlevel_6955);
}