Folgende Frage: Was steht in der Variable port_b ?? Dieses ist wichtig für die Abfrage case-Anweisung (da wo jetzt 1,2,3 .. steht). Leider habe ich dies nirgendswo gefunden und auch beim rumprobieren nciht rausgefunden PINB ist ein Eingang ... if ( (!(PINB & (1<<PINB0))) || (!(PINB & (1<<PINB1))) || (!(PINB & (1<<PINB3))) || (!(PINB & (1<<PINB4))) || (!(PINB & (1<<PINB5))) ) { port_b=PINB; switch(port_b) { case 1: pw_org[counter]='0'; counter++; break; case 2: pw_org[counter]='1'; counter++; break; case 3: pw_org[counter]='2'; counter++; break; case 4: pw_org[counter]='3'; counter++; break; case 5: pw_org[counter]='4'; counter++; break; case 6: pw_org[counter]='5'; counter++; break; } } ... DANKE !!!
Jedes Bit steht für einen Pin. Bit0 gibt den Status von PB0 an und so weiter bis Bit7 = Status von PB7.
das weiß ich... aber ich möchte gern wissen was genau für ein wert in der variable port_b steht.
Hallo also in port_b steht das was von PINB eingelesen wird. Und was an PortB anliegt hängt davon ab was an den Pins von PortB angeschlossen ist. Hängt also alles von der Hardware ab. mfg Max
ja genau aber was steht denn nun in port_b... ich habe das myavr board und habe den ersten taster an portb angeschlossen. so den drücke ich nun. und was steht in port_b??? steht da 0x01 oder 0b00000001 oder steht da noch was ganz andres drin?
Andreas wrote: > ja genau aber was steht denn nun in port_b... Eine Binärzahl. Jedes Bit dieser Binärzahl entspricht dem aktuellen Zustand am jeweiligen Eingangspin des µC. > ich habe das myavr board > und habe den ersten taster an portb angeschlossen. so den drücke ich > nun. und was steht in port_b??? Da du nicht schreibst, was an den restlichen Portpins hängt ist es müssig darüber zu spekulieren, was das Ergebnis sein könnte. Wenn der Taster am Eingang PortB-PB0 angeschlossen ist, so erhältst du eine Zahl deren niederwertigstes Bit gesetzt oder nicht gesetzt ist, je nachdem ob der Taster gedrückt ist oder nicht. > steht da 0x01 oder 0b00000001 oder steht beides sind verschiedene Schreibweisen für dasselbe. > da noch was ganz andres drin? Da können auch andere Bits gesetzt sein, je nachdem wie die Aussenbeschaltung des Ports aussieht und je nachdem welche PortPins auf Eingang geschaltet sind. Wenn dich nur das eine Bit interessiert, welches mit dem Taster am Pin PB0 korrespondiert, ist es das allerbeste, dafür zu sorgen, dass an allen Bits ausser dem PB0 definierte Verhältnisse herrschen. Dazu liest man den Port komplett ein und setzt zb. gezielt alle Bits ausser dem PB0 definiert auf 0 uint8_t portb = PINB; portb &= 0x01; // alle Bits ausser dem niederwertigsten gezielt // auf 0 setzen Ist eine Möglichkeit. Wenn du nacheinander abfragen willst, ob ein Taster (weil du mehrere hast) gedrückt ist, dann ist es am einfachsten das auch so auszudrücken: Abfrage: Ist der Taster gedrückt oder im Code if( ( PINB & 0x01 ) = 0x01 ) // Taster an PB0 gedrückt oder einfacher if( PINB & 0x01 ) // Taster an PB0 gedrückt (dazu die Annahme, dass das Bit auf 1 geht, wenn der Taster gedrückt wurde) Da in dieser Schreibweise aber nicht sehr klar ist, dass 0x01 dem Zustand von PB0 entspricht, kann man das auch so schreiben if( ( PINB & ( 1 << PB0 ) ) // Taster gedrückt Aber auch hier wieder: Das ist nur eine andere Schreibweise. Funktional sind alle 3 Version gleichwertig.
Ach ja. Eines noch. Hast du abgeklärt, ob der Eingansgpin auf 0 oder auf 1 geht, wenn der Taster gedrückt wurde. Meistens ist es nämlich so, dass der Ruhezustand eine 1 ist und nur wenn der Taster gedrückt wird, dann wechselt der Portpin zu 0. Für die Programmierung spielt das nur insofern eine Rolle, als dass man diesen Unterschied nur berücksichtigen muss. Die Programmierung wird dadurch aber nicht schwieriger. Auf der anderen Seite ist aber die Hardware hier ein klein wenig einfacher. Und deshalb wird diese Variante ( Ruhezustand = 1, Taste gedrückt -> 0) gerne genommen.
Und nochwas. Ich habe den Eindruck, dass du mit dem Binärsystem noch nicht so richtig firm bist. Betrachten wir mal das Dezimalsystem. Eine Zahl 245 ksnn man zerlegen in 2 * 100 + 4 * 10 + 5 * 1 Das ist das Prinzip unseres Stellenwertsystems. Jede Ziffer (2,4,5) repräsentiert einen anderen Wert, je nachdem an welcher Stelle sie auftaucht. Die 2 in 245 repräsentriert einen anderen Wert (nämlich 200) als die 2 in 23 (nämlich zwanzig). Und da jede Stelle immer den 10-fachen Wert der Stelle unmittelbar rechts von ihr repräsentiert, heist unser gewohntes System das Zehnersystem oder eben Dezimalsystem. Das Binärsystem ist dazu völlig analog, nur dass jede Stelle immer den 2-fachen Wert der Stelle unmittelbar rechts von ihr repräsentiert. Dafür hat man aber den Vorteil, dass man keine 10 Ziffern (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) wie im Dezimalsystem benötigt, sondern nur deren 2 (0, 1) Wie funktioniert nun das Zählen im Dezimalsystem? Man beginnt mit 0 und geht der Reihe nach alle Ziffern durch: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 damit ist man mit den Ziffern am Ende. Was passiert jetzt? Jetzt wird die Stelle unmittelbar links um 1 erhöht und man beginnt wieder bei 0, also mit der ersten Ziffer. SO erhalten wir 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 Und wieder: In der niederwertigsten Stelle sind alle Ziffern durch. Um nochmal um 1 zu erhöhen, wird wieder die nächste Stelle links davon um 1 erhöht und schon kann das Spielchen wieder bei 0 weiter gehen. Die Stelle links von der 'Zählstelle' war aber schon 1. Wird die um 1 erhöht, dann kommen wir zu 2. D.h. die nächsten 'Zahlen' sind dann 20, 21, 22, 23, 24, 25, 26, 27, 28, 29. etc. etc. Genau dasselbe kann man auch im Binärsystem machen. Die ersten beiden Zahlen lauten 0, 1 mehr geht nicht. Wir haben keine weiteren binären Ziffern mehr (es gibt ja nur 0 und 1). Um da jetzt wieder 1 addieren zu können, passiert genau dasselbe: Die nächste Stelle links davon wird um 1 erhöht. Die nächsten Zahlen lauten daher 10, 11. Eine weitere Addition von 1 erfordert also, dass die links STelle wieder um 1 erhäht wird. Das geht aber nicht mehr, da diese Stelle bereits 1 ist und es keine weitere mögliche Ziffer an dieser Stelle gibt. Also machen wir genau dasselbe was wir auch im Dezimalsystem machen, wenn wir bis 99 gezählt haben: Wir eröffnen wieder eine Stelle links davon und erhöhen sie um 1. Im Dezimalsystem machen wir so den Übergang von 99 nach 100. Im Binärsystem erfolgt analog der Übergang von 11 zu 100. Wenn wir also mal eine Tabelle der Zahlen aufstellen, so erhalten wir Binär dieselbe Zahl als Dezimalzahl 0 0 1 1 10 2 11 3 100 4 101 5 110 6 111 7 1000 8 1001 9 1010 10 1011 11 1100 12 1101 13 1110 14 1111 15 10000 16 10001 17 10010 18 10011 19 ... ... Natürlich kann man nun immer abzählen welche Binärzahl welcher Dezimalzahl entspricht, aber auf Dauer ist das doch etwas mühsam. Die Frage ist daher: Gibt es eine Möglichkeit auszurechnen, wie die jeweils andere Repräsentierung aussieht? Ja, klar. Die gibt es. Das geht ganz einfach über die Definition. Im Zehnersystem war es ja so 2 * 100 + 4 * 10 + 5 * 1 = 245 Im Binärsystem kann man ganz analog rechnen: 10011 = 1 * 16 + 0 * 8 + 0 * 4 + 1 * 2 + 1 * 1 = 16 + 2 + 1 = 19 In der Praxis macht man das dann einfacher. Die 2-er Potenzen kann man bei einer 8-Bit Binärzahl schnell auswendig: 11111111 ^^^^^^^^ |||||||+---- 1 ||||||+----- 2 |||||+------ 4 ||||+------- 8 |||+-------- 16 ||+--------- 32 |+---------- 64 +----------- 128 (Beachte: Jede Stelle hat immer den doppelten Wert der Stelle unmittelbar rechts von ihr) Du nimmst von einer 8 Bit Zahl einfach nur diejenigen Stellen die 1 sind und addierst entsprechend dieser 'Tabelle' die jeweilgen Wertigkeiten. So wird dann aus 101001001 ^ ^ ^ ^ | | | +---- 1 | | +------- 8 | +---------- 64 +------------ 128 --- 201 Das Bitmuster 101001001 ist also äquivalent mit der Dezimalzahl 201. Aber: Beides 101001001 (binär) und 201 (dezimal) sind nur verschiedene Schreibweisen für dasselbe: Die Zahl die du erhältst, wenn du bei 0 beginnend 201 mal 1 dazuzählst. Um es so auszudrücken: Die Anzahl an zu zählenden Schafen ändert sich nicht, wenn man beim Zählen der Schafe im Binärsystem bis 101001001 zählt oder im Dezimalsystem bis 201 (oder im Hexadezimalsystem bis A9). Jedesmal ist die Menge der Schafe gleich gross. Wir haben nur verschiedene Schreibweisen für diese Anzahl gefunden.
ok ich glaub wir reden aneinander vorbei, liegt aber daran weil ich mich nicht korrekt ausgedrückt habe bzw weil ich den quellcode nicht gepostet habe. das projekt handelt von einem Codeschloss. habe diesmal auch den code im anhang geladen. mein problem ist eigentlich folgendes: Der Compiler stellt keinen Fehler fest, aber dennoch geht die Switch Anweisung nicht richtig. wenn ich alles mit if anweisungen machen würde dann würde es gehen. und deswegen frage ich was genau in der variable steht, weil dann kann ich vielleicht den fehler erkennen. aber so weiß ich nich was genau das für ein fehler ist, denn in if anweisungen gehts ja.
>wenn ich alles mit if anweisungen machen würde >dann würde es gehen. Konjunktiv! Hast Du's tatsächlich probiert oder nur gedacht, dass es funktionieren könnte? If-else und switch-case sind 'eigentich' austauschbar und sollten somit bei korrrekter Programmierung beide fuktionieren.
Andreas wrote:
> ok ich glaub wir reden aneinander vorbei,
Das mag sein, allersings glaube ich das in dem Fall nicht.
Aus den Ausführungen über binäre Zahlen sollte eigentlich
schon klar sein, dass
* wenn du an jeden Portpin einen Taster anschliesset
* du immer nur einen Taster drückst
-> du aus dem Pin Register keine Zahlen 1 bis 6 auslesen
wirst.
Jede Taste korrespondiert mit einem Bit.
Der Grundzustand der Taster sei so, dass das entsprechende Bit
0 ist. Ist ein Taster gedrückt, dann ist das Bit 1
Beispiel: Du hast am Port 4 Taster angeschlossen.
Ist kein Taster gedrückt, dann liefert das Register daher
00000000 (alle Bits 0, weil ja keine Taste gedrückt wurde)
Drückst du jetzt Taste ß, dann verändert sich das zu
00000001 (Bit 0 ist 1, weil die Taste 0 gedrückt wurde)
Lässt du Taste 0 los und drückst dafür Taste 1, so liefert das Register
00000010 (Bit 1 is 1, weil Taste 1 gedrückt ist)
Für Taste 2, folgt
00000100
Und für Taste 3
00001000
Wandelst du jetzt diese Biinärzahlen nach dezimal um, dann
ergibt sich da nicht 1, 2, 3 und 4. Sondern es ergibt sich
1, 2, 4, 8
Das alles berücksichtigt aber nicht die Situation an den Pins
4 bis 7. Wenn dort nichts angeschlossen ist, dann ist es das beste
diese Bits mal gezielt auf 0 zu setzen.
Aus
xxxx0010 (x steht für: Nicht von einem Taster beeinflusst)
wird dann auf jeden Fall mal
00000010
und da diese Zahl einer dezimalen 2 entspricht, heist das das
Taster 1 gedrückt ist.
Sind deine Taster anders rum angeschlossen (Grundzustand ist 1,
wenn Taster gedrückt kommt eine 0) dann ergibt sich
xxxx1111 (keine Taste gedrückt)
Taste 1 gedrückt
xxxx1110
Taste 2 gedrückt
xxxx1101
Taste 3 gedrückt
xxxx1011
Taste 4 gedrückt
xxxx0111
Wenn wir wieder davon ausgehen, dass alle x stellen (kein
Taster angeschlossen) definitiv zu 0 gesetzt werden, dann
ist in diesem Fall
xxxx1011 -> 00001011
und das entspricht einer dezimalen 11 (elf).
Die Frage, welchen Wert dein Port konkret liefert kannst nur du
dir selber beantworten, weil nur du weist wie genau deine Taster
angeschlossen sind, und was sonst noch so auf den restlichen
Portpins liegt. Ich kann dir nur Hilfe zur Selbsthilfe geben.
Die Zahl bestimmen musst du selbst. Und dazu musst du auch
von binär nach dezimal umwandeln können.
Im Debug-Modus kannst du den Wert von jeder beliebigen Variablen einsehen, egal ob in Hex, Bin oder Dec. Gruss Olli
Andreas wrote:
> Der Compiler stellt keinen Fehler fest,
Das heist nicht viel. Der Compiler kümmert sich nur darum
ob deine Grammatik richtig ist. Die Logik dahinter ist dein
Bier.
Der Satz:
"Ich fliege den Nachtisch auf der Sonnenbank"
ist grammatikalisch auch richtig und ist trotzdem nur
Unsinn.
ok einen kleinen fehler hab ich schonmal gefunden in der switch anweisung. case 1 case 2 case 4 . . . so muss das richtig heißen. aber es funktioniert trotzdem nicht. jetzt kann es natürlich sein, dass die taster alle low aktiv sind. hatte ich ja so definiert. was steht denn nun genau für eine hex zahl in port_b wenn ich den ersten taster drücke??? es steht ja in dem fall nicht 0x01 drin oder??? weil ja low aktiv
Andreas wrote: > ja so definiert. was steht denn nun genau für eine hex zahl in port_b > wenn ich den ersten taster drücke??? es steht ja in dem fall nicht 0x01 > drin oder??? weil ja low aktiv Ich gebs auf.
ja okay, trotzdem danke. aber... wenn nun 0x01 drinstehen soll, dann aber doch nur unter der vorraussetztung, dass portb high-aktiv ist oder? ich habe aber portb low-aktiv geschaltet, also denk ich dass alle bits im "ruhezustand" auf high gesetzt sind oder denk ich da falsch? das würde ja bedeuten, dass ich in der case-anweisung auf 0xFE prüfen sollten oder der erste taster gedrückt wurde... mfg
In portB steht "1" (was das selbe ist wie 0x01 und 0b00000001) wenn am ersten Pin des PortB ein High-Signal (+5V) anliegt und alle anderen Pins des PortB low (0-Volt, GND) .
Hallo, ich bins wieder... Das Problem mit der Variable hat sich geklärt, danke nochmal :) Nun das nächste Problem... ich hab meine Quellcodedatei mal angehängt... Es funktioniert soweit alles (wenn ich taster1 drücke, gehen alle LEDs an) -> das Problem ist: man muss den taster ca. 3 sekunden drücken, bis sich was tut! das ist natürlich nicht erwünscht... ich möchte, dass die LEDs sofort auf die gedrückten taster reagieren. Vielleicht kann sich jemand den Code mal ansehen, das wäre nett :) Danke schonmal :D
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.