Forum: Mikrocontroller und Digitale Elektronik Was steht in Variable


von Andreas (Gast)


Lesenswert?

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 !!!

von Jan M. (mueschel)


Lesenswert?

Jedes Bit steht für einen Pin. Bit0 gibt den Status von PB0 an und so 
weiter bis Bit7 = Status von PB7.

von Andreas (Gast)


Lesenswert?

das weiß ich... aber ich möchte gern wissen was genau für ein wert in 
der variable port_b steht.

von max.p (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

>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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Olli (Gast)


Lesenswert?

Im Debug-Modus kannst du den Wert von jeder beliebigen Variablen 
einsehen, egal ob in Hex, Bin oder Dec.

Gruss Olli

von Karl H. (kbuchegg)


Lesenswert?

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.

von Niels H. (monarch35)


Lesenswert?

Exkursionen in die Welten der Zahlensysteme.
"Huch! 255 = -1 !?" :)

von Andreas (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Andreas (Gast)


Lesenswert?

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

von Niels H. (monarch35)


Lesenswert?

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) .

von Niels H. (monarch35)


Lesenswert?

geht doch! :)

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.