Forum: Mikrocontroller und Digitale Elektronik Probleme mit slbstgeschriebener C-Funktion


von Marco G. (grmg2010)


Lesenswert?

Moin,

für einen ATMEGA644 ich habe eine eigene Funktion geschrieben. Die 
Funktion soll beim Systemstart überprüfen, ob ein EEPROM hinterlegter 
Wert plausibel ist. Konkreter soll überprüft werden, ob die Ausgänge des 
Device geschaltet haben sollen oder nicht. Dazu ist eine RTC mit 
verbaut.

Wenn das Device nicht geschaltet hat, ist die Auswertung korrekt. Soll 
das Device jedoch an sein, geht er in den Fehlerzustand. Jetzt rage ich 
mich weshalb. Der Code ist bis auf die Vergleiche gleich. Auch stimmen 
die übergebenen Parameter(gebe ich auf einen LCD aus)
Hier mal der Code:
1
uint8_t CheckSwitchState(uint8_t State, uint8_t TimeOn, uint8_t TimeOff, uint8_t TimeOnWe, uint8_t TimeOffWe)
2
{
3
  uint8_t Minute, Hour, ValueOn, ValueOff, WDay;
4
  char BufferM[10];
5
  
6
  Hour = RetHour();
7
  Minute = RetMinute();
8
  WDay = RetWDay();
9
  
10
  itoa(Hour, BufferM, 10);
11
  lcd_gotoxy(8,1);
12
  lcd_puts(BufferM);
13
  itoa(TimeOn, BufferM, 10);
14
  lcd_gotoxy(0,1);
15
  lcd_puts(BufferM);
16
  itoa(TimeOff, BufferM, 10);
17
  lcd_gotoxy(5,1);
18
  lcd_puts(BufferM);
19
20
  if (WDay == 6 || WDay == 7)
21
  {
22
    /*Device on*/
23
    if (Hour >= TimeOnWe && Hour < TimeOffWe && State == 1)
24
    {
25
      ValueOn = 1;
26
    }
27
    else
28
    {
29
      ValueOn = 0;
30
    }
31
    
32
    /*Device off*/
33
    if (Hour < TimeOnWe && Hour > TimeOffWe && State == 0)
34
    {
35
      ValueOff = 1;
36
    }
37
    else
38
    {
39
      ValueOff = 0;
40
    }
41
  } 
42
  else
43
  {    
44
    /*Device on*/
45
    if (Hour >= TimeOn && Hour <= TimeOff && State == 1)
46
    {
47
      lcd_gotoxy(0,3);
48
      lcd_puts("on1");
49
      ValueOn = 1;
50
    }
51
    else
52
    {
53
      lcd_gotoxy(0,3);
54
      lcd_puts("on2");
55
      ValueOn = 0;
56
    }
57
    
58
    /*Device off*/
59
    if (Hour <= TimeOn && Hour >= TimeOff && State == 0)
60
    {
61
      lcd_gotoxy(10,3);
62
      lcd_puts("off1");
63
      ValueOff = 1;
64
    }
65
    else
66
    {
67
      lcd_gotoxy(10,3);
68
      lcd_puts("off2");
69
      ValueOff = 0;
70
    }
71
  }
72
  
73
74
  
75
  if ((ValueOff == 1 && ValueOn == 0) || (ValueOff == 0 && ValueOn == 1))
76
  {
77
    return 1;
78
  } 
79
  else
80
  {
81
    led_bl(0);
82
    led_rt(0);
83
    return 0;
84
  }
85
  
86
}

Die Variable State soll hierbei den aus dem EEPROM ausgelesenen 
eigentlichen Status verarbeiten.

von Jonas B. (jibi)


Lesenswert?

Moin,

ich geb mal meinen Senf dazu ab:

Funktionsnamen: "CheckSwitchState" Welcher Switch? Welcher Status?
Warum 2 Variablen für einen Zustand? ValueOn, ValueOff

Warum nicht Device.isOpen als Struktur gebaut? Ach da ist viel zu viel 
im argen...

GRuß J

von PittyJ (Gast)


Lesenswert?

Anscheinend sind doch alle Werte auch auf dem LCD?
Warum vergleichst du nicht die Werte mit den IF-Entscheidungen?

von Marco G. (grmg2010)


Lesenswert?

PittyJ schrieb:
> Anscheinend sind doch alle Werte auch auf dem LCD?
> Warum vergleichst du nicht die Werte mit den IF-Entscheidungen?

Das stimmt, und daher bin ich verwundert dass der Else-Zweig aufgerufen 
wird. Nach den dargestellten werten sollte die Bedingung wahr sein, 
nicht falsch.

Als Beispiel: OnHour ist 14, Hour ist 14, OffHour ist 6 und State ist 1
Dann stünde doch dar:
1
if (14 >= 14 && 14 <= 6 && 1 == 1)
2
    {
3
      lcd_gotoxy(0,3);
4
      lcd_puts("on1");
5
      ValueOn = 1;
6
    }
7
    else
8
    {
9
      lcd_gotoxy(0,3);
10
      lcd_puts("on2");
11
      ValueOn = 0;
12
    }

Edit: Ok das hat es nochmal gebracht es so aufzuschreiben. Da war ein 
Denkfehler drin.Es muss wie folgt lauten
1
if (Hour >= TimeOn && Hour >= TimeOff && State == 1)
2
    {
3
      lcd_gotoxy(0,3);
4
      lcd_puts("on1");
5
      ValueOn = 1;
6
    }
7
    else
8
    {
9
      lcd_gotoxy(0,3);
10
      lcd_puts("on2");
11
      ValueOn = 0;
12
    }

: Bearbeitet durch User
von Walter S. (avatar)


Lesenswert?

Marco G. schrieb:
> Soll
> das Device jedoch an sein, geht er in den Fehlerzustand.

was heißt Fehlerzustand?

von Marco G. (grmg2010)


Lesenswert?

Die Funktion gibt dann 0 zurück, was in der main dann weiter ausgewertet 
wird. Ich habe den Fehler aber bereits gefunden :) Ein < bzw > Verglich 
war fehlerhaft

von Cyblord -. (cyblord)


Lesenswert?

Marco G. schrieb:
> Die Funktion gibt dann 0 zurück, was in der main dann weiter ausgewertet
> wird. Ich habe den Fehler aber bereits gefunden :) Ein < bzw > Verglich
> war fehlerhaft

Der grundlegende Fehler, also sozusagen die Wurzel des Übels, wird ja 
bereits in der Überschrift genannt: Du hast selbst eine C-Funktion 
geschrieben. Lass das einfach in Zukunft.

von wrdlbrmft (Gast)


Lesenswert?

Cyblord -. schrieb:
> Marco G. schrieb:
>> Die Funktion gibt dann 0 zurück, was in der main dann weiter ausgewertet
>> wird. Ich habe den Fehler aber bereits gefunden :) Ein < bzw > Verglich
>> war fehlerhaft
>
> Der grundlegende Fehler, also sozusagen die Wurzel des Übels, wird ja
> bereits in der Überschrift genannt: Du hast selbst eine C-Funktion
> geschrieben. Lass das einfach in Zukunft.

Kannst du nicht einfach mal deine unendlich arrogante Fresse halten?

Scheinbar hast du noch nieeee einen Fehler gemacht und mußtest auch noch 
nie was lernen. Denn bekanntermaßen bist du ja mit dem Wissen des 
gesamten Universums geboren worden. Aber lass dir sagen, das ist nicht 
bei jedem so. Es gibt Menschen, da steigt das Wissen erst im Laufe des 
Lebens. Und bei denen ist es so, dass sie aus Fehlern lernen. Das ist 
dir fremd, da du keine Fehler machst. Aber vielleicht kannst du auch mal 
akzeptieren, daß es Menschen gibt, die verschiedene Sachen lernen 
müssen. Und da ist so ein grosskotziger Kommentar wie deiner völlig 
daneben..

von Kuschelpädagoge (Gast)


Lesenswert?

Cyblord -. schrieb:
> Der grundlegende Fehler, also sozusagen die Wurzel des Übels, wird ja
> bereits in der Überschrift genannt: Du hast selbst eine C-Funktion
> geschrieben. Lass das einfach in Zukunft.

Ach komm. Bei der ersten selbstgeschriebenen Funktion kann schon mal was 
schief gehen.

von nicht"Gast" (Gast)


Lesenswert?

Moin,

ich will auch mal meinen Senf dazu geben :)

du nennst die Funktion CheckSwitchState machst aber tausend andere 
sachen drin. Du solltest das besser aufteilen.


Zähle mal, wie oft du die kombination lcd_goto und lcd_puts drin hast. 
Mach das in eine Funktion, die lcd_puts_at(char* toPrint, uint posX,uint 
posY) heißen kann. Du wirst sehen, das mach den Code deutlich lesbarer.
Eine zusätzliche lcd_puti_at(uint8_t toPrint, uint posX, uint posY) ist 
auch hilfreich.


Benenne die LEDs nach ihrer Funktion, nicht nach ihrer Farbe. Was soll 
denn  led_bl(0) und led_rt(0) bedeuten, und warum werden sie hier 
(vermutlich) ausgeschaltet. Wenn man das wissen will, muss man erst in 
der Funktion suchen und dann auch noch im Schaltplan. Das ist nicht gut.

was passiert eigentlich, wenn die Startzeit größer als die Endzeit ist?

von Marco G. (grmg2010)


Lesenswert?

Die LCD-Ausgaben waren nur fürs Debugging. Die sind normal nicht 
enthalten.

Die beiden Zeiten TimeOn und TimeOff werden in der eigentlichen Main aus 
d EEPROM geholt. Sie sind also immer gleich, solange sie dort nicht 
geändert werden.
Stimmt der ausgelesene Status mit dem vorher definierten Zeitrahmen 
überein, wird ein true zurückgegeben, wenn dies nicht der Fall ist, wird 
ein false zurück gegeben. Das wird dann in der main noch 
weiterverarbeitet.

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
Noch kein Account? Hier anmelden.