/********************************************************** * * Zombie-Knarre * * (C) Fingers elektrische Welt 2012 * ********************************************************/ #include #include #include #include #include #include // Diverses volatile unsigned long Timerticks = 0; // Systemticker alle 10ms //------------------------------------------------- // Konfiguration des Controllers //------------------------------------------------- __CONFIG(1, OSCEN & HS); // HS = Quarz __CONFIG(2, BORDIS & WDTEN); // Watchdog, kein BrownOut __CONFIG(4, LVPDIS & STVREN); // Kein LowVoltageProgramm, Reset bei StackOverflow /************************** * * Systemticker erhöhen * **************************/ void Systemticker (void) { Timerticks++; } /************************** * * Systemticker auslesen * **************************/ long Get_Ticker (void) { return (Timerticks); } /************************************* * * Verzögern im Millisekundenbereich * *************************************/ void Delayms (int time) { unsigned long ticker; ticker = Get_Ticker (); while ( (ticker + (time / 10)) > Get_Ticker () ) { CLRWDT (); if (RB1) RB1 = 0; else RB1 = 1; // Ein wenig am Pin klappern } } /**************** * * Zentrale ISR * ****************/ interrupt void INT_(void) { //-------------------- // Timer 1 Überlauf ? //-------------------- if (TMR1IF) { Systemticker (); // Systemticker erhöhen TMR1IF=0; // Clear Interrupt-Flag // Werte für 10 MHz TMR1L=0xCB; // Timer 1 neu vorladen (0xF3CB = 10ms) TMR1H=0xF3; // n = 2^16 - t [s] * 625000 } // From Timer 1 Überlauf return; // Zurück zum Hauptprogramm } /*************************** * * Tastgrad setzen Kanal 1 * ***************************/ void PWM1 (char wert) { CCPR1L=wert; // Periodenregister CCP1CON5:4 = Obere Bits } /*************************** * * Tastgrad setzen Kanal 2 * ***************************/ void PWM2 (char wert) { CCPR2L=wert; // Periodenregister CCP1CON5:4 = Obere Bits } /****************************** * * Startklar machen den Eimer * ******************************/ void sysinit (void) { TRISB = 1; // RB0 als Eingang TRISC = 0; // Alles Ausgang #define TASTER RB0 CLRWDT (); //------------ // Timer-Init //------------ TMR1IE=1; // enable Interrupt of TMR1 T1CON=49; // Prescaler=1:8 + Timer on (49) PEIE=1; // Peripherie Int=on GIE=1; // Define Interupts //---------- // PWM-Init //---------- PR2= 255; // Volle Periode // CCPR1L=127; // Periodenregister CCP1CON5:4 = Obere Bits T2CON = 0; // Keine Vorteiler TMR2ON = 1; // Timer 2 rennt CCP1CON = 0b00001100; // PWM-Modus CCP2CON = 0b00001100; // PWM-Modus PWM1 (127);PWM2 (127); // Initialwert } /*************************************** * * Hier geht das total los das Mopped ! * ***************************************/ void main (void) { int i,j; sysinit (); // Mach das hier mal, bis du kotzen musst while (1) { CLRWDT (); //--------------------------- // Langsam auf- und abdimmen //--------------------------- i = 0; // Rauf while ((i < 100) && (!TASTER)) { Delayms (50); i++; PWM1 (i); PWM2 (i); CLRWDT (); } // Runter CLRWDT (); while ((i > 0) && (!TASTER)) { Delayms (50); i--; PWM1 (i);PWM2 (i); CLRWDT (); } //------------------ // Abzug betätigt ? //------------------ if (TASTER) { // Hektisches Blinken, wenn der Abzug betätigt wurde #define PAUSE1 100 for (j = 0; j < 10; j++) { PWM1 (255);PWM2 (255); Delayms (PAUSE1); CLRWDT (); PWM1 (0);PWM2 (0); Delayms (PAUSE1); CLRWDT (); } } // Von if (TASTER) } // Von While (1) } // Thats all folks