Gast
#1925872
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 :-)