/*********************************************************/ /* Kotatsu Controller */ /* Device:16F876 */ /* Compiler:XC8 Ver 1.11 */ /* Meked by en129 */ #include #include #define _XTAL_FREQ 10000000 #pragma config BOREN = OFF, CPD = OFF, DEBUG = ON, WRT = OFF #pragma config FOSC = HS, WDTE = OFF, CP = OFF, LVP = OFF, PWRTE = ON #define inSW_1 (PORTAbits.RA1) #define inSW_2 (PORTAbits.RA2) #define inSW_3 (PORTAbits.RA3) #define inAC_Sync (PORTBbits.RB0) #define outLED_R (PORTCbits.RC0) #define outLED_G (PORTCbits.RC1) #define outDP (PORTCbits.RC4) #define outSSR (PORTCbits.RC2) #define selectDISP1 (PORTCbits.RC7) #define selectDISP2 (PORTCbits.RC6) #define selectDISP3 (PORTCbits.RC5) #define scale_AD2temp ((float)(0.48828125)) void init(void); void DISP_select(unsigned char num); unsigned int ADget(void); unsigned int NowTemp = 0; unsigned char NowOutputPower = 0; unsigned int TargetTemp = 320; unsigned char DispMode = 0; bit FlgPushSW1 = 0; bit FlgPushSW2 = 0; bit FlgPushSW3 = 0; bit FlgLongPushSW3 = 0; unsigned char FlgDispPower = 1; static void interrupt intr(void) { const static unsigned char LED_table[] = {252,96,218,242,102,182,190,228,254,246}; static unsigned char DispDigit = 0; static unsigned char TMR1Count = 0; static unsigned int Seg_Disp = 0; static bit oldSW_1 = 0; static bit oldSW_2 = 0; static bit oldSW_3 = 0; static unsigned char CountSW3PushTime = 0; //10Mhz / 4 / 64 / 256 // = 152Hz = 6.6ms if( INTCONbits.TMR0IF == 1 ) { INTCONbits.TMR0IF = 0; //7segDisp prosess if(FlgDispPower == 1) { if(DispDigit == 0) { PORTB = LED_table[Seg_Disp/100]; } else if(DispDigit == 1) { PORTB = LED_table[(Seg_Disp/10)%10]; } else { PORTB = LED_table[Seg_Disp%10]; } DISP_select(DispDigit+1); DispDigit++; if(DispDigit >= 3) { DispDigit = 0; } } else { DISP_select(0); } //inputSW process if( (inSW_1 == 0) && (oldSW_1 == 1) ) { FlgPushSW1 = 1; } oldSW_1 = inSW_1; if( (inSW_2 == 0) && (oldSW_2 == 1) ) { FlgPushSW2 = 1; } oldSW_2 = inSW_2; if( (inSW_3 == 0) && (oldSW_3 == 1) ) { FlgPushSW3 = 1; } oldSW_3 = inSW_3; if(inSW_3 == 0) { if(CountSW3PushTime < 200) { CountSW3PushTime++; } else { FlgLongPushSW3 = 1; } } else { CountSW3PushTime = 0; FlgLongPushSW3 = 0; } } if( PIR1bits.TMR1IF == 1 ) { PIR1bits.TMR1IF = 0; if(TMR1Count >= 3) { if(DispMode == 0) { Seg_Disp = NowTemp; FlgDispPower = 1; } else if(DispMode == 1) { Seg_Disp = NowOutputPower; FlgDispPower = 1; } TMR1Count = 0; } else { TMR1Count++; } if(TMR1Count%2 == 0) { if(DispMode == 2) { Seg_Disp = TargetTemp; FlgDispPower = ~FlgDispPower; } } } } void ModeSetTemp(void) { DispMode = 2; outDP = 1; outLED_R = 1; outLED_G = 1; if(FlgPushSW1 == 1) { if(TargetTemp < 450) { TargetTemp++; } FlgPushSW1 = 0; } if(FlgPushSW2 == 1) { if(TargetTemp > 200) { TargetTemp--; } FlgPushSW2 = 0; } } void ModeDispTemp(void) { DispMode = 0; outDP = 1; outLED_R = 1; outLED_G = 0; } void ModeDispPoer(void) { DispMode = 1; outDP = 0; outLED_R = 0; outLED_G = 1; } /******************************************************************************/ /* Main Program */ /******************************************************************************/ void main(void) { unsigned char inACPulse = 0; unsigned char old_Sync = 0; signed char set_sycle = 0; unsigned char ModeState = 0; signed int DiffTemp = 0; init(); while(1) { NowTemp = ADget(); NowOutputPower = 50; switch(ModeState) { case 0: { ModeDispTemp(); FlgPushSW1 = 0; if(FlgPushSW2 == 1) { ModeState = 1; FlgPushSW2 = 0; } if(FlgLongPushSW3 == 1) { ModeState = 2; FlgLongPushSW3 = 0; FlgPushSW3 = 0; } break; } case 1: { ModeDispPoer(); if(FlgPushSW1 == 1) { ModeState = 0; FlgPushSW1 = 0; } FlgPushSW2 = 0; if(FlgLongPushSW3 == 1) { ModeState = 2; FlgLongPushSW3 = 0; FlgPushSW3 = 0; } break; } case 2: { ModeSetTemp(); FlgPushSW1 = 0; FlgPushSW2 = 0; if(FlgPushSW3 == 1) { ModeState = 0; FlgPushSW3 = 0; } break; } default: break; } DiffTemp = TargetTemp-NowTemp; if(DiffTemp>=80) { DiffTemp = 90; } if(DiffTemp >= 0) { set_sycle = DiffTemp/30+1; NowOutputPower = (set_sycle+1)*20; } else { set_sycle = -1; NowOutputPower = 0; } if( (inAC_Sync == 1) && (inAC_Sync != old_Sync) ) { inACPulse++; inACPulse = inACPulse%5; } old_Sync = inAC_Sync; if( (set_sycle >= inACPulse)) { outSSR = 1; } else { outSSR = 0; } } } void init(void) { PORTA = 0x00; TRISA = 0x0f; PORTB = 0x00; TRISB = 0x01; OPTION_REGbits.nRBPU = 1; //pull-up disable PORTC = 0x00; TRISC = 0x00; //ADC settings ADCON0 = 0b10000000; //ch0 select ADCON1 = 0b10001110; //AN1 is Analog IN ADCON0bits.ADON = 1; //TMR0 settings OPTION_REGbits.T0CS = 0; OPTION_REGbits.T0SE = 0; OPTION_REGbits.PSA = 0; OPTION_REGbits.PS = 0b101; INTCONbits.TMR0IF = 0; INTCONbits.TMR0IE = 1; //TMR1 settings T1CON = 0b00110001; PIR1bits.TMR1IF = 0; PIE1bits.TMR1IE = 1; INTCONbits.PEIE = 0; INTCONbits.GIE = 1; } void DISP_select(unsigned char num) { if(num == 0) { selectDISP1 = 0; selectDISP2 = 0; selectDISP3 = 0; } if(num == 1) { selectDISP1 = 1; selectDISP2 = 0; selectDISP3 = 0; } if(num == 2) { selectDISP1 = 0; selectDISP2 = 1; selectDISP3 = 0; } if(num == 3) { selectDISP1 = 0; selectDISP2 = 0; selectDISP3 = 1; } } unsigned int ADget(void) { unsigned long tmp = 0; unsigned char i = 0; static unsigned int average_data[20]; for(i=0;i<100;i++) { ADCON0bits.GO_nDONE = 1; //convert start while(ADCON0bits.GO_nDONE == 1) { } tmp += ((ADRESH << 8)|(ADRESL)); } tmp = (tmp/100); for(i=0;i<19;i++) { average_data[i] = average_data[i+1]; } average_data[19] = tmp; tmp = 0; for(i=0;i<20;i++) { tmp += average_data[i]; } return (int)((tmp/20.0)*scale_AD2temp); }