- LiFePO4 Speicher Test         
Seite 27 von 53 ErsteErste ... 17252627282937 ... LetzteLetzte
Ergebnis 261 bis 270 von 524

Thema: Tutorial für alle Assembler-Anfänger _

  1. #261
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Anzeige

    Powerstation Test
    Nochmal ganz langsam:
    ldi temp , LOW ((daten * 2) + daten_laenge)
    daten ist die Adresse, zu der gesprungen werden soll.
    Das nimmt man wie gewohnt mal zwei.
    Dazu addieren wir dann 6 (Bytes), um das Ende festzulegen.
    Das vergleichen wir dann mit der Funktion cp mit ZL, dem LOWbyte.
    Das ganze dann nochmal mit dem Highbyte.
    Fertig, das ist alles!
    Nichts fertig
    Ich verstehs einfach nicht.
    Wir haben doch dort eine Schleife, also rufen wir doch auch 6x diesen Befehl hier auf:
    ldi temp , LOW ((daten * 2) + daten_laenge)
    Wenn nun das Zeichen "!" kommt, dann sind wir ja nicht mehr bei 6 Byte, sondern schon beim 12 Byte.
    Hmm..egal

  2. #262
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Lieber Thomas!
    Tust Du mir den gefallen und schaust Du Dir das mal im Simulator an?
    Immer mit F11 weiter und beobachte die Register uvm. ...

  3. #263
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Hab ich doch schon alles gemacht.

    ldi reg1, 0b00000000
    ldi reg2, 0b11111111
    cp reg2, reg1
    Dann hat sich im SREG was geändert, schau ich hier nach: http://www.avr-asm-tutorial.net/avr_...tail.html#SREG
    S und N sind auch 1. Was sagt mir das?
    Dass das Vorzeichen negativ ist und das Ergebnis dann logischerweise auch negtativ. Was schließe ich daraus? das der Befehl cp reg1 - reg2 rechnet. Aber das ist ja nicht so, denn bei deinem Bild, was du hier eingefügt hast, steht:
    cp Rd, Rr Compare Rd - Rr
    Müsste dann bei "cp reg2, reg1" wohl reg2 - reg1 sein. Aber da ist das Ergebnis ja nicht negativ, sonder = reg2.
    Bei cpc kommt bei den Werte oben dasselbe raus, soweit so gut, doch bei folgenden Werten:
    ldi reg1, 0b11111111
    ldi reg2, 0b11111111
    kommt bei cp reg2, reg1
    Z von SREG = 1, also Ergebnis ist 0, also die Werte beider Register sind
    gleich, logisch. Aber bei "cpc reg2, reg1" kommt auf einmal nichts raus. Also alle Bits von SREG sind 0. Somit heißt es unter anderem auch, dass die Werte der Register reg1 und reg2 ungleich sind, sind sie aber doch nicht.
    Ich hoffe, du weißt nun, wo mein Problem liegt

  4. #264
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Lieber Thomas! ;o)
    Also bei mir funktioniert das richtig!
    Ich komme irgendwie mit dem Problem nicht zurecht! ;o9 *schmunzel*

  5. #265
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Naja, dann is auch egal, muss ich eben so hinnehmen.

  6. #266
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    *g* Ist die Funktion trotzdem in etwa klar?

  7. #267
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Naja, weniger...
    Code:
    main:
    	lpm							;Daten laden
       	mov tmp, lpm_reg           ;in temp verschieben
       	adiw ZL, 1                 	;Z um eins erhöhen
       	ldi tmp, LOW  ((daten1 * 2) + daten_laenge)	;vergleiche LOW-Byte
       	cp ZL, tmp
       	ldi tmp, HIGH ((daten1 * 2) + daten_laenge) ;vergleiche HIGH-Byte
       	cpc ZH, tmp
       	breq ende                   ;springe zu ende, wenn letztes Byte ausgelesen
       	rjmp main					;nochmal
    
    ende:							;Endschleif
    	rjmp ende
    Nach diesem Befehl hier
    mov tmp, lpm_reg
    erhöhen wir den Zeiger ja um 1, ne? Damit wir das nächste Byte bekommen, also den nächsten Buchstaben. Und dann benutzt du aber wieder das gleich Register, wo wir ja eigentlich das Wort "Hallo!" drinne haben wollten:
    ldi tmp, LOW ((daten1 * 2) + daten_laenge)
    Da schreiben wir dann in tmp wieder einen völlig anderen Wert.

    [EDIT]
    Was mir grad auffällt, nach der Zeile hier:
    cp ZL, tmp
    da werten wir den Vergleich gar nicht aus, sonder nur nach cpc wird ausgewertet. Wieso das denn?

  8. #268
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    In dem Moment, wo wir die main-Schleife betreten haben wir ja noch die Adresse von 'H' in Z stehen, also daten1 + 0.
    Wir lesen dann das 'H' aus.
    Danach erhöhen wir auf daten1 + 1 und vergleichen mit dem Wert für das erste Byte nach dem String, also daten1 + 6 (das siebte Byte).
    Nun springen wir wieder an den Anfang.
    und mache das gleiche mit 'a', 'l', 'l', 'o' und '!'.
    Sobald wir nach dem '!' wiederholen, sieht das ganze so aus:
    Wir haben im Z daten1 + 5 (6. Byte) und laden mit lpm das Byte in r0.
    Das verschieben wir nach temp.
    Danach erhöhen wir Z um 1, also haben wir daten1 + 6 (7.Byte, was nciht mehr da ist).
    Wir vergleichen nun die Register mit jeweils dem Endwert und da glaich, springen wir mit breq zum Ende!

    Ich hoffe es war verständlicher?

  9. #269
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Ja, schon ein wenig, zwar nicht ganz...naja, für manche Sachen ist mal wohl zu doof. Das wird auch nicht das wichtigste sein, denk ich. Ich hoffe ich kann auch weitermachen, wenn ich das jetzt hier nicht so richtig verstanden habe.

    Aber wenn wir beim "!" angekommen sind, dann ist doch das aktuelle Byte das Byte 6 oder? Weil ja das Ausrufezeichen das 6. Zeichen ist. Und wenn wir dann noch mit daten1+6 vergleichen, dann sind wir ja bei 12, denn 6 (Byte 6 = !) + 6 (Das Ende von der Zeichenkette) = 12.

  10. #270
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hallo Thomas!
    Du würfelst jetzt alles durcheinander!
    Nur zu Anfang wird die Adresse mal 2 genommen!
    Zum Schluss wird immer nur + 1 genommen, ohne dass mal 2 genomnmen wird!
    'H' ist das 1. Byte und wird bei (daten1 * 2) + 0 ausgelesen.
    'a' ist das 2. Byte und wird bei (daten1 * 2) + 1 ausgelesen.
    'l' ist das 3. Byte und wird bei (daten1 * 2) + 2 ausgelesen.
    'l' ist das 4. Byte und wird bei (daten1 * 2)1 + 3 ausgelesen.
    'o' ist das 5. Byte und wird bei (daten1 * 2) + 4 ausgelesen.
    '!' ist das 6. Byte und wird bei (daten1 * 2) + 5 ausgelesen.
    FF ist das leere Byte nach dem Strin (Zeichenkette) und wird mit (daten1 * 2) + 6 ausgelesen.


    ich glaube ich habe Dich durcheinander gebracht! *lol*

Seite 27 von 53 ErsteErste ... 17252627282937 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress