//****************************************************************************************** // Programmierung Mikrocontroller Sitzheizung/ Sitzbelueftung // Ziel: 2 Tastersignale (schalten auf Masse durch) erfassen (externe Interrupts 0 = Heizung (P3.2) und 1 = Lueftung (P3.3)) --> 3-stufiges PWM-Signal (Aus, 100%, 70%, 40%) erzeugen und gewählt Stufe über LED (Heizung: P0.0 - P0.2; Lueftung: P0.3 - P0.5) visualisieren //****************************************************************************************** #include <> //****************************************************************************************** // Weitere Funktionen //****************************************************************************************** void init (void); void pwm_out (void); void entprellen (void); //****************************************************************************************** // Globale Variablen //****************************************************************************************** unsigned char stufe_heizung = 0; unsigned char stufe_lueftung = 0; //****************************************************************************************** void main (void) { init(); while (1) { switch (stufe_heizung) { case 3: { pwm_out(); // entsprechendes PWM Signal erzeugen 100% // statt des aufrufs von pwm_out ist es auch möglich direkt eine 0 (die externe schaltung invertiert) an den entsprechenden Pin zu legen P0_DATA &= 0x77; // 3 LED an }; case 2: { pwm_out(); // entsprechendes PWM Signal erzeugen 70% P0_DATA &= 0x73; // 2 LED an }; case 1: { pwm_out(); // entsprechendes PWM Signal erzeugen 40% P0_DATA &= 0x71; // 1 LED an }; case 0: { pwm_out(); // entsprechendes PWM Signal erzeugen AUS // statt des aufrufs von pwm_out ist es auch möglich direkt eine 1 (die externe schaltung invertiert) an den entsprechenden Pin zu legen P0_DATA &= 0x70; // LED aus }; break; }; switch (stufe_lueftung) { case 3: { pwm_out(); // entsprechendes PWM Signal erzeugen 100% // statt des aufrufs von pwm_out ist es auch möglich direkt eine 0 (die externe schaltung invertiert) an den entsprechenden Pin zu legen P0_DATA &= 0x77; // 3 LED an }; case 2: { pwm_out(); // entsprechendes PWM Signal erzeugen 70% P0_DATA &= 0x37; // 2 LED an }; case 1: { pwm_out(); // entsprechendes PWM Signal erzeugen 40% P0_DATA &= 0x17; // 1 LED an }; case 0: { pwm_out(); // entsprechendes PWM Signal erzeugen AUS // statt des aufrufs von pwm_out ist es auch möglich direkt eine 1 (die externe schaltung invertiert) an den entsprechenden Pin zu legen P0_DATA &= 0x07; // LED aus }; break; }; }; } //****************************************************************************************** void init (void) { P3_DATA = 0xC; // P3 als Eingang definiert - bei P3.2 und P3.3 eine 1 setzen P0_DATA = 0x00; // Alle Heizungs-LED als aus definieren P2_DATA = 0x00; // Lüfungs - LED als aus definieren IT1 = 1; // Externer Interrupt 1 auf fallende Flanke getriggert IT0 = 1; // Externer Interrupt 0 auf fallende Flanke getriggert EAL = 1; // Individuelle Einstellung für Interrupts freigeben EX1 = 1; // Externer Interrupt 1 freigegeben EX0 = 1; // Externer Interrupt 0 freigegeben ET0 = 1; // Timer 0 Interrupt freigeben TMOD |= 0x01; // Timer0 als 16 Bit Timer initialisieren } //****************************************************************************************** void ISR_Heizung (void) interrupt 0 // Externer Interrupt 0 { IE0 = 0; // Interrupt flag zurücksetzen P3_DATA = 0xC; // Damit die Pins als Eingänge verwendet werden können if (stufe_heizung > 0) // Wert der Variable entsprechend verändern stufe_heizung --; else stufe_heizung = 3; entprellen(); } //****************************************************************************************** void ISR_Lueftung (void) interrupt 2 // Externer Interrupt 1 { IE1 = 0; // Interrupt flag zurücksetzen P3_DATA = 0xC; // Damit die Pins als Eingänge verwendet werden können if (stufe_lueftung > 0) // Wert der Variable entsprechend verändern stufe_heizung --; else stufe_lueftung = 3; entprellen(); } //****************************************************************************************** void ISR_timer0 (void) interrupt 1 // Interrupt für timer 0 { TF0 = 0; // Interrupt flag zurücksetzen EX1 = 0; // Interrupts freigeben EX0 = 0; } //****************************************************************************************** void entprellen (void) { EX1 = 0; // Interrupts blockieren EX0 = 0; TH0 = ...; // Timerwert festlegen auf etwa 50ms einstellen TL0 = ...; TR0 = 1; // Timer 0 starten } //****************************************************************************************** void pwm_out (void) // Das Erzeugen des PWM Signals muss über Timer 2 erfolgen { }