//---------------------------------------------------------------------- // Titel : Automatische Markisensteuerung //---------------------------------------------------------------------- //---------------------------------------------------------------------- // Schaltung : Windsensor liefert einen Impuls je Umdrehung -> an PortD3 -> Zählen mit Interrupt // Schalter an PortC5 öffnet/schießt die Markise (es wird der soll-Zustand [High=offen; Low=geschlossen] ausgegeben) // Funktion : Markise ist offen: // Wenn innerhalb eines Intervalls 1 der Schwellwert überschrittenwird, // soll die Markise geschlossen werden. // Markise ist geschlossen: // Wenn innerhalb von 120xIntervall 1 der Schwellwert nicht überschritten wurde // soll die Markise geöffnet werden. // Prozessor : ATmega328P // Takt : 3686400 Hz // Sprache : C // Datum : 25.6.2012 // Version : 1.0 // Autor : // Programmer: // Port : //------------------------------------------------------------------------- // created by myAVR-CodeWizard //------------------------------------------------------------------------- // #define F_CPU 3686400 #include #include // Defines für Konfiguration #define MAX_IMPULSE 10 // bei > 10 Impulse pro Intervall, Markise zu #define MAX_INTERVALLE 120 // (10min = 120x5s) #define an_WA PORTB |=0b00000001 // B0 OUT Windanzeige #define aus_WA PORTB &=0b11111110 // B0 OUT Windanzeige // Globale Variablen -- Zähler // volatile, da Variable im Interrupt verändert werden soll volatile uint8_t impulsCount = 0; // Zähler für Impulse des Windsensors volatile uint8_t intervallCount = 0; // Zähler für Timer-Intervalle (10min = 120x5s) volatile uint8_t status = 0; // Status der Markise (0=zu, 0x20=offen) //-------------------------------------------------------------------- // INT1_vect - INT1 Interrupt an Eingang PORTD3 bei steigender Flanke //-------------------------------------------------------------------- ISR(INT1_vect) { impulsCount++; } //-------------------------------------------------------------------- // TIMER1_COMPA_vect - Timer1 Interrupt bei Vergleichswert A // aktuelle Einstellung: 0.2 Hz 5000 ms //-------------------------------------------------------------------- ISR(TIMER1_COMPA_vect) { // wenn offen if(status) { if(impulsCount >= MAX_IMPULSE) { status = 0; // Markise schließen an_WA; // Windanzeige an } intervallCount=0; // wenn offen werden die Intervalle nicht gezählt. } // wenn geschlossen else { intervallCount++; // wenn zu windig if(impulsCount >= MAX_IMPULSE) { intervallCount=0; } if(intervallCount >= MAX_INTERVALLE) { status = 0x20; // Markise öffnen aus_WA; // Windanzeige aus } } impulsCount = 0; // Impulszähler für nächses Intervall zurücksetzen } //------------------------------------------------------------------------ // Initialisierungen //------------------------------------------------------------------------ void init() { // Ports initialisieren sbi(DDRB,0); // PORTB0 auf Ausgang - Windanzeige sbi(DDRC,5); // PORTC5 auf Ausgang - Markise offen cbi(DDRD,3); // PORTD3 auf Eingang ohne PullUp EIMSK|=0b00000010; // INT1 Interrupt an Eingang PORTD3 bei steigender Flanke EICRA|=0b00000100; EICRA|=0b00001000; //--- Timer 1 initialisieren --- TCCR1B=0x05; // Teiler 1/1024 TCCR1B|=0x02; // Modus: Zählen bis Vergleichswert OCR1A=18000; // Vergleichswert speichern TIMSK1=0x02; // Interrupt bei Vergleichswert A //--- Interrupts erlauben --- sei(); } ///////////////////////////////////////////////////////////////////////////// // Main-Funktion ///////////////////////////////////////////////////////////////////////////// main() { init(); // Initialisierungen do { // Schleifenanfang Mainloop PORTC = status; } while (true); // Schleifenende Mainloop } //---------------------------------------------------------------------------