www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Buch AVR von Günter Schmitt durcharbeiten


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich besitze schon die Bücher "AVR-Mikrocontroller-Praxis" 1999
                             "AVR-RISC Mikrocontroller  " 2003

und nun "Mikrocomputertechnik mit Controllern der Atmel 
AVR-RISC-Familie"
in der 4.ten Auflage 2008. Das Lernpaket Mikrocontroller habe ich durch.

Bei meinen eigenen Programmierungen halfen mir die ersten beiden Bücher 
nur
zum Teil, da sie schon ziemlich alt sind. Ich nutzte sie als 
Nachschlage-
werke.
Nun bin ich zu der Einsicht gekommen, das nur nachschlagen mich nicht 
weiterbringt. Zwar habe ich schon Erfahrungen mit dem MC68HC11 
gesammelt,
aber z.B. die Befehle sbi, sbr, sbis, sbrs bzw. cbi, cbr, sbic, sbrc
machten mich Wahnsinnig. Auch weil der AVR-Studio Simulator in der
Version 4.10 fehlerhaft war.

Beitrag "Portpin wird automatisch gelöscht im AVR-Studio 4.10"

Nun möchte ich das zu letzt genannte Buch mit Eurer Hilfe durch 
arbeiten.
Und zwar dachte ich mir das Folgendermaßen :

Alle Fragen beziehen sich nur auf dieses Buch und auch nur auf die
4te Auflage.
Es wird die Seitenzahl angegeben auf die sich die Frage
bezieht. Evtl. kann man noch ein Stück vom Orginaltext einfügen.
Den kann man vielleicht aus der folgenden WWW-Seite kopieren kann.

http://books.google.de/books?id=AI_HVUE0xYEC&pg=PA...

Nun gut, hier die erste Frage :

Seite 21
Das Carrybit wird zwar verändert,....

Ich habe jetzt schon einige Versuche im AVR-Studio Simulator 
durchgeführt aber habe noch nicht bemerkt das das Carrybit verändert 
wurde ohne das dies Richtig wäre.
Hat jemand von Euch vielleicht ein einleuchtendes Beispiel hierzu ?

Bis dann
Bernd_Stein

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:

> Ich habe jetzt schon einige Versuche im AVR-Studio Simulator
> durchgeführt aber habe noch nicht bemerkt das das Carrybit verändert
> wurde ohne das dies Richtig wäre.
> Hat jemand von Euch vielleicht ein einleuchtendes Beispiel hierzu ?

Zeig doch erst mal dein Beispiel.

Und bitte bezieh dich nicht ausschliesslich nur auf irgendein Buch. 
Beschreibe kurz das Umfeld, in dem deine Frage existiert. Gib noch 
zusätzlichen Kontext an, alles was dir notwendig erscheint.

PS: Es ist nicht ungewöhnlich, dass einem dieses Zusammenstellen von 
Informationen für Dritte die Erleuchtung bringt!
Es gab mal eine Zeit, in der Studenten an der MIT ihre 
Programmierprobleme einem Teddybären erzählen mussten (Sekretärin hat 
darüber gewacht) ehe sie zum Praktikumsbetreuer vorgelassen wurden. Die 
Legende sagt, dass danach ungefähr 80% wieder abgezogen sind und gar 
keine perönliche Betreuung mehr gebraucht haben.

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lese das mal durch.
http://www.avr-roboter.de/controller/befehle/besch...

C: Das C-Flag wird gesetzt, wenn im Ergebnis ein Überlauf von Bit 8 
erfolgte, andernfalls wird es gelöscht.
Schicke mal den Code den Du hast zum Testen und nicht verstehst.

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun ja,

ich wollte halt das die Leute genau wissen worum es geht ohne das ich 
viele Worte bzw. Buchstaben verlieren muß.
Dummerweise habe ich gleich bei der ersten Frage einen Fehler gemacht 
und bekomme natürlich prompt auch eine verkehrte Antwort.

 ldi  r16, 0b01111111  ;127 bzw. $7F
 subi r16,-0b00000001  ;  1 bzw. $01 hier wird durch (-1) 1 addiert !

Also richtig ist :

Warum wird das Carry-Flag gesetzt ?

Es wird doch nicht der 8-Bit Wertebereich überschritten.

Der Paralleladdierer auf Seite 14 oder die Zeichnungen
auf Seite 16 bzw. 18 helfen mir da leider nicht weiter.

Ich möchte keine Werbung für irgend ein Buch oder Autor machen.
Noch möchte ich irgendwelche Leute aus dieser Diskusion hier
ausschließen.
Deshalb auch der Link für die Leute die das Buch nicht besitzen.
Ich habe auch nicht alle möglichen Boards, Programmer, Programme, 
Mikrocontroller und kann deshalb einigen Treads auch nicht folgen.

Ich möchte nur möglichst genau beschreiben was ich meine ohne viele 
Worte zu verlieren. Und ein Bild sagt nun mal mehr als tausend Worte.
Abgesehen davon, wie lange ich wohl brauchen würde um den 
Paralleladdierer
hier als Zeichnung hinzubekommen.

MfG
Bernd_Stein

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:
> ich wollte halt das die Leute genau wissen worum es geht ohne das ich
> viele Worte bzw. Buchstaben verlieren muß.

Dummerweise lässt einen Google bei seiner Buchansicht nicht alle Seiten 
lesen. Seite 21 fehlt bei mir zum Beispiel. Nur 19 und 23 werden 
gezeigt.
Wird also nichts mit Deinem Vorhaben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:

>  ldi  r16, 0b01111111  ;127 bzw. $7F
>  subi r16,-0b00000001  ;  1 bzw. $01 hier wird durch (-1) 1 addiert !

Weil du hier offensichtlich auf vorzeichenbehaftete Arithmetik aus bist.
Das Bitmuster für -1 ist aber   0b11111111

> Also richtig ist :
>
> Warum wird das Carry-Flag gesetzt ?


C: Rd7 • K7 +K7 • R7 +R7 • Rd7

Set if the absolute value of K is larger than the absolute value of Rd; 
cleared otherwise.

Grundsätzlich:
Damit eine Kaskadierung von Subtraktionen auf zb 16 Bit möglich ist. In 
diesem Fall ist das Carry bei einer Subtraktion keine Indiz für einen 
Überlauf, sondern ein Indiz, dass man sich von der nächsthöheren Stelle 
eine 1 geborgt hat.

So wie in:   91 - 8

    1 - 8 macht 3 und dazu hab ich mir von der Stelle daneben eine 1 
geborgt. Also muss man von der 9 auch noch 1 abziehen. Diese geborgte 1 
ist das Carry-Flag, welches bei 1 - 8 entstanden ist.

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian H. schrieb:
> Dummerweise lässt einen Google bei seiner Buchansicht nicht alle Seiten
> lesen. Seite 21 fehlt bei mir zum Beispiel. Nur 19 und 23 werden
> gezeigt.
> Wird also nichts mit Deinem Vorhaben.
>
Leider hast Du ein wenig recht. Jeder der das Buch nicht hat oder nicht 
in der 4ten Auflage dürfte Probleme haben hier zu folgen.

So ist es aber auch, wenn man ein bestimmtes Board, Software,
Mikrocontroller oder sonst etwas nicht hat.
Schade das dies Vorhaben erstens vom Moderator nicht ganz akzeptiert 
wird und zweitens nicht für jeden zugänglich (Wegen des fehlenden 
Buches).

Bis dann
Bernd_Stein

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:

> Schade das dies Vorhaben erstens vom Moderator nicht ganz akzeptiert
> wird

Es ist ganz einfach:
Wenn du Fragen hast, dann stelle die Frage hier.
Wenn du dabei auf etwas externes verlinken musst, gut, dann tu das. Aber 
eine Frage, die im wesentlichen nur aus einem Link besteht, werden wir 
hier ganz sicher nicht akzeptieren.
Du bist es, der die Frage hat. Also gib dir auch ein wenig Mühe die 
Frage in deinen Worten zu formulieren.

Wir geben uns ja auch Mühe die Antwort möglichst als ganze deutsche 
Sätze zu formulieren und schmeissen dir nicht einfach ein paar Brocken 
hin.

In deinem konkreten Fall, falls du es noch nicht gemerkt hast, liegt die 
Antwort auf deine Frage darin, dass du nicht addierst, sondern 
subtrahierst. Und da gelten dann ein klein wenig andere Regeln für das 
Carry Bit.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:
> Nun bin ich zu der Einsicht gekommen, das nur nachschlagen mich nicht
> weiterbringt. Zwar habe ich schon Erfahrungen mit dem MC68HC11
> gesammelt,
>
> aber z.B. die Befehle sbi, sbr, sbis, sbrs bzw. cbi, cbr, sbic, sbrc
> machten mich Wahnsinnig. Auch weil der AVR-Studio Simulator in der
> Version 4.10 fehlerhaft war.

"War" ist aber nicht mehr aktuell. Und mal ehrlich, du hast 3 (!!!) 
Bücher zum Thema, dazu einen funktionierenden Simulator, und dazu das 
ganze Internet zum durchlesen. Das sollte doch hinzubekommen sein.

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Bernd_Stein schrieb:
>> Nun bin ich zu der Einsicht gekommen, das nur nachschlagen mich nicht
>> weiterbringt. Zwar habe ich schon Erfahrungen mit dem MC68HC11
>> gesammelt,
>>
>> aber z.B. die Befehle sbi, sbr, sbis, sbrs bzw. cbi, cbr, sbic, sbrc
>> machten mich Wahnsinnig. Auch weil der AVR-Studio Simulator in der
>> Version 4.10 fehlerhaft war.
>
> "War" ist aber nicht mehr aktuell. Und mal ehrlich, du hast 3 (!!!)
> Bücher zum Thema, dazu einen funktionierenden Simulator, und dazu das
> ganze Internet zum durchlesen. Das sollte doch hinzubekommen sein.

Und .. er hat auch noch die Befehlsreferenz über F1

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner hat Lust, sich erstmal umständlich 100 Dokumente zusammenklauben 
zu müssen.

Wenn Du Fragen hast, lies die Postingregeln und richte Dich einfach 
danach:

Nutze die Formatierung, um Quelltext einzufügen.
Nutze Copy&Paste dazu, d.h. Quelltext immer exakt, niemals aus dem Kopf 
nachempfinden.
Dito für Fehlermeldungen.

Und dann schreib einfach Deine Frage dazu (leidlich gute Rechtschreibung 
ist von Vorteil).


Peter

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> In deinem konkreten Fall, falls du es noch nicht gemerkt hast, liegt die
> Antwort auf deine Frage darin, dass du nicht addierst, sondern
> subtrahierst. Und da gelten dann ein klein wenig andere Regeln für das
> Carry Bit.
>
>  ldi  r16, 0b01111111  ;127 bzw. $7F
>  subi r16,-0b00000001  ;  1 bzw. $01 hier wird durch (-1) 1 addiert !
>
> Weil du hier offensichtlich auf vorzeichenbehaftete Arithmetik aus bist.

Das ist richtig, es geht um vorzeichenbehaftete Zahlen in diesem 
Abschnitt des Buches.

Aber ich wollte zu 127 bzw. $7F eins hinzu addieren.
Und das geht wie ich bisher verstanden habe, weil es kein (adi)
gibt mit subi -(Wert).
Mir ist klar das das N-Flag gesetzt wird => $80 Bit7 gesetzt.
Auch das V-Flag, weil ich jetzt vom positiven Bereich durch addieren
einer positiven Zahl (+1) in den negativen Bereich gelangt bin.

               Warum wird das Carry-Flag gesetzt ?

http://www.mikrocontroller.net/articles/AVR-Tutori...

> C: Rd7  K7 +K7 • R7 +R7 • Rd7
>
> Set if the absolute value of K is larger than the absolute value of Rd;
> cleared otherwise.

Carry = 1 wenn (/Rd7 und K7) oder (K7 und R7) oder (R7 und /Rd7)

so habe ich das mal übersetzt und korrigiert, da beim kopieren aus dem
AVR-Instuction-Set die negationen nicht mit übernommen wurden für den 
Befehl SUBI.

Rd = Destination (Ziel) also r16

K7 = Kontstante Bit 7

R7 = Result Bit 7 also wieder r16 ???

Um dies zu verstehen fehlt mir noch die Erkenntnis wo sich R7 zuordnen 
läßt (Result).

Ist dies ein internes Hilfsregister auf das nicht zugegriffen werden 
kann,
welches nur das Statusregister (SREG) beeinflußt,
wie ich dies aus Seite 20 interpretiere ?

Bis dann
Bernd_Stein

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:

> Aber ich wollte zu 127 bzw. $7F eins hinzu addieren.
> Und das geht wie ich bisher verstanden habe, weil es kein (adi)
> gibt mit subi -(Wert).

Richtig.
Trotzdem kannst du aber die Bedeutung des Carry Flags nicht einfach 1:1 
von der Addition zur Subtraktion übernehmen.

Bei einer Addition zeigt das Carry an, dass ein Überlauf entstand und 
daher im nächst höheren Byte (bei 16 Bit Arithmetik) daher noch 1 
addiert werden muss.

Bei einer Subtraktion zeigt das Carry an, dass von der nächst höheren 
Stelle 'geborgt' werden musste und man daher vom nächst höheren Byte 
(bei 16 Bit Arithmetik) daher noch 1 sbtrahieren muss.

Im Endeffekt kommt (bei 16 Bit Arithmetik) es alles aufs richtige raus. 
Aber aus verschiedenen logischen Gründen.

(Wenn man so will, zeigt das Carry bei einer Subtraktion einen Unterlauf 
an, in Analogie zu einem Überlauf bei einer Addition)

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde den Lernaufwand in die Sprache C investieren.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Warum wird das Carry-Flag gesetzt ?

Das Carry-Flag wird unabhängig von irgendwelchen Vorzeichenbetrachtungen 
gesetzt. Aus Sicht des Carryflags lautet deine Rechnung:

    $7F - $FF = $80

Und da du eine grössere Zahl von einer kleineren abziehst bekommst du 
einen Übertrag und das Carryflag wird gesetzt.

MfG Spess

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Ich würde den Lernaufwand in die Sprache C investieren.

Wie will man mit "C" einen AVR "richtig" Programmieren wenn man 
Assembler nicht kann?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja.
Ums Carry Bit brauchst du dich nicht kümmern.
Es schadet nichts, wenn man weiß was es damit auf sich hat. Aber die 
Behandlung des Carry (und noch einiger anderer Low-Level Dinge) fällt in 
die Domäne des Compilers und ist nichts was einem Programmierer 
Kopfzerbrechen machen sollte. Solange man bei C bleibt.

Was nicht heißt, das ich dieses Wissen für nicht sinnvoll halte.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:
> Um dies zu verstehen fehlt mir noch die Erkenntnis wo sich R7 zuordnen
> läßt (Result).

Auf Seite 2 des Instruction Set Maunals von Atmel steht:
Rd: Destination (and source) register in the Register File
Rr: Source register in the Register File
R: Result after instruction is executed

Oliver

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>Warum wird das Carry-Flag gesetzt ?
>
> Das Carry-Flag wird unabhängig von irgendwelchen Vorzeichenbetrachtungen
> gesetzt. Aus Sicht des Carryflags lautet deine Rechnung:
>
>     $7F - $FF = $80
>
> Und da du eine grössere Zahl von einer kleineren abziehst bekommst du
> einen Übertrag und das Carryflag wird gesetzt.
>
> MfG Spess

Schade das ich hier nicht das Bild des Paralleladdieres von Seite 14 zur 
Verfügung habe.
Also das Rechenwerk bzw. ALU führt ja eine Subtraktion auf eine Addition 
zurück. Die Anweisung -Wert für den Assembler erzeugt ja nur das
Zweierkomplement des Wertes, was ja die negative Entsprechung des Wertes 
ist. Z.B. :

 ldi  r16,-1  ;lädt r16 mit dem Wert $FF = -1

Mit dem Befehl

 subi r16,-1 ;

führe ich doch auch nur eine Addition mit dem Zweierkomplement durch,
oder etwa nicht ?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:
> Mit dem Befehl
>
>  subi r16,-1 ;
>
> führe ich doch auch nur eine Addition mit dem Zweierkomplement durch,
> oder etwa nicht ?

Nein, es wird genau das gemacht, was da steht, nämlich -1 (also ff) 
subtrahiert. Und dabei entsteht ein Überlauf. Dass -1 zu subtrahieren 
auf einer logischen Ebene das gleiche ist, wie 1 zu addieren 
interessiert das Carry-Bit nicht. Das reagiert nur auf das, was 
tatsächlich passiert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:

> Mit dem Befehl
>
>  subi r16,-1 ;
>
> führe ich doch auch nur eine Addition mit dem Zweierkomplement durch,
> oder etwa nicht ?

Aber kein Mensch sagt, dass die Behandlung des Carry Bits bei Addition 
und Subtraktion gleich ist.

Im Quellcode steht subi
Also wird auch subtrahiert.
Also werden die im Datenblatt angegebenen Regeln zur Bildung des Carry 
BIts benutzt. Und zwar die bei subi angegebenen!

Was intern in der CPU abgeht, wenn sie einen subi ausführt, ist 
vielleicht 'nice to know', aber letztendlich zählt das was im Datenblatt 
bei genau diesem Befehl als Auswirkungen geschrieben steht.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du solltest das Instruction-Set richtig lesen. Zum Carry-Flag bei 'subi' 
steht:

Set if the absolute value of K is larger than the absolute value of Rd; 
cleared otherwise.

Fertig und aus.

Lass dir mal absolute *value* auf der Zunge zergehen

MfG Spess

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
> Du solltest das Instruction-Set richtig lesen. Zum Carry-Flag bei 'subi'
> steht:
>
> Set if the absolute value of K is larger than the absolute value of Rd;
> cleared otherwise.
>
> Fertig und aus.
>
> Lass dir mal absolute value auf der Zunge zergehen
>
> MfG Spess


Ja, genau und das möchte ich Hardwaremäßig an Hand des Paralleladdieres 
von Seite 14 verstehen, warum dies geschieht, das das Carry-Flag gesetzt 
wird.

MfG
Bernd_Stein

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ja, genau und das möchte ich Hardwaremäßig an Hand des Paralleladdieres
>von Seite 14 verstehen, warum dies geschieht, das das Carry-Flag gesetzt
>wird.

Du hast es hier aber mit einer Subtraktion von 2 Bytes zu tun. Aus dem

subi r16,-1 macht der Assembler subi r16,$FF und genau das wird 
gerechnet.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd_Stein schrieb:

> Ja, genau und das möchte ich Hardwaremäßig an Hand des Paralleladdieres
> von Seite 14 verstehen, warum dies geschieht, das das Carry-Flag gesetzt
> wird.

Die entsprechende Logik ist dort nicht eingezeichnet. Dort geht es 
ausschliesslich um Addition. (Und nein, auch wenn logisch gesehen 
Subtraktion als Additionsersatz benutzt werden kann, so passiert im 
Inneren höchst wahrscheinlich etwas anderes. Erkennbar an der 
Beschreibung wie die Flags auf die Befehle reagieren)

Das ist ein Prinzipschema, wie es so ganz sicher nicht im AVR 
implementiert ist.
Wollte man die komplette Logik, so wie sie realisiert ist, im Buch 
abbilden, so wären das ein paar hundert Seiten nur Diagramme.

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> subi r16,-1 macht der Assembler subi r16,$FF und genau das wird
> gerechnet.

Ich hab mal ne Frage, wozu braucht man das: "subi r16,-1" ?
(Ist wirklich ehrlich gemeint)

Bernd_Stein,
Du darfst nicht so sehr davon ausgehen was Du schreibst, sondern was der 
Assembler draus macht und in den Flash schreibt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MarioT schrieb:
> spess53 schrieb:
>> subi r16,-1 macht der Assembler subi r16,$FF und genau das wird
>> gerechnet.
>
> Ich hab mal ne Frage, wozu braucht man das: "subi r16,-1" ?
> (Ist wirklich ehrlich gemeint)

Die AVR haben keinen addi
Aber man kann natürlich auch -1 abziehen (oder irgendeinen anderen Wert)

   i = j + k    <-->   i = j - (-k)

> Du darfst nicht so sehr davon ausgehen was Du schreibst,
> sondern was der Assembler draus macht und in den Flash schreibt.

Na ja, das ist im Falle des AVR Assembler schon dasselbe.
Aber er macht den Fehler ein Prinzipschaltbild mit dem was real im 
Prozessor implementiert ist zu verwechseln. Prinzipschaltbilder sind 
notgedrungen abgespeckt und konzentrieren sich auf einen Aspekt. In dem 
Fall eben Addition. Er hat aber keine Addition und daher gilt das 
Prinzipschaltbild nicht mehr in allen Details.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> MarioT schrieb:
>>
>> Ich hab mal ne Frage, wozu braucht man das: "subi r16,-1" ?
>> (Ist wirklich ehrlich gemeint)
>
> Die AVR haben keinen addi
> Aber man kann natürlich auch -1 abziehen (oder irgendeinen anderen Wert)
>
>    i = j + k    <-->   i = j - (-k)

Ursprünglich war wohl ein addi und ein adci im AVR-Instruktionssatz 
vorgesehen. Aber da es subi/sbci gibt, ist ein Befehlspaar überflüssig 
und belegt nur Platz auf dem Silizium und in der Opcode-Tabelle, der 
sinnvoller für was anderes genutzt werden kann.

AVR eintstand teilweise im Codesign mit Compilerbauern, er sollte darauf 
ausgelegt werden, daß Compiler möglichst effizienten Code erzeugen 
können. Und einem Compiler ist es egal, ob er +1 oder -(-1) 
hinzuschreiben hat. Comfort für Assembler-Programmierer steht da nicht 
ganz oben auf der Liste...

Warum die beiden Immediate-Additionen rausgeflogen sind und nicht die 
Immediate-Subtraktionen, darüber kann man spekulieren. Vielleicht weil 
die Logik der sub-Befehle genauso ist wie die der cmp-Befehle. Einziger 
Unterschied ist, daß die compares nur die Flags verändern und kein 
Ergebnis schreiben. Und leider fehlt ein sinnvolles cpci (compare with 
carry immediate) :-(

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Die AVR haben keinen addi

Ist schon klar. Ich würde es aber eher so "subi r16,$FF" machen

Karl heinz Buchegger schrieb:
> Na ja, das ist im Falle des AVR Assembler schon dasselbe.

Ok hast ja recht. Ich meinte das der Assemler keine negative Zahl("-1") 
schreibt sondern nach "11111111" umwandelt(ist natürlich quatsc, weil 
beides das gleiche ist). Noch besser ist natürlich, wenn man davon 
ausgeht, das es negative Zahlen gar nicht gibt.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich meinte das der Assemler keine negative Zahl("-1")
>schreibt sondern nach "11111111" umwandelt

Das Ganze hat eigentlich mehr mit der Lesbarkeit des Programms zu tun.

MfG Spess

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
>> Ja, genau und das möchte ich Hardwaremäßig an Hand des Paralleladdieres
>> von Seite 14 verstehen, warum dies geschieht, das das Carry-Flag gesetzt
>> wird.
>
> Die entsprechende Logik ist dort nicht eingezeichnet. Dort geht es
> ausschliesslich um Addition.

Das sehe ich nicht so.

Erstens  in Klammern (Minuend) und (Subtrahend negiert).
Zweitens Steuerbit S = 0 addieren, S =1 subtrahieren
auf der nachfolgen Seite zu lesen.

Nur wenn ich die Volladdierer (VA) durch die AND, EXOR, und OR Schaltung
aufgelöst aufzeichne und dies durchspiele komme ich nicht zum richtigen 
Ergebnis.

Für die Additon ist alles in Ordnung.

Bis dann
Bernd_Stein

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> AVR eintstand teilweise im Codesign mit Compilerbauern, er sollte darauf
> ausgelegt werden, daß Compiler möglichst effizienten Code erzeugen
> können. Und einem Compiler ist es egal, ob er +1 oder -(-1)
> hinzuschreiben hat. Comfort für Assembler-Programmierer steht da nicht
> ganz oben auf der Liste...

Wobei Assembler Programmierer in deinem Sinne der Assemblerprogrammierer 
vor 50 Jahren ist, der Hex-Codes eintippt ;-)

Selbst ein Makro Assembler könnte ein ADDI r, k Befehl einführen, das 
einfach nur ein Makro ist für SUBI r, -k. Wobei man immer noch das 
Problem hätte mit der kleinen, nennen wir es Inkonsistenz mit dem Carry 
Bit.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Nur wenn ich die Volladdierer (VA) durch die AND, EXOR, und OR Schaltung
>aufgelöst aufzeichne und dies durchspiele komme ich nicht zum richtigen
>Ergebnis.

Mit dem Adder aus dem Buch passt es übrigens auch.


                       0111 1111    $7F
                      +0000 0000   /$FF
               /Ca    +        1
                ----------------
                    0  1000 0000
               /Cy  1

ergibt $80 und Cy=1

MfG Spess

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
>>Nur wenn ich die Volladdierer (VA) durch die AND, EXOR, und OR Schaltung
>>aufgelöst aufzeichne und dies durchspiele komme ich nicht zum richtigen
>>Ergebnis.
   _________________________________
  |                                  |
  SB          a   b                  |  C_alt     C_alt = Carry-Flag_alt
  |           |   |                  |    |
  |           |___|_________         |    |
  |           |   |____     |        |    |       SB = 0 addieren
  |           |   |    |    |        |    |       SB = 1 subtrahieren
  |    {HA}  [ AND ]  [ EXOR ]      [ EXOR ]
  |             |         |    _________|
  |             |         |___|____     |
  |             |         |   |    |    |
  |             |        [ AND ]  [ EXOR ]  {HA}  HA = Halbaddierer
  |             |           |         |
  |             |     ______|         |
  |             |    |                | SB = 1 => Subtraktionsbit
  |            [  OR  ]               |  a = 0 => 1.Summand bzw.
  |                |                  |           (Minuend)
  |____________    |                  |
               |   |                  |  b = 1 => 2.Summand bzw.
             [ EXOR ]                 |           (Subtrahend negiert)
                 |                    |
                 |                    |         C_neu = Carry-Flag_neu
               C_neu                Summe

                 1                    1

Jetzt passt es.
Habe den Text auf Seite 15 Fehlinterpretiert. Habe Ca immer negiert.
Auch das gepunktete Rechteck um Ca herum deutet darauf hin,
deshalb hatte ich es nicht verstanden.

Bis demnächst
Bernd_Stein

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Glaubst du ehrlich das das dir weiterhilft? Oder willst du einen 
Controller nachbauen?

>Bei meinen eigenen Programmierungen halfen mir die ersten beiden Bücher
>nur zum Teil, da sie schon ziemlich alt sind. Ich nutzte sie als
>Nachschlagewerke.

Wenn du schon programmiert hast, was soll dann der Scheiss. Irgendwie 
habe ich das Gefühl, das du dir selbst massiv im Weg stehst.

MfG Spess

Autor: PeterH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau bei Deinen AVR Programmierungen zuallererst in die Instruction-Set 
Doku, da steht ohne jeden Schnörkel  drin was Du ganz konkret machst 
bzw. machen kannst. Ich glaub wirklich (und so hab ichs auch gelernt) 
das Einfachste und Hilfreichste ist wenn Du wirklich ganz unten 
anfängst. Alles andere lenkt zunächst nur ab (gerade auch bei höherem 
Abstraktionslevel) wenn dieses Grundwissen fehlt.

Autor: Bernd_Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was Wichtiges.

Beim Bild vom 2-Bit Addierer / Subtrahierer
ist b beim subtrahieren (b = Subtrahend) zu negieren.

Bis demnächst
Bernd_Stein

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.