Supportnet / Forum / Anwendungen(Java,C++...)
Probleme beim Programmieren in C
Frage
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.
[code]
while(1) {
if ( !(PINC & (1<<PINC0)) ) {
[b]mache 1x das uns das[/b]
}
[/code]
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 [i]bei einer Zustandsänderung[/i] etwas ausführen lassen kann und nicht kontinuierlich?
Danke!!!
Antwort 1 von Jaja
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
So einfach, dass ich nicht selber drauf gekommen bin. Danke für den Tip.
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?
while(1) { // Hauptschleife
if ( !(PINC & (1<<PINC0)) ) {
*led aufleuchten lassen*
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 {
*led ausschalten*
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;
}
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
1. deine kommentare sin inkorrekt. /* kommentar */
2. eine variable würde reichen:
Status=x; x=0 (led off) x=1 (led on)
2. eine variable würde reichen:
Status=x; x=0 (led off) x=1 (led on)
Antwort 4 von JackDauert
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).
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.
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
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.
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
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...
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
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...

