Probleme beim Programmieren in C
Hallo :-)
Ich bin Neuling und versuche einen AVR-Controller zu programmieren.
Nun ist es so, dass ich einen Schalter (keinen Taster!) an einen Port des AVR geschaltet habe und es logischerweiße 2 Schaltzustände gibt "an" und "aus".
Problem:
Es soll einmalig etwas getan werden, wenn sich der Schalt-Status ändert und nicht als Endlosschleife.
while(1) {
if ( !(PINC & (1<<PINC0)) ) {
[b]mache 1x das uns das[/b]
}
Da ein Schalter im Gegensatz zu einem Taster seinen Zustand beibehält, würde diese Hauptschleife dafür sorgen, dass am laufenden Band die gewünschte Aktion durchgeführt wird.
Gibt es irgendeinen Trick bzw. eine Routine, wie ich bei einem dauerhaften Zustand nur einmal
bei einer Zustandsänderung etwas ausführen lassen kann und nicht kontinuierlich?
Danke!!!
Antwort schreiben
Antwort 1 von Jaja vom 20.10.2019, 12:03 Options
müsstest halt noch ne variable (Byte) definieren und wenn die Funktion ausgeführt wird den Wert dort setzen- anschließend kannst du testen, ob die Funktion schon ausgeführt wurde...
Antwort 2 von JackDauert vom 20.10.2019, 12:30 Options
So einfach, dass ich nicht selber drauf gekommen bin. Danke für den Tip.
while(1) { // Hauptschleife
if ( !(PINC & (1<<PINC0)) ) {
*led aufleuchten lassen*
if (statuson == 0) { // Prüfen, ob schon was getan worden ist
[b]führe das und das aus[/b] ; // Wenn nicht, machen!
statuson = 1
statusoff = 0
}
}
else {
*led ausschalten*
if (statusoff == 0) { // Prüfen, ob schon was getan worden ist
[b]führe das und das aus[/b] ; // Wenn nicht, machen!
statuson = 0
statusoff = 1
}
}
return 0;
}
Also...es sollen beim An- und Ausschalten zwei unterschiedliche Aktionen ausgeführt werden. Für das Anschalten habe ich die Variable statuson gewählt und für das Ausschalten die Variable statusoff. 0 bedeutet, es wurde noch nichts getan, 1 bedeutet, es wurde schon etwas getan...
Habe ich im Code einen Denkfehler drin vom Syntax her oder geht es in die richtige Richtung?
Antwort 3 von Jaja vom 20.10.2019, 12:46 Options
1. deine kommentare sin inkorrekt. /* kommentar */
2. eine variable würde reichen:
Status=x; x=0 (led off) x=1 (led on)
Antwort 4 von JackDauert vom 20.10.2019, 13:01 Options
Oh, ok....dann ändere ich die Kommentare schnell, damit sie richtig sind.
Ich habe einen kleinen Fehler in meiner Problembeschreibung gemacht. Die LEDs haben nichts mit dem Befehl zutun, den ich ausführen möchte und stehen nur als Platzhalter im Code (damit ich hier im Forum für keine Verwirrung mit unnötigen Programmteilen sorge).
while(1) { // Hauptschleife
if ( !(PINC & (1<<PINC0)) ) {
if (statuson == 0) { /* Prüfen, ob schon was getan worden ist */
führe das und das aus ; /* Wenn nicht, machen! */
statuson = 1
statusoff = 0
}
}
else {
if (statusoff == 0) { /* Prüfen, ob schon was getan worden ist */
führe das und das aus ; /* Wenn nicht, machen! */
statuson = 0
statusoff = 1
}
}
return 0;
}
Gibt es vom Syntax oder von der Programmierung her etwas zu bemängeln? Ich kann den Code leider noch nicht testen, da die Hardware momentan von einem Freund auf eine Platine gebracht wird und wollte die Zwischenzeit für die Programmierung nutzen.
Antwort 5 von Jaja vom 20.10.2019, 13:07 Options
1.diese kommentare waren schon richtig, nur die mit * nicht ;)
2. also hast du 2 unterschiedliche sachen, die du abfragst, nicht nur einen schalter?
Ansonsten würde dennoch 1 variable reichen.
Antwort 6 von JackDauert vom 20.10.2019, 13:13 Options
Zu 1: Huch....okay :-)
Zu 2: Ich frage nur einen Schalter ab. Wenn sich der Status von Aus nach An ändert, soll über die UART-Schnittstelle die Nachricht "Ich bin jetzt an" gesendet werden (nicht wörtlich nehmen, die Übertragung findet per MIDI statt). Wenn sich der Status von An nach Aus ändert, soll gesendet werden "Ich bin jetzt aus." - da in der MIDI-Signalkette noch weitere Geräte hängen, möchte ich kein Dauer-Status senden, sondern einmal bei einer Schaltänderung genügt...
Antwort 7 von Jaja vom 20.10.2019, 14:04 Options
if ( PINC & (1<<PINC0) ) /* nehme an false? -> Schalter geschlossen*/
{
if (status == 0) /* es wurde noch nichts gemacht */
{
führe das und das aus ;
status = 1;
}
else /* impliziert status == 1 , d.h. es wurde schon ausgeführt */
{
führe das und das aus ;
}
}
else /* Schalter ist offen */
{
blah blah;
}
kannst dann noch deine "Hauptschleife" drumrumbasteln...