/* * File: main.c * Author: thorby * * Created on 16. November 2021, 23:10 */ #include #include #include #include #define _XTAL_FREQ (8000000UL) #define S_OFF 0 #define S_ON 1 #define P_OFF 0b0000 #define P_ON 0b0111 #define WTPS 0b01010 // 1s //#define FLICKER //#define HOUR3 #ifdef HOUR3 #define MAX_COUNT_OFF 1260 #define MAX_COUNT_ON 180 #else // HOUR6 #define MAX_COUNT_OFF 1080 #define MAX_COUNT_ON 360 #endif // Total delay MAX_COUNT * WTPS // 01010 1s // 01101 8s // 01110 16s // 01111 32,768s // 10000 65s na // 10011 524,288s na // 10100 1048,5766s na // CONFIG #pragma config FOSC = INTOSC // Oscillator Selection bits (INTOSC oscillator: CLKIN function disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config WDTE = ON // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled) #pragma config LPBOR = OFF // Brown-out Reset Selection bits (BOR disabled) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) unsigned short i; unsigned short j; unsigned short l; unsigned short ml; unsigned int count; unsigned short state; #define CTIME 6000 // in 10 ms /* Pic10F322 * _______ * nothing | | RA 3 * 2 - 5.5V | | ground * RA 2 | | nothing * RA 1 |_______| RA 0 */ int main(int argc, char** argv) { TRISA = 0b0000; //Bit 0,1,2,3 Output // watchdog conf WDTCONbits.WDTPS = WTPS; if (__timeout == 0) { // reset via watchdog // timer calibration in 10ms cycles unsigned int delta = (unsigned int)(j*1000 + i); ml = (unsigned short)(CTIME / delta); CLRWDT(); l++; i=0; } else { // reset via power on ml = 0; l = 1; j=0; count = 65500; state = S_OFF; } while(1) { // 60000ms = 1 Min. passed if (l >= ml) { count++; if (state == S_ON) { #ifdef FLICKER PORTA = P_OFF; __delay_ms(200); PORTA = P_ON; __delay_ms(500); PORTA = P_OFF; __delay_ms(300); PORTA = P_ON; __delay_ms(100); PORTA = P_OFF; __delay_ms(300); PORTA = P_ON; __delay_ms(300); PORTA = P_OFF; __delay_ms(100); PORTA = P_ON; __delay_ms(100); PORTA = P_OFF; __delay_ms(100); PORTA = P_ON; #endif if (count > MAX_COUNT_ON) { state = S_OFF; PORTA = P_OFF; count = 0; } } else { if (count > MAX_COUNT_OFF) { state = S_ON; PORTA = P_ON; count = 0; } } l = 0; j = 0; CLRWDT(); // start timer measurement while(1) { // 10s loops for(i=0;i<999;i++) __delay_ms(10); j++; } } else { i++; l++; SLEEP(); } } }