Ich habe mein Projekt Regendusche nun endlich technisch umgesetzt. Jetzt hapert es aber an einigen Stellen im Programmtext . Folgende Eckdaten : Mega16 Quarz 11059200 Hz C++ Ich habe zwei Probleme . Problem 1 (Reset) : Aus irgendeinem Grund macht der Mega einen Reset ?! (denke ich) wenn ich von einer aktivierten Tropenregendusche auf den Taster Regen Mitte drücke . Witzigerweise funktioniert es aber andersrum ohne diesen Reset . Ich habe für mich alles durch komme hier aber auf keine Idee . Brown out habe ich übrigens aus . Kurzschluss etc ist ausgeschlossen . Problem 2 (Timer) : Ich habe alle 3 Timer im Gebrauch für die RGB Kanäle sowie den Dimmer der Halogenleuchten . Für zb das Blinken der Taster wenn sie aktiviert sind brauche ich jedoch einen Takt idealerweise eine Sekunde . Mit meiner Overflow Funktion scheine ich allerdings die PWM Frequenz erwischt zu haben ,sodass wenn sich die Farbe ändert auch die Schnelligkeit ändert wann der Overflow ausgelöst wird . Hier habe ich auch noch keine Idee . Zuletzt natürlich noch der Programmtext :( Sorry wenn hier und da verwirrend :S) //---------------------------------------------------------------------- #define F_CPU 11059200 #include <avr\io.h> Konstantendefinitionen #include <inttypes.h> #include <avr\interrupt.h> //------------------------------------------------------------ Globale Variablen #define MAGNET_KALT 1 #define MAGNET_WARM 0 #define MAGNET_TEIL 2 #define DUFT 3 #define LED_TROPENREGEN 0 #define LED_REGEN_MITTE 1 #define LED_ERFRISCHUNG 2 #define LED_VITALREGEN 3 #define LED_DUFT 6 #define LED_LED 5 char tropenregen_an = 0; char regen_mitte_an = 0; char erfrischung_an = 0; char vitalregen_an = 0; char duft_an = 1; char led_an = 1; char dusche_an = 0; char pressed = 0; char led_active = 0 ; char vital_active = 0; char ledonoff = 1; int timecount = 0; //OCR1A = 20 ; // blau //OCR1B = 200 ; // grün //OCR0 = 255 ; // rot //---------------------------------------------------------------------- void pwmInit() { TCCR0 = 0b01100001 ; // Timer R Prescaler 1024 / Phase Correct PWM TCCR1A = 0b10100001 ; // Timer G Prescaler 1024 / Phase Correct PWM TCCR1B = 0b00000001 ; // Timer B Prescaler 1024 / Phase Correct PWM TCCR2 = 0b01100001 ; // Timer DimmerPrescaler 1024 / Phase Correct PWM TIMSK = 0b00000001; } //---------------------------------------------------------------------- void reset_all() { tropenregen_an = 0; regen_mitte_an = 0; erfrischung_an = 0; vitalregen_an = 0; led_active = 0; ledonoff = 1; } //---------------------------------------------------------------------- void Dimmer (char updown) { if (updown == 1) // hochdimmmen { while (OCR2 < 255) { OCR2 = OCR2+1; waitMs(7); } } //---------------------------------------------------------------------- else if (updown == 0) { while (OCR2>40) // runterdimmen { OCR2 = OCR2-1; waitMs(7); } } } //---------------------------------------------------------------------- void LED_Ausgabe (char anaus) { if (anaus == 1) { if ( duft_an == 1) { PORTD |= (1 <<LED_DUFT); // Duft LED an } else if (duft_an == 0) { PORTD &=~ (1 <<LED_DUFT); // Duft LED aus } if ( led_an == 1) { PORTC |= (1 <<LED_LED); // Duft LED an } else if (led_an == 0) { PORTC &=~ (1 <<LED_LED); // Duft LED aus } if ( led_active == 0 ) // Standartlicht { PORTD |= ( (1 <<LED_TROPENREGEN) | (1 << LED_REGEN_MITTE) | (1 << LED_ERFRISCHUNG) | (1 << LED_VITALREGEN) ) ; //LED Tastenfeld an OCR1A = 20 ; // blau OCR1B = 200 ; // grün OCR0 = 255 ; // rot } } else if (anaus == 0) // alle Lichter aus { PORTD &=~ ( (1 <<LED_TROPENREGEN) | (1 << LED_REGEN_MITTE) | (1 << LED_ERFRISCHUNG) | (1 << LED_VITALREGEN) | (1 << LED_DUFT) ) ; PORTC &=~ ( 1 << LED_LED ) ; OCR1A = 0 ; // blau OCR1B = 0 ; // grün OCR0 = 0 ; // rot } } //------------------------------------------------------------ void Taster_abfragen () // Tastenabfrage { switch (PINA & 0b11111111) { //------------------------------------------------------------ case 0b10111110 : // Taster Tropenregen if (tropenregen_an == 0 & pressed != 1 & dusche_an == 1) { reset_all(); pressed = 1; if (led_an == 1) { if (OCR2 == 255) { Dimmer (0); } led_active = 1; OCR1A = 0 ; // blau OCR1B = 0 ; // grün OCR0 = 255 ; // rot } tropenregen_an = 1; PORTC |= ((1 << MAGNET_TEIL) | (1 << MAGNET_WARM)) ; //Magnetventile anschalten PORTC &= ~ ( (1 << MAGNET_KALT) ) ; } else if (tropenregen_an == 1 & pressed != 1 & dusche_an == 1 ) { reset_all(); //Magnetventile und LED ausschalten pressed = 1; if (led_an == 1) { Dimmer (1); } PORTC &= ~ ( (1 << MAGNET_KALT) | (1 << MAGNET_WARM) | (1 << MAGNET_TEIL) ) ; } break; //------------------------------------------------------------ case 0b10111101 : // Taster Regen Mitte if (regen_mitte_an == 0 & pressed != 1 & dusche_an == 1 ) { reset_all(); pressed = 1; if (led_an == 1 ) { if (OCR2 == 255) { Dimmer (0); } led_active = 1; OCR1A = 0 ; // blau OCR1B = 255 ; // grün OCR0 = 0 ; // rot } regen_mitte_an = 1; PORTC |= (1 << MAGNET_WARM) ; // Magnetventile anschalten PORTC &= ~ ( (1 << MAGNET_KALT) | (1 << MAGNET_TEIL) ) ; } else if (regen_mitte_an == 1 & pressed != 1 & dusche_an == 1 ) { reset_all(); pressed = 1; if (led_an == 1) { Dimmer (1); } PORTC &= ~ ( (1 << MAGNET_KALT) | (1 << MAGNET_WARM) | (1 << MAGNET_TEIL) ) ; } break; //------------------------------------------------------------ case 0b10111011 : // Taster Erfrischung if (erfrischung_an == 0 & pressed != 1 & dusche_an == 1 ) { reset_all(); pressed = 1; if (duft_an == 1) { PORTC |= (1 << DUFT) ; } if (led_an == 1) { Dimmer (0); led_active = 1; OCR1A = 255 ; // blau OCR1B = 0 ; // grün OCR0 = 0 ; // rot } erfrischung_an = 1; PORTC |= ( 1 << MAGNET_KALT ); //Magnetventile anschalten PORTC &= ~ ( (1 << MAGNET_TEIL) | (1 << MAGNET_WARM) ) ; } else if (erfrischung_an == 1 & pressed != 1 & dusche_an == 1 ) { reset_all(); //Magnetventile und LED ausschalten pressed = 1; if (led_an == 1) { Dimmer (1); } PORTC &= ~ ( (1 << MAGNET_KALT) | (1 << MAGNET_WARM) | (1 << MAGNET_TEIL) | (1 << DUFT)) ; } break; //------------------------------------------------------------ case 0b10110111 : // Taster Vitalregen if (vitalregen_an == 0 & pressed != 1 & dusche_an == 1 ) { reset_all(); pressed = 1; if (led_an == 1) { Dimmer (0); led_active = 1; } vitalregen_an = 1; PORTC |= ((1 << MAGNET_TEIL) | (1 << MAGNET_WARM)) ; PORTC &= ~ ( (1 << MAGNET_KALT) ) ; } else if (vitalregen_an == 1 & pressed != 1 & dusche_an == 1 ) { //Magnetventile und LED ausschalten reset_all(); pressed = 1; if (led_an == 1) { Dimmer (1); } PORTC &= ~ ( (1 << MAGNET_KALT) | (1 << MAGNET_WARM) | (1 << MAGNET_TEIL) ) ; } break; //------------------------------------------------------------ case 0b10101111 : // Taster Duftstoff if (duft_an == 0 & pressed != 1 & dusche_an == 1 ) { pressed = 1; duft_an = 1; } else if (duft_an == 1 & pressed != 1 & dusche_an == 1 ) { pressed = 1; duft_an = 0; } break; //------------------------------------------------------------ case 0b10011111 : // Taster LED-Licht if (led_an == 0 & pressed != 1 & dusche_an == 1 ) { pressed = 1; led_an = 1; led_active = 0; } else if (led_an == 1 & pressed != 1 & dusche_an == 1 ) { pressed = 1; led_an = 0; led_active = 0; } break; //------------------------------------------------------------ case 0b10111111 : // Kontakt Dusche eingeschaltet waitMs(100); dusche_an = 1; pressed = 0; break; //------------------------------------------------------------ default : // kein Taster gedrückt / dusche aus dusche_an = 0; LED_Ausgabe(0) ; waitMs(100); pressed = 0; break; } } //------------------------------------------------------------ void led_blinken() { if (tropenregen_an == 1 & ledonoff == 0 ) // LED Tropenregen blinken { PORTD |= (1 <<LED_TROPENREGEN); ledonoff = 1; } else if (tropenregen_an == 1 & ledonoff == 1 ) { PORTD &=~ (1 <<LED_TROPENREGEN); ledonoff = 0; } if (regen_mitte_an == 1 & ledonoff == 0 ) // LED regen mitte blinken { PORTD |= (1 <<LED_REGEN_MITTE); ledonoff = 1; } else if (regen_mitte_an == 1 & ledonoff == 1 ) { PORTD &=~ (1 <<LED_REGEN_MITTE); ledonoff = 0; } if (erfrischung_an == 1 & ledonoff == 0 ) // LED Erfrischung blinken { PORTD |= (1 <<LED_ERFRISCHUNG); ledonoff = 1; } else if (erfrischung_an == 1 & ledonoff == 1 ) { PORTD &=~ (1 <<LED_ERFRISCHUNG); ledonoff = 0; } if (vitalregen_an == 1 & ledonoff == 0 ) // LED Vitalregen blinken { PORTD |= (1 <<LED_VITALREGEN); ledonoff = 1; } else if (vitalregen_an == 1 & ledonoff == 1 ) { PORTD &=~ (1 <<LED_VITALREGEN); ledonoff = 0; } } //------------------------------------------------------------ SIGNAL(SIG_OVERFLOW0) { timecount = timecount+1 ; // zähler erhöhen if (timecount == 10000) // wenn 1 sec { timecount = 0; led_blinken(); } } //---------------------------------------------------------------------- main () { DDRA = 0b00000000 ; PORTA = 0b11111111 ; DDRB = 0b00001000 ; PORTB = 0b11110111 ; DDRC = 0b11111111 ; PORTC = 0b00000000 ; DDRD = 0b11111111 ; PORTD = 0b00000000 ; pwmInit(); reset_all(); sei(); OCR2 = 255; do { Taster_abfragen () ; if (dusche_an == 1 ) { LED_Ausgabe(1) ; } } while (true); } //---------------------------------------------------------------------- Vielen Dank im vorraus schon für jede Hilfe :-)
Schön wäre es wenn du noch schreiben würdest welchen Compiler du verwendest und die Code Tags verwenden.
Das ganze hab ich mit dem MyAVR Workpad programmiert und nutze also auch dessen Ressourcen . Hat denn keiner eine Idee was die Fehler verursachen könnte ? . Vor allem der "Reset" ist besonders schlecht .
if ((tropenregen_an == 0) && (pressed != 1) && (dusche_an == 1)) das wäre so wohl besser .Hatte wohl falsch im Kopf das ein normales & die beiden mehr oder weniger verbindet und nicht als Einzelbedingung annimmt. Ich ändere das mal im PText
Hier ist eine Sackgasse. Dort geht es weiter: Beitrag "Unerklärlicher Reset AtMega16 nach Tastendruck"
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.