Zitat:
Sorry, für die dummen Fragen, aber bin ja neu im Gebiet Zwinkern
Es gibt keine dummen Fragen, das kennst Du ja.
Ich lege Dir wirklich den oben genannten Link von mir ans Herz, es ist besser als 1000
Bücher !
Ich glaube , es wäre doch besser, wenn ich den erste Code auch komentiert hätte :-k
Also ich versuche Dir das in ein paar Worten zu erklären.
Ich hoffe, daß es mir gelingt :-b
Zitat:
Erstmal zum oberen Code. Was soll das hier genau bedeuten?
Code: [View More of this Code] [View Even More of this Code] [View Less of this Code] [Select All of this Code]
.org 0x000
rjmp reset
Man bräuchte doch nicht wirklich eine Funktion "reset:" oder?
In diesem einfachem Beispiel hast Du vollkommen recht das muß hier nicht sein.
Aber sobald Du mit Interrupts anfängst, kommst Du nicht drumherum.
.org 0x000
rjmp reset
soll soviel heißen daß in Flashspeicher(da wo das Programm gespeichert ist)
an der 0x000 Stelle den Befehl rjmp reset schreiben soll.
Und nachdem Du Deinen AVR einschaltest, fängt er immer an der adresse 0x000
an zu laufen.
Mithin springt er sofort zum label reset.
Und im reset kommen alle Anfangsfeierligkeiten rein, Register umbenennen, irgendwelche
Werte zuweisen, Timer UART, TWI usw einrichten, und und und.
Zitat:
Vor allem, wieso springt der dann eigentlich irgendwann in "loop:" rein? steht ja nirgends oben was von "rjmp loop".
Der springt garnicht in den loop rein, sondern gleitet ganz sanft darein,
warum auch nicht? nachdem er die letzte Zeile im reset abgearbeitet hat,
geht er einfach in die nächste Zeile über, die halt loop heißt,
loop: ist auch keine Funktion oder sowas, es ist einfach nur ein Label um diese Speicherzelle später besser zu erreichen.
Anmerkung: Du darfst nicht in Kategorien von C oder Bascom denken, es gibt keine
Funktionen der Art wie in Hochsprachen beim Assembler!
Der µC fängt bei der Adresse 0x00 an und geht Speicherzelle für Speicherzelle nach unten,(wenn er kein jmp oder call findet) ich hoffe das ist jetzt klar.
Zitat:
Und was genau ist der Unterschied zwischen equ und def?
das ist einfach erklärt: def brauchst Du um Register unzubenennen, es ist wohl einfacher zu schreiben : meinregister als : R16 zum Beispiel
Da sagst Du dem Assembler : überall wo ich meinregister stehen hab, mein ich eigentlich R16
equ braucht man um irgendwelche Werte zuzuweisen z.B.
.equ LED1 = PD4
Jetzt fragst Du Dich, wo da PD4 ein Wert ist, was?
wenn Du Dir die "m8def.inc" anschaust, findest Du irgendwo folgende Zeile:
.equ PD4 = 4
mithin heißt es auch LED1 = 4
und wozu das ganze ?
Es ist wieder einfacher zu schreiben sbic PORTD,LED1 als sbic 0x12,4 oder ?
zu 0x12 suche in "m8def.inc" nach PORTD dort steht
.equ PORTD = $12 ($12 oder 0x12 bedeutet daß es eine hexzahl ist)
.equ meinezeit = 10000
heißt wiederrum überall wo meinezeitsteht meine ich eigentlich 10000
verstanden ?
So, soviel zu meinem minitutorial für Assembler
Jetzt gehe ich essen
O:)
P.S. Sollte ich irgendwas geschrieben haben, was nicht so ganz stimmt, oder besser ausgedrückt werden könnte, möge mich hier jemand korigieren.
Aber wie gesagt, der link von mir, soll Deine Assemblerbibel werden!
Gruß Sebastian