PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Assemlber-Befehle



Andy123
04.02.2007, 13:37
Hallo zusammen,
ich finde nirgendswo erklärt, was für Befehle es bei Assembler gibt für

if
else
for

do
loop

kleiner als
größer als
kleiner oder gleich als
größer oder gleich als
+
-
*
/

des weiteren wollte ich Fragen, wie ich es bewerkstelligen kann, dass wenn ich einen Wert bei einer Schnittstelle einlese, nacheinander die Bits einzeln im gleichen Register setze.

z.B. so:

das Register 16 ist leer
nun liest er einen Wert ein
und setzt beim ersten Bit des Register 16 eine 1 oder eine 0

dann liest er wieder einen Wert ein
und setzt beim zweiten Bit des Register 16 eine 1 oder eine 0

ingesamt wird dies 8 mal bewerkstelligt.
Nachdem er das Register 16 mit Werten gefüllt hat, wird dieses Register woanderst hinkopiert.

Wenn das Register woanderst hinkopiert wird, sollte eine Variabele mit dem Wert 1 addiert wird.

Damit will ich erreichen, damit das Programm aber einer gewissen empfangen Byte Zahl aufhört zu arbeiten.

Hoffe ihr könnt mir schnellstmöglich helfen

michas_rob
04.02.2007, 13:55
Hallo Andy123,

ich kann dir nur die Seite von Sprut empfehlen:

www.sprut.de

Ich bin leider auch neu und quäle mich auch durch die Assembler Befehle durch....

Viel Spaß
michael

linux_80
04.02.2007, 14:01
Hallo,

dann gibts da noch das PDF von Atmel, in dem alle Befehle der AVRs stehen:
http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf
Welche Befehle der AVR nun wirklich kann, steht in dessen Datenblatt relativ weit hinten "Instruction Set Summary".

Diese Seite wird auch gern erwähnt:
http://www.avr-asm-tutorial.net/index.html

PicNick
04.02.2007, 14:33
Auch in unserer Wiki tut sich da was.
https://www.roboternetz.de/wissen/index.php/AVR_Assembler_Einf%C3%BChrung

Besonders deine Fragen findest du hier
https://www.roboternetz.de/wissen/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User

Gock
04.02.2007, 14:43
Hi!
If, else, for, do usw. sind Hochsprachenbefehle! Dafür gibt es kein Pendant in Assembler! Die entsprechenden Funktionen musst Du Dir aus einzelnen Befehlen zusammenbauen.
Bsp.: If x=0 then code
- kopiere x in r16: ldi r16, x
- vergleiche mit 0: cpi r16, 0
- springe nach"Gleich" wenn gleich: breq Gleich
- sonst mache was anderes: anderer Code
Gleich ist dabei ein Label.
Da Du sowas nicht zu wissen scheinst, empfehle ich dringend ein Buch oder ähnliches. In diesem Forum kann Dir das Programmieren an sich keiner erklären. Das ist einfach zu viel.
Bit 3 in Register r16 wird mit Bit 3 von Register r17 zb so gesetzt:
Isoliere Bit 3 in r17: andi r17, 0b00001000
übertrage isoliertes Bit in r16: or r16, r17
Das hab ich jetzt schnell runtergeschrieben, Richtigkeit garantiere ich nicht.
Gruß

Andy123
04.02.2007, 16:57
http://www.avr-asm-tutorial.net/index.html

Diese Seite ist doch dafür gut geeignet oder


Mir geht es eigendlich nur darum, dass ich z.B Daten von einem GPS Empfänger hinaustakten muss.
Demnach muss ich ein I/O Register verwenden wo ich z.B. Pin 1 auf Ausgang schalte.
Anschliessend muss ich beim gleichen I/O Register dann Pin 2 auf Eingang schalten.
Nun lese ich bei diesem Eingangspin einen digitalen Wert 1 oder 0 ein.

Diesen Wert speichere ich dann in ein anderes Register z.B. name "erstesRegister".
Dieses Register ist dann r0.

Zu vor muss aber das Schieberegister name "zweitesRegister, was r1 ist" um 1 addiert werden.

Demzufolge weiss man dann, wo der eingelesene Binärwert bei welchem Bit des Registers erstesRegister gespeichert werden muss.

Hat das Register zweitesRegister den Wert 8 erreicht, so wird der Binärcode vom Register erstesRegister in eine SD Karte geschoben.


Diese SD Karte hat nun z.B. 12 Sektoren.
Jedes Sektor besitzt 512 Byte.

Wurden nun 8 Bit des Registers erstes Register in die SD Karte geschoben, so wird dann anschliessend ein anderes Register namens drittesRegister "was r3 ist" mit dem Wert 8 addiert.

Nun werden die Register erstesRegister, zweitesRegister auf den Wert 0 zurückgesetzt.

Nun läuft dieses Programm dann solange ab, bis das Register drittesRegister den Wert 6144 hat.
Nun wird das Programm unterbrochen und eine rote LEd fängt an zu leuchten.


Demzufolge benötige ich noch 3 Register.

r4 = um 1 Ausgang bei I/O zu schalten "für GPS Empfänger"
r5 = um 1 Eingang bei I/O zu schalten "für GPS Empfänger
r6 = um 1 Ausgang bei I/O zu schalten "für SD KArte"


r4 bis r6 werden dann in das I/O Register geladen.

Wäre dies so möglich, wie ich es gerade beschildert habe?

Bis denne

JonnyP
04.02.2007, 19:41
In der Hilfe des AVR Studios (Assembler Hilfe) ist jeder Befehl erklärt.

izaseba
04.02.2007, 19:46
Warum willst Du mit Null Ahnung Assembler direkt so was "großes" machen ?

Bring erstmal eine LED zum blinken...

Gruß Sebastian

Andy123
04.02.2007, 21:40
Frage, ist die Programmierung des Atmega8 mit der Hochsprache C besser?
Wenn ja, wo gibt es da Befehlreferenzen.

Mit Assembler würde mir ein viel zu langer Bart wachsen.

Cu

Hanni
04.02.2007, 22:55
Fakt ist, solange du nicht per DU mit dem Mikrocontroller bist bleibt dir wohl nur Basic ... nur wirklich lernen wirst du damit nichts.

Für anständig kompilierten Code sollte man sich mit C näher befassen.
In Assembler programmieren meines Wissens nach nur Leute, die:
1. sich wirklich mit dem Mikroconroller beschäftigen
2. zeitkritische Dinge verwirklichen wollen.

Grüße,
Hanni

PicNick
05.02.2007, 08:00
In Assembler programmieren meines Wissens nach nur Leute, die:
1. sich wirklich mit dem Mikroconroller beschäftigen
2. zeitkritische Dinge verwirklichen wollen.


3. Es macht Spaß, in den Eingeweiden des µC zu wühlen :mrgreen:

Andy123
05.02.2007, 14:00
Dann wähle ich doch zuerst mal C und gehe später dann wieder auf Assembler über

teslanikola
05.02.2007, 14:08
3. Es macht Spaß, in den Eingeweiden des µC zu wühlen Mr. Green


Aha da sind die macher von SAW IV "Hallo µC ich möchte ein Spiel spielen,..."