Kann ich meine eingeschalteten LED so zählen?
oder habt ihr einen anderen Vorschlag?
Ich habe 7 LED und ich möchte einen bestimmten Vorgang "restart"
einleiten, wenn 7 oder mehr LED an sind
Peter schrieb:> Ich habe 7 LED und ich möchte einen bestimmten Vorgang "restart"> einleiten, wenn 7 oder mehr LED an sind
Wie können bei 7 LEDs mehr als 7 an sein?
Wenn die Zahl der LEDs unwichtig ist und es nur interessant it ob alle 7
an sinf oder nicht sind geht es so schnellet
Peter schrieb:> if( count>8 )> count--; }
Kann niemals wahr werden.
Peter schrieb:> if( count >= 1){> return 7;> if(count<=7){> restart
Wie willst du die untere Abfrage erreichen ?
Und wo fängt was an, wo endet es ?
Peter schrieb:
Was soll denn der ganze Palawatsch mit ...
> if( count <= 6 )> count++;> }else{> if( count>8 )> count--; }
Zähl halt einfach, wieviele Bits auf 1 sind
1
count=0;
2
3
if(PORTB&(BIT_2))
4
count++;
5
6
if(....)
7
count++;
8
9
...
nachdem du alle Bits geprüft hast, hast du die Anzahl der brennenden
LEDs.
> Ich habe 7 LED und ich möchte einen bestimmten Vorgang "restart"> einleiten, wenn 7 oder mehr LED an sind
Ja dann mach das doch
1
if(count>=7)
2
restart
wo ist denn da jetzt das Problem, bzw. warum muss man da so kompliziert
rumtricksen während man die Portbits abklappert?
Ich persönlich würde ja ganz einfach bei jedem Einschalten einer LED
einfach einen Zähler erhöhen bzw. beim jeweiligen Ausschalten der LED
den Zähler wieder verringern, so dass ich zu jedem Zeitpunkt die Anzahl
der brennenden LED in dieser globalen Zählvariable vorliegen habe. Aber
das kann jeder halten wie er will.
Karl Heinz schrieb:> Ich persönlich würde ja ganz einfach bei jedem Einschalten einer LED> einfach einen Zähler erhöhen bzw. beim jeweiligen Ausschalten der LED> den Zähler wieder verringern, so dass ich zu jedem Zeitpunkt die Anzahl> der brennenden LED in dieser globalen Zählvariable vorliegen habe. Aber> das kann jeder halten wie er will.
Überlesen. Aus dem OT
> Ich habe 7 LED und ich möchte einen bestimmten Vorgang> "restart" einleiten, wenn 7 oder mehr LED an sind
Das ist eine extrem komplizierte Umschreibung für: Wenn alle LED
brennen.
Das lässt sich aber leicht feststellen. Du kennst die Portbits aller LED
und die müssen alle (offenbar) auf 1 sein. Ohne Ausnahme. Das ist eine
simple Abfrage. Da muss man noch nicht einmal zählen.
Die Einrückungen sind sehr irreführend. Der Code mach beim zweiten
hinschauen etwas ganz anderes, als auf den ersten Blick. Im Sinne der
lesbarkeit rate ich Dir dazu, den Code so zu formatieren, dass die
Einrückung der Klammerung entspricht - also so, wie es auch jeder Editor
mit Auto-Format macht.
So ist es besser:
stefan us schrieb:> Eingänge liest man über das Register PINC!
Aber nur die an PORTC, die LEDs an PORTB kann er damit nicht einlesen.
Wenn er die LEDs erst in Software durch setzten des entsprechenden bits
in PORTx einschaltet kann er sie auch über das PORTx Register abfragen.
stefan us schrieb:> Eingänge liest man über das Register PINC!
Das passt schon.
Er will wissen, wieviele Ausgänge vom Rest des Programms auf 1 gesetzt
wurden. Das kann er mit dem jeweiligen PORT Register machen.
stefan us schrieb:> Eingänge liest man über das Register PINC!
Ne, er schaltet die LEDs selber.
Karl Heinz schrieb:> Das ist eine extrem komplizierte Umschreibung für: Wenn alle LED> brennen.
Ja.
(PORTB & 0xFE) == 0xFE
Max H. schrieb:> Die LEDs an PORTC kann er damit nicht erfassen...
Ja, du hattest natürlich schon bei deiner ersten Antwort recht...
Ich war ganz einfach verblüfft über die Unsinnigkeit - war aber
nicht der einzige, Karl Heinz hat es auch erwischt ;-))
Peter schrieb:> return count;>> if(count==7){> restartGame();> }>>>> Habe es nun so, aber es funktioniert dennoch nicht.>> Habe ich irgendwo noch einen Fehler?
überleg mal, wie die Funktion wohl jeh zur Auswertung auf 7 kommen soll,
wenn vorher ein return statt findet?
Marc Vesely schrieb:> Peter schrieb:>> Habe ich irgendwo noch einen Fehler?>> Ja.> PORTB und PORTC, nicht PINB und PINC.
Ich fände PORTx auch naheliegender, ist aber in diesem Fall egal. Im PIN
Register spiegelt sich die Bitposition der PORT Register wieder, wenn
die Pins auf Ausgang geschaltet sind. Es gibt beim setzen oder löschen
eines Bits eine kleine Verzögerung von, wenn ich mich recht erinnere, 1
oder 2 Takten. Aber das dürfte hier keine Rolle spielen.
stefan us schrieb:> Es geht noch kompakter, aber ich finde es weniger gut lesbar:> uint8_t count=0;> for (uint8_t mask=1; mask<128; mask<<=1) {> count++;> }> printf("count=%i",count);
Wo fragst du hier den Port ab? Ich denke, da fehlt noch was, oder :-)
leider wird der restart nicht durchgeführt, die LEDs bleiben an.
wenn ich den restart direkt an den Anfang der while schelife setze,
funktioniert er aber, also muss es noch ein Problem geben
Peter schrieb:> #define BIT_1 (1 << PC1)> #define BIT_2 (1 << PB2)> #define BIT_3 (1 << PB1)> #define BIT_4 (1 << PC3)> #define BIT_5 (1 << PC2)> #define BIT_6 (1 << PC4)> #define BIT_7 (1 << PC5)
Wenn das so ist funktioniert meine Lösung aus dem ersten Post nicht.
P.S: Ich finde es so verwirrend... Ich glaube so gut wie jeder hat
gedacht, das BIT_1 (1<<1), BIT_2 (1<<2),..., BIT_n (1<<n) ist.
Korrigiert nicht wenn ich falsch liege…
Peter schrieb:> leider wird der restart nicht durchgeführt, die LEDs bleiben an.> wenn ich den restart direkt an den Anfang der while schelife setze,> funktioniert er aber, also muss es noch ein Problem geben
Setzt das return nach dem if
uint8_t count = 0;
if((PORTB&0x0C)|(PORTC&0xF2)==0xFE) {
restartGame();
}
das programm springt jetzt in den resart. allerdings nicht, wenn alle 7
LED an sind, sondern beim drücken von bestimmten tastern
Karl Heinz schrieb:> die Pins auf Ausgang geschaltet sind. Es gibt beim setzen oder löschen> eines Bits eine kleine Verzögerung von, wenn ich mich recht erinnere, 1> oder 2 Takten.
Atmel sagt, 1 NOP zwischen OUT und IN ist nötig.
> Aber das dürfte hier keine Rolle spielen.
Ja. Ich meine Nein. Ich meine du hast Recht.
Max H. schrieb:> P.S: Ich finde es so verwirrend... Ich glaube so gut wie jeder hat> gedacht, das BIT_1 (1<<1), BIT_2 (1<<2),..., BIT_n (1<<n) ist.> Korrigiert nicht wenn ich falsch liege…
Habe ich auch erst gedacht, aber wenn er seine LEDs so verdrahtet hat,
dann ist es eben so. Vielleicht sollte man dann die Definitionen nicht
"BIT_1" "BIT_2" usw. nennen, sondern "LED_1" "LED_2". Das bringt weniger
Verwirrung.
Peter schrieb:> leider wird der restart nicht durchgeführt, die LEDs bleiben an.> wenn ich den restart direkt an den Anfang der while schelife setze,> funktioniert er aber, also muss es noch ein Problem geben
weil zuvor ein return steht!
Lies doch mal deinen Code
Marc, dieser Code gibt 2 Fehler aus,
Error 1 lvalue required as unary '&' operand C:\Dokumente und
Einstellungen\sams\Desktop\Interaktive LED\Programm\interaktive LED.c
255 24 interaktive LED
Error 2 expected ';' before '{' token C:\Dokumente und
Einstellungen\sams\Desktop\Interaktive LED\Programm\interaktive LED.c
255 45 interaktive LED
Peter schrieb:> Marc, dieser Code gibt 2 Fehler aus,
Zeig doch mal, was du geschrieben hast.
Marcs Code ist ok. Ist im Grunde derselbe wie vorher, nur dass die
Vergleichswerte andere sind und den tatsächlichen Bitpositionen
entsprechen (wenn ich mich im Kopf nicht vertan habe)
Man könnte das auch noch ein wenig anders schreiben, so dass die Gefahr
sich an dieser Stelle in den Bits zu vertun etwas gemildert ist, aber
syntaktisch ist da erst mal alles in Ordnung in Marcs Code.
Daniel H. schrieb:> Wie wäre es so?> uint8_t i;> uint8_t count = 0;>> for(i = 0; i < 8; i++) {> count += (PORTB >> i) & 1;> }
Die LEDs sin immer noch auf PORTB und PORTC verteilt.
Max H. schrieb:> if(((PORTB&0x06)==0x06) && ((PORTC&0x3E)==0x3E))
Also, wenn ich die Klammern für ihn zählen muß...
Aber, AndAlso habe ich wirklich übersehen.
uint8_t count = 0;
if(!((PORTB&0x06)==0x06) && ((PORTC&0x3E)==0x3E)) {
restartGame();
}
der Code startet das Spiel neu, wenn man erst alle LED an macht und dann
wieder aus, also schon mal sehr gut, nur dass es bereits geschehen soll,
wenn alle LED an sind
WEnn dann der Restart immer noch nicht ausgelöst wird, obwohl alle LED
brennen, solltest du dir mal überlegen, ob deine LED wirklich genau dann
brennen, wenn am Port ein 1 Bit ausgegeben wird oder ob das nicht
umgekehrt ist.
Karl Heinz schrieb:> void checkForRestart()> {> if( ( ( PORTB & ALL_ON_B ) == ALL_ON_B ) &&> ( ( PORTC & ALL_ON_C ) == ALL_ON_C ) )> restartGame();> }>> WEnn dann der Restart immer noch nicht ausgelöst wird, obwohl alle LED> brennen, solltest du dir mal überlegen, ob deine LED wirklich genau dann> brennen, wenn am Port ein 1 Bit ausgegeben wird oder ob das nicht> umgekehrt ist.
Ich glaube, er schaltet die LEDs in restartGame() nicht aus. Da fehlt
ganz einfach so etwas wie AllLedOff(), oder so.
Karl Heinz vielen Dank.
Es besteht noch das Problem, dass der Restart erst ausgeführt wird, wenn
ich alle LED ausschalte. Was muss ich ändern, sodass dieser ausget wird,
wenn alle an sind?
Peter schrieb:> Es besteht noch das Problem, dass der Restart erst ausgeführt wird, wenn> ich alle LED ausschalte. Was muss ich ändern, sodass dieser ausget wird,> wenn alle an sind?
Er wird ausgeführt, nur du merkst es nicht, weil du die LEDs in Restart
nicht ausmachst.
Meiner Meinung nach.
Marc Vesely schrieb:> Er wird ausgeführt, nur du merkst es nicht, weil du die LEDs in Restart> nicht ausmachst.> Meiner Meinung nach.
Klingt vernünftig.