Hey Richard,
Ich weis, du meinst es nur gut, aber wie gesagt, genau solche ausdrücke wie "Menonics, LDI oder STR" sollten dann auch erklärt werden und nicht nur hingeschrieben werden, sodass es eben der "Idiot" versteht.
Noch eine frage: Wie muss man sich zum beispiel einen "2313" vorstellen zum vergleich? Kann man solch einen ic als "Extrem dummen Computer" bezeichnen, der nur eben die eine Aufgabe erledigen kann, die man ihm aufspielt? Hat solch ein ic auch einen Prozessor oder wie sind die Teile Augfebaut? Ich verstehe nicht, wie es mithilfe des PCs möglich ist etwas auf einen hardwarebaustein aufzuspielen, der dies dann erledigt. Ich meine in einem Schmitttrigger-ic weis ich zum beispiel, dass sich darin nichts anderes als eine fertige schaltung im miniformat darin befindet. wie ist das bei den AVRs?
Meine eigene cnc-Fräse:
mihuno.oyla3.de
Der Tiny2313 (oder besser gesagt, Mikrocontroller im allgemeinen) ist einfach nur ein kleiner Computer (der im Vergleich zu deinem SEHR schwach auf der Brust ist), der neben dem Prozessorkern selbst noch zusätzliche Hardware wie Timer, Schnittstellen, AD-Wandler etc. hat.
Die kleinen AVRs haben alle gemeinsam, dass sie ihr Programm nur vom internen Speicher (Flash) ausführen können, bei anderen (wie auch bei den "normalen" Computern) werden Programme aus dem Arbeitsspeicher ausgeführt.
So, jetzt zu deiner Frage, wie ein AVR aufgebaut ist/funktioniert: Es gibt innerhalb des Prozessorkerns verschiedene Komponenten. Eine Arithmetisch-Logische-Einheit (ALU), die für Berechnungen zuständig ist. Einen Registersatz, das sind wenige (bei AVRs 32) Speicherplätze, auf die der Prozessor direkt (schnell) zugreifen kann und die für Zwischenergebnisse benutzt werden. Mehr Speicher steht in Form des langsameren SRAMs zur Verfügung, auf den über ein Speicherwerk zugegriffen wird, für Zugriffe auf den Flashspeicher wird ebenfalls eine Komponente benötigt. Dann gibt es da noch das Steuerwerk, es signalisiert den einzelnen Komponenten, wann sie was zu machen haben, die Bedeutung der Maschinenbefehle ist hier fest verdrahtet. Das Steuerwerk "weiß" also, dass eine Instruktion 0x0B01 bedeutet, dass die Werte aus den Registern 0 und 1 addiert und dann in Register 0 gespeichert werden soll, und teilt dies zur richtigen Zeit den jeweiligen Komponenten mit.
Und weil niemand mit 0x0B01 um sich werfen will, hat man für diese Maschinenbefehle lesbare Kürzel erfunden, das sind die von Richard erwähnten Mnemonics. Das ergibt dann die Assemblersprache, 0x0B01 wäre in ihr formuliert: add r0, r1.
Übrigens, wie das bei Sprachen üblich ist, braucht man auch hier wieder einen Übersetzer, der die Mnemonics dann wieder in eine Kolonne von Bits umformt, das macht der Assembler.
mfG
Markus
PS: Zum 0x0B01: Das ist die hexadezimale Schreibweise für (binär) 0000 1100 0000 0001 falls dir das Binär- und Hexadezimalsystem noch nicht geläufig ist, kann ich dazu ein paar Worte sagen.
hey, was es genau mit hexadezimalen zahlen zu tun hat weis ich ehrlich gesagt nicht. außer, dass mein Taschenrechner eine hex funktion hat, falls das das Gleiche ist...
MfG
Michael
Meine eigene cnc-Fräse:
mihuno.oyla3.de
Es gibt verschiedene Zahlensysteme. Die wichtigsten zähle ich hier auf:
Name des Systems => Gesamtanzahl der Zahlen => mögliche Zahlen
Binärsystem => 2 => 0, 1
Oktalsystem => 8 => 0 - 7
Dezimalsystem => 9 => 0-9
Hexadezimal (hex) => 16 => 0-9 und A-F
Das Binärsystem wird bei Bitoperationen verwendet (einzelne Ports setzten bzw rücksetzen,...)
Das Oktalsystem wird nicht so oft verwendet. Die Ports sind z.B. in Oktalsystem aufgebaut.
Das Dezimalsystem wird nicht nur in der Elektronik verwendet.
Das Hex-Format wird eigentlich immer in der Elektronik verwendet. Dieses System wird zum Auslesen vom ADC verwendet, zum setzten von PWM Kanälen, Komunikation bei Bussystemen,... verwendet.
MfG Hannes
Geändert von 021aet04 (30.08.2011 um 19:45 Uhr)
Achso, das heißt, wenn man es genau nimmt steuere ich eine led mit einem schalter dann binär an --> ein und aus
Wie kann man das hex-system dann verstehen?
MfG
Michael
Meine eigene cnc-Fräse:
mihuno.oyla3.de
Hier einige Beispiele wie man die Systeme an.
Das Binärsystem wendet man z.B. so an: PORTB |= (1<<PB1); //Bitoperation ist "(1<<PB1)"
Das Dezimalsystem kann man ganz einfach so anwenden: PORTB |= 100; //100 wird dann im Dezimalangegeben, wenn dichts davor steht ist eine Zahl immer Dezimal
Im Hexadezimalsystem wird man das so schreiben: PORTB |= 0x64; //Die Zahl 100 im Hex-Format, es steht bei einem Hex-Format immer "0x" davor, damit erkennt der Compiler das es eine Ziffer im Hex-Format vorliegt
Du könntest den Windowsrechner verwenden. Diesen kannst du umstellen zu "Programmierer" (Ansicht => Programmierer). Dort hast du die verschiedenen Zahlensysteme zur Auswahl und kannst sie untereinander umrechnen lassen.
MfG Hannes
Im Endeffekt sind es einfach alles nur unterschiedliche Repräsentationen der gleichen Zahl. 42 im Dezialsystem ist binär 101010. Im Speicher deines Rechners (oder deines AVRs) liegt die Zahl genau so, weil der Speicher eben nur 0 und 1 kennt. Auch die Arithmetik findet komplett auf Basis dieser Zustände statt.
So ausgeschrieben sind die Zahlen für Menschen aber unhandlich, deshalb fasst man vier Binärzahlen zu einer Hexadezimalzahl zusammen, 42 entspricht dabei 2A. Nun kommt es relativ oft vor, dass du (zum Beispiel bei Bitmanipulationen) etwas mit einzelnen Bits machen willst, du wirst mit zunehmendem Lernfortschritt dann eher zur hexadezimalen Schreibweise tendieren (weil sie einfach kürzer ist).
Ach ja: Um unterscheiden zu können, auf bezüglich welcher Basis die Zahl dargestellt wird, schreibt man in der Programmiersprache C bei Binärzahlen ein 0b und bei Hexadezimalzahlen ein 0x davor (Genau genommen ist das 0b eine GCC-Erweiterung). Im normalen Sprachgebrauch wird oft auch ein "d" "h" oder "b" angehängt, also: 42d = 2Ah (Die Kleinschreibung macht den Unterschied!) = 101010b
Äh ja, und zur Basis: Im Dezimalsystem ist die Basis 10, jede Stelle ist also 10 Mal so stark gewichtet wie ihr Vorgänger (42 = 4*10 + 2*1). Im Binärsystem verdoppelt sich der Wert jeder Stelle (42 = 1*32 + 0*16 + 1*8 + 0*4 + 1*2 + 0*1), im Hexadezimalsystem wird mit vielfachen von 16 multipliziert (42 = 2*16 + 10*1)
mfG
Markus
Hui, hier hat sich aber viel getan^^
RichtigAchso, das heißt, wenn man es genau nimmt steuere ich eine led mit einem schalter dann binär an --> ein und aus
Der einzige Unterschied zwischen den Zahlensystemen ist ja der, dass es mehr oder weniger verschiedene Ziffern hat. Allerdings kann der Mikrocontroller nur 2 Ziffern, nämlich 0 und 1. Damit der Mikrocontroller aber auch höhrere Zahlen als 1 Verarbeiten kann, fasst man mehrere solcher "Bits" (Ein Bit ist quasi ein "Schalter" der entweder 0 oder 1 sein kann) zu einer neuen Zahl zusammen.Wie kann man das hex-system dann verstehen?
So besteht z.B. eine Hexadezimalziffer aus 4 Dualziffern. Man braucht so viele Dualziffern, weil diese nur so wenig verschiedene Zustände haben (0/1). Eine Hexadezimalziffer dagegen hat 16: 0123456789ABCDEF
(Weil man 10, 11, 12 usw. ja nicht in einer Ziffer schreiben kann, nimmt man dafür einfach Buchstaben).
Und so kann man mit 4 Dualziffern eine Hexadezimalziffer speichern:
Hex - Dual:
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
A - 1010
B - 1011
C - 1100
D - 1101
E - 1110
F - 1111
Und das sind jetzt die 16 verschiedenen Möglichkeiten.
Du könntest jetzt also mit einer Hexadezimalziffer z.B. den Zustand von 4 LEDs speichern. Aber es macht keinen Unterschied ob du bei Programmieren jetzt 0x9 (Hexadezimal) oder 0b1001 (Binär/Dual) schreibst, im Controller drin wird eh wieder alles gleich verarbeitet.
Ich habe leider nur ein Beispiel in "Plattdeutsch" gefunden.. http://www.c64-wiki.com/index.php/Mnemonic bei dem gezeigt wird wie der Menonic für
LDA,H42....... Lade Daten Register A mit Hex Wert 42 in Maschinen lesbaren code gewandelt wird. Etwas genauer wird es hier erklärt
http://de.wikipedia.org/wiki/Maschinensprache
Gruß Richard
Lesezeichen