Forum: Mikrocontroller und Digitale Elektronik was bedeutet dieses 0b00000001 in meinem Programm?


von O. A. (sokrates1989)


Angehängte Dateien:

Lesenswert?

Hallo, ich bin blutiger Anfänger..und daher dankbar für jede "einfache" 
Antwort.

Ich verstehe nicht wirklich was es mit diesem "0b00000001" auf sich hat.

Geht es darum dass der Pin B.0 eine "1" ausgeben soll???

Ich habe hier als Beispiel zwei Programme. Beim ersten Programm soll ein 
Taster eine led einschalten. Bei dem anderen Programm soll einfach nur 
eine led leuchten.

Warum wird in dem der Taster Aufgabe
ldi r16,0
bzw
ldi r16,1

verwendet

und bei der anderen Aufgabe

ldi r16,0b00000001

verwendet??

Hätte man bei der Taster Aufgabe nicht auch

"0b00000000" statt "0"

und "0b0000001" statt "1"

schreiben können`? Ich habe es ausprobiert...das Programm funktionierten 
nicht mehr.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist 1. "Eins".

Leute, die gerne viele Ziffern abzählen, und die sich damit schwertun, 
hexadezimale Zahlen zu lernen, nutzen gerne diese Notation, die am 
Präfix 0b (statt 0x für Hexadezimal) zu erkennen ist.

Aber inhaltlich ist es einfach nur 1.

von Karl M. (Gast)


Lesenswert?

Hallo,

so wie ich das sehe, musst Du erst mal die Grundlangen erlernen.

Das ist nicht verwerflich sondern, in meinen Augen der richtige Weg.

http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_nomenclature.html

http://www.avr-asm-tutorial.net/
http://stefanfrings.de/avr_workshop/index.html
http://academy.cba.mit.edu/classes/embedded_programming/doc1022.pdf

Was nützt es Dir, merci aus der französischen Sprache zu kennen, wenn 
sonst keinerlei Verständnis vorhanden ist ?

von Günter Lenz (Gast)


Lesenswert?

dezimal  binär       hex
    1 = 0b00000001 = 0x01
  255 = 0b11111111 = 0xFF

von O. A. (sokrates1989)


Lesenswert?

Hallo Karl,

danke für dein Verständnis...

aber wenn ich mir dieses set manual anschaue.....hmmm

was soll ich sagen?
Das ist für mich maschinensprache....

ich hoffe ich kann es beim programmieren lernen...es fällt mir schwer 
einen Einstieg zu finden, vor allem weil wir in der Hochschule sehr 
schnell voranschreiten ...

von Karl M. (Gast)


Lesenswert?

Hallo Ostap,

ja das kenne ich noch aus meiner Zeit an der Uni.

Wir hatten einen physikalisches Praktikum und haben eine Steuerung in 
Assembler für einen 8085 schreiben müssen.
Da ich zu dieser Zeit schon den 8085 beherrschte, war die Aufgabe in 2 
Tagen erledigt.

Viel Erfolg und nicht unterkriegen lassen.

Zu den Schreibweisen bei der Atmel AVR Programmierung.
Viele von uns verwenden gerne die Bit-Bezeichnungen um die Leserlichkeit 
zu erhöhen.
1
; ich schreibe das bewusst nicht mit andi oder ori
2
ldi R16,~(1<<PB0)
3
; set PORTB PB0 = 0
4
in R17,PORTB
5
and R17,R16
6
out PORTB,R17
7
;
8
; set DDRB PB0 = 1
9
ldi R16,(1<<PB0)
10
in R17,DDRB
11
or R17,R16
12
out DDRB,R17

von Timmo H. (masterfx)


Lesenswert?

Die nicht ganz standardkonforme Binärschreibweise hat für mich 
eigentlich nur den Vorteil dass man direkt sieht welcher Pin eines Ports 
gesetzt ist. Das mache ich zwar auch meist mit (1<<PINx) aber wenn man 
z.B. ein Array hat für um Symbole für LCD-Display darzustellen, dann 
kann man mit der Binärschreibweise halt schon direkt im Quellcode 
"lesen" was das für ein Symbol sein soll. Hier z.B. ±
1
const char custom_chars[] PROGMEM = { 
2
3
  0b00000100, 
4
  0b00000100,
5
  0b00011111,
6
  0b00000100,
7
  0b00000100,
8
  0b00000000,
9
  0b00011111
10
}

: Bearbeitet durch User
von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Dein Problem mit dem
1
ldi R16,0
2
sbis PIND,2
3
ldi R16,1
4
...mache irgendwas ...
Hier wird zuerst das Register R16 auf Null gesetzt.
Dann wird 'geguckt', ob Bit2 in PIND gesetzt ist (also high)
WENN JA, dann wird die nächste Anweisung übersprungen
SBIS
Skip if Bit I/o is Set - überspringe, wenn Bit im I/O-Register gesetzt 
ist

Dadurch wird die zweite ldi-Anweisung übersprungen, wenn das Bit high 
ist und somit bleibt der Ausgang low.
Wenn das Bit low ist, wird R16 erst auf Null, dann auf 1 gesetzt.

Das ist auch im Datenblatt des µC beschrieben, dort kannst Du nach den 
ganzen Befehlen auch direkt suchen, sollte Dir eines der Kommandos 
gerade 'spanisch' vorkommen.

MfG

von Manfred (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Leute, die gerne viele Ziffern abzählen, und die sich damit schwertun,
> hexadezimale Zahlen zu lernen, nutzen gerne diese Notation,
Das musste nun wirklich sein?

Bei Portmanipulationen oder Abfragen ist binär die optimale Art der 
Eingabe, weil man sie schon direkt im Auge den Leitungen zuordnen kann.

von Wolfgang (Gast)


Lesenswert?

Timmo H. schrieb:
> Die nicht ganz standardkonforme Binärschreibweise

Von welchem Standard sprichst du?

von Martin K. (maart)


Lesenswert?

Manfred schrieb:
> Rufus Τ. F. schrieb:
>> Leute, die gerne viele Ziffern abzählen, und die sich damit schwertun,
>> hexadezimale Zahlen zu lernen, nutzen gerne diese Notation,
> Das musste nun wirklich sein?
>
> Bei Portmanipulationen oder Abfragen ist binär die optimale Art der
> Eingabe, weil man sie schon direkt im Auge den Leitungen zuordnen kann.

Manche haben eben Hex direkt im Auge. Ich nicht, ich schreibe auch 
binär. 0xFF kann ich allerdings auf Anhieb erkennen. ;-)
Aber so ganz Unrecht hat Rufus nicht, wenn man es kann, dann super. Ich 
habe die eine oder andere Null mehrfach nachzählen müssen.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Da bei Hex-Bin ja auch 'nur' die Nibble eine 4er Gruppe bilden:
1
0x01  0b 0000 0001
2
0x23  0b 0010 0011
3
0x45  0b 0100 0101
4
0x67  0b 0110 0111
5
0x89  0b 1000 1001
6
0xAB  0b 1010 1011
7
0xCD  0b 1100 1101
8
0xEF  0b 1110 1111

Die vordere Ziffer bildet die vorderen 4bit, die hintere Ziffer, die 
hinteren 4bit, fertig.

Wobei ich auch gestehen muß, daß ich über 'B' jedes Mal zählen muß :/ 
(eigentlich nur für C und D - muß ich Mal drauf achten ...)

MfG

: Bearbeitet durch User
von O. A. (sokrates1989)


Angehängte Dateien:

Lesenswert?

-...

ich hoffe nochmal Hilfe zu bekommen. Eine der ersten Antworten sagte mir

"0b00000001" sei einfach nur "1"

hier habe ich ein Programm wo

"0b00000111" verwendet wird... damit ist doch nicht "7" gemeint?

sondern dass die Pins B.0 B.1 B.2 auf "1" gehen sollen...richtig????

von Martin K. (maart)


Lesenswert?

Ostap A. schrieb:
> "0b00000111" verwendet wird... damit ist doch nicht "7" gemeint?

Doch.

> sondern dass die Pins B.0 B.1 B.2 auf "1" gehen sollen...richtig????
Auch ja.

: Bearbeitet durch User
von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Bitte ... Quellcode als Quellcode.
Süße Katzenbabys gerne als Bild

Einfache Antwort: Jain

Die unteren drei Bit im Port haben die Werte 1,2,4 - die Summe ist somit 
7.
Wenn Du eine 7 an das Port schickst, gehen die drei Ausgänge auf High 
(sofern die I/Os als Ausgänge eingestellt sind, als Eingänge werden nur 
die PullUps zugeschaltet).

MfG

von Theor (Gast)


Lesenswert?

Patrick J. schrieb:
> [...]

> Wobei ich auch gestehen muß, daß ich über 'B' jedes Mal zählen muß :/
> (eigentlich nur für C und D - muß ich Mal drauf achten ...)

Das geht mir ganz genauso. Bis A und B ist noch alles klar, dann kommt 
ein "dunkles Loch" und bei E und F wird's wieder hell.

Tröstlich, dass das nicht nur mir so geht. :-)

von TomA (Gast)


Lesenswert?

Es gibt eine kleine Eselsbrücke:

C wie cwölf(zwölf) und D wie dreizehn

von besserwisser (Gast)


Lesenswert?

Danke TomA, jetzt weiß ich es besser.

von Timmo H. (masterfx)


Lesenswert?

Wolfgang schrieb:
> Timmo H. schrieb:
>> Die nicht ganz standardkonforme Binärschreibweise
>
> Von welchem Standard sprichst du?
C99, C11. Das 0b Präfix ist soweit ich weiß ein gcc spezifisches ding

: Bearbeitet durch User
von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hehe

So einfach kann die Welt sein :)

TomA schrieb:
> Es gibt eine kleine Eselsbrücke:
>
> C wie cwölf(zwölf) und D wie dreizehn

Besten Dank dafür, wird mir das Leben um Einiges erleichtern :)

MfG

von DraconiX (Gast)


Lesenswert?

Timmo H. schrieb:
> Wolfgang schrieb:
> Timmo H. schrieb:
> Die nicht ganz standardkonforme Binärschreibweise
>
> Von welchem Standard sprichst du?
>
> C99, C11. Das 0b Präfix ist soweit ich weiß ein gcc spezifisches ding

Nein, nicht nur. Clang, GCC, TCC usw... und in CPP ab C++14 
standardisiert. Wann es in C Einzug hält ist halt nur eine Frage der 
Zeit.

Ich finde das im übrigen ganz praktisch, ich bin mitunter auch ein 
"Nullzähler" bei den 8Bitern - 16Bit hab ich mir mit Registern auch 
schonmal angetan (ich schreib mir dann aber immer die Zahl alle vier 
Stellen auseinander und mach dann wenn ich fertig bin die Leerzeichen 
wieder raus :-D )

Aber spätestens wenn ich nen STM32 unter den Fingern habe, gibt es nur 
noch Hex ^^

Kurz gesagt: es ist mitunter sehr hilfreich und leserlich, aber nicht 
immer.

von O. A. (sokrates1989)


Lesenswert?

Patrick J. schrieb:
> Hi

> Hier wird zuerst das Register R16 auf Null gesetzt.
> Dann wird 'geguckt', ob Bit2 in PIND gesetzt ist (also high)
> WENN JA, dann wird die nächste Anweisung übersprungen
> SBIS
> Skip if Bit I/o is Set - überspringe, wenn Bit im I/O-Register gesetzt
> ist
>

Patrick.... Ok das verstehe ich. Das Bit2 in PIND ist nur gesetzt wenn 
der Taster gedrückt ist korrekt?

Oder ist der PIND bereits "high" wegen dem Pullup. Weil das mit dem 
Pullup habe ich auch noch nicht richtig verstanden...
da steht zuvor ja
"sbi PinB, 1"

also ist der PIND bereits gesetzt oder erst wenn ich den Taster 
betätige...

von Motzkartoffel (Gast)


Lesenswert?

Karl M. schrieb:
> Hallo,
>
> so wie ich das sehe, musst Du erst mal die Grundlangen erlernen.
genau: die der deutschen Sprache ;o) SCNR

von Quodnix (Gast)


Lesenswert?

Ostap A. schrieb:
> Patrick J. schrieb:
>> Hi
>
>> Hier wird zuerst das Register R16 auf Null gesetzt.
>> Dann wird 'geguckt', ob Bit2 in PIND gesetzt ist (also high)
>> WENN JA, dann wird die nächste Anweisung übersprungen
>> SBIS
>> Skip if Bit I/o is Set - überspringe, wenn Bit im I/O-Register gesetzt
>> ist
>>
>
> Patrick.... Ok das verstehe ich. Das Bit2 in PIND ist nur gesetzt wenn
> der Taster gedrückt ist korrekt?

Höchst wahrscheinlich genau andersherum. Wenn die Taste gedrückt is, ist 
Bit2 in PIND NICHT gesetzt.

> Oder ist der PIND bereits "high" wegen dem Pullup. Weil das mit dem
> Pullup habe ich auch noch nicht richtig verstanden...
> da steht zuvor ja
> "sbi PinB, 1"

Damit wird der Pullup eingeschaltet. Im Inneren des µC wird also das 
Anschlussbeinchen über einen Widerstand mit 5V verbunden. Somit liegt 
die Leitung auf 5V, kann aber kaum Strom liefern. Eine Abfrage von PIND 
liefert also zunächst auch HIGH für diese Leitung. Betätigst Du aber die 
Taste, dann schließt Du das Anschlussbeinchen gegen Masse und die 
Leitung wird elektrisch auf 0V gezwungen. Jetzt erst liefert PIND LOW 
für diese Leitung.

> also ist der PIND bereits gesetzt oder erst wenn ich den Taster
> betätige...

Erst bei betätigen des Tasters - aber dann wir das Bit gelöscht, nicht 
gesetzt.

von O. A. (sokrates1989)


Lesenswert?

Quodnix schrieb:

> Höchst wahrscheinlich genau andersherum. Wenn die Taste gedrückt is, ist
> Bit2 in PIND NICHT gesetzt.


Deswegen ist es im Programm genau umgekehrt...wenn ich im Programm das 
Debugging starte dann wird das ldi NICHT übersprungen. Das heißt das 
verhalten auf dem Board ist genau umgekehrt... Die Abfrage der Pins ist 
"High" (Das Bit ist also gesetzt)

Und nur so kann der Befehl sbis funktionieren...nur so wird das ldi 
übersprungen wenn der Taster nicht gedrückt ist.

Ist das korrekt?

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.