PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED Blink-Interval durch Sensor-Wert steuern..



nion
12.03.2012, 16:52
Hallo Zusammen!

Ich bin neu hier im Forum, bzw. ich hab mich vor 1-2 Jahren mal angemeldet aber bis jetzt nur ein bisschen mitgelesen.
Habe mir auch mal ein RN-Controll Board zusammengelötet bis jetzt aber noch nichts programmiert.
Programmieren möchte ich in C da ich das vor mehr als 10 Jahren in der Schule hatte.
Ist nicht viel hängen geblieben aber es hilft schon ein bisschen beim Verständnis.. ;-)


Zu meiner Frage:
Ich möchte eine LED abhängig vom Sensor-Messwer in einem frei definierbaren Intervall blinken lassen.

Beispiel:
Intervall -> 10
LED blink wenn sich der Sensor-Wert um 10 Einheiten ändert.

Meine Lösungsansätze:

1.
Modulo-Operation -> Sensor-Wert % 10 = Rest
-> 100 % 10 = 0
-> 95 % 10 = 5
-> 90 % 10 = 0
Entspricht der Rest=0 soll die LED blinken.

2.
Einen Messwert speichern und dann den aktuellen Ist-Wert vom gespeicherten Messwert subtrahieren bis die Differenz dem Intervall-Wert entspricht.

Wert_1 - Ist_Wert = Differenz
Differenz = 10 -> LED blinkt

Meines Verständnis nach müsste beides funktionieren, kann mich aber auch irren.
Welches wäre für so eine Aufgabe die beste Lösung?


Danke für eure Hilfe!

Kampi
12.03.2012, 16:56
Hi und willkommen

eine einfache Methode wäre es z.B. wenn du eine Select-Case Abfrage machst (z.B. in 10% Schritte).
Und zu jedem Case hast du dann passende Timer-Werte und in der Timer-ISR wird die LED dann getoggled.
Zum Beispiel so (musst du nur in C übersetzen):

Select Case Sensorwert
Case 10 : Timerwert = 100
Case 20 : Timerwert = 200
Case 30 : Timerwert = 300
usw.

So musst du nur den Sensorwert in eine Zahl zwischen 0 und 100 umrechnen und den Timerwert in das Timer-Register schreiben.

Calis007
13.03.2012, 12:01
Ein Grundproblem, dass ich bei beiden Loesungen sehe: Du gehst davon aus, dass sich der Sensorwert immer nur in Einserschritten aendert. Das tut der nur in den seltensten Faellen (bei mir jedenfalls). Du solltest also mit einer Messreihe 100,97,93,88,81,79 .. rechnen. Modulo taugt da gar nicht (ist sogar falsch: wenn der Wert wieder 100 erreicht ist die Differenz Null und es blinkt ..), ich wuerde die 2. Variante so abaendern, dass auf >= statt auf = 10 getestet wird.
Ausser Du willst wirklich nur blinken, wenn der Unterschied exakt 10 betraegt (da frag ich mich aber, wozu das gut sein sollte ;)

durchgebrannt
13.03.2012, 13:14
Hallo,
besser wäre es wahrscheinlich, wenn du den CTC-Mode eines Timers verwendest, dann Sensorwert einfach zu skallieren und in das Compare-Register zu schreiben.
Gruß Jannis

nion
16.03.2012, 21:33
Hallo,
Ich habe mir jetzt mal ein kleines C-Programm geschrieben (mit TryC auf dem Mac), welches dazu verwendet werden könnte.
Muss natürlich noch angepasst werden aber vom Prinzip her funktioniert es. :-)
__________________________________________________ ________________________
#include <stdio.h>

int a; //Time (Zeit zwischen Messwert_1 & Messwert_2)
int b; //Differenz (Messwert_1 - Messwert_2)
int c; //Zähler_1 (Bestimmt die Time-Differenz)
int d; //Time-Differenz
int e; //Zähler_2 (Bestimmt die Anzahl Ausgaben)

int main (void)
{
a = 100; //Zeit zwischen den Messwerten 1 & 2
c = 0; //Initialisierung von Zähler_1
e = 0; //Initialisierung von Zähler_2


printf("Differenz eingeben: "); //Abfrage: Differenz (Messwert_1 - Messwert_2)
scanf("%d", &b);

d = a/(b+1); //Berechnet die Zeit zwischen der Ausgabe

while(e<b+1) //zählt die Zeit ab
{
do
{
printf("%d\n", c); //Ausgabe der einzelnen Zählerschritte
c++; //erhöht Zähler_1 um +1
} while(d>c); //stoppt den Zähler_1
c = 0; //setzt den Zähler zurück
e++; //erhöht Zähler_2 um +1
if(e<b+1) //zählt die Ausgabe
{
printf("Ausgabe\n"); //Ausgabe z. B. LED oder Signalton
}


}

return 0;
}
__________________________________________________ ________________________