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.
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.
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 ?
dezimal binär hex 1 = 0b00000001 = 0x01 255 = 0b11111111 = 0xFF
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 ...
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 |
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
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
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.
Timmo H. schrieb: > Die nicht ganz standardkonforme Binärschreibweise Von welchem Standard sprichst du?
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.
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
-... 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????
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
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
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. :-)
Es gibt eine kleine Eselsbrücke: C wie cwölf(zwölf) und D wie dreizehn
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
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
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.
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...
Karl M. schrieb: > Hallo, > > so wie ich das sehe, musst Du erst mal die Grundlangen erlernen. genau: die der deutschen Sprache ;o) SCNR
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.