mikrocontroller.net

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


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
1 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
-1 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
1 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
1 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

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

es ist wirklich schade das in diesem Buch so verdammt spärlich auf die 
Bedingungsbits ( Flags ) im Statusregister ( SREG ) eingegangen wird.

Ich beschäftige mich gerade eingehend mit dem Halfcarry-Flag,
was sich genauso verhalten dürfte wie das Carry-Flag. Nur halt mit dem 
Bit3.

Beim NEG-Befehl steht foldendes :

Rd <= $00 - Rd

H = P3 + /Rd3

Jetzt habe ich folgendes progrämmchen im ATMEL-Studio 7.0.1188 laufen 
lassen und wunderte mich, das das Halfcarry-Flag nicht gesetzt wurde, 
obwohl Rd ja = $00 ist, was ich mal als /Rd interpretiere.
;
;.INCLUDE "m8def.inc"        ;AVR-Definitionsdatei einbinden
.CSEG                       ;was ab hier folgt kommt in den FLASH-Speicher
.ORG $0000              ;Programm beginnt an der FLASH-Adresse 0x0000.CSEG 

.INCLUDE "Header_A400_BS.inc" ;Einbinden der Controllerspezifischen 
                              ;Definitionsdatei, sowie weitere Definitionen und
                              ;Wertezuweisungen
                               
_RESET:                     ;Hier beginnt der µC nach einem Reset mit seiner Arbeit
 rjmp _START             ;Springe zum Programmbeginn

_START: 

 clr    al                  ;Arbeitsregister-Low Null setzen...
 neg    al                  ;... und das Zweierkomplement davon bilden
 
 rjmp   _START
    
.EXIT                       ;Ende des Quelltextes

Wo ist mein Gedankenfehler ?


Bernd_Stein

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bernd Stein (bernd_stein)

>es ist wirklich schade das in diesem Buch so verdammt spärlich auf die
>Bedingungsbits ( Flags ) im Statusregister ( SREG ) eingegangen wird.

Bist du aus einer Zeitmaschine gefallen? Der Thread ist SIEBEN Jahre 
alt.

>Ich beschäftige mich gerade eingehend mit dem Halfcarry-Flag,

Seit SIEBEN Jahren? OMG!

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> es ist wirklich schade das in diesem Buch so verdammt spärlich auf die
> Bedingungsbits ( Flags ) im Statusregister ( SREG ) eingegangen wird.

Wir schreiben inzwischen das Jahr 2017 - das Buch ist 9 Jahre alt!

Wer verlässliche Informationen zu Befehlssätzen sucht, sollte sich die 
Literatur des Herstellers zulegen. Im Fall von AVR's das hier:

http://www.atmel.com/images/Atmel-0856-AVR-Instruc...

Da steht klar drin:

Diese Operation Subtrahiert den Wert des Registers von $00. Das H Fag 
wird gesetzt, wenn dabei von Bit 3 geborgt wird.

Mein sohn lernt gerade ind er 4. Schulklasse das schriftliche 
Subtrahieren von großen Zahlen. Wenn ich mal die Regeln, die er dort 
lernt auf das Binärsystem anwende, dann muss man sich von Bit 3 eine 1 
borgen, wenn rechts davon irgend ein Bit gesetzt war.

Zumindest der Simulator des Atmel Studio 4.19 tut das auch genau so.
#include "tn13def.inc"

            ldi r16,0b000001000
            neg r16

            ldi r16,0b000000100
            neg r16

            ldi r16,0b000000010
            neg r16

            ldi r16,0b000000001
            neg r16

            ldi r16,0b000001111
            neg r16

ende:
            rjmp ende 

Nun zu deinem Code:

> clr   al
> neg   al

Das ergibt die Operation 0 - 0. Da muss man nichts borgen, als kein 
Half-Carry Flag.

Wir sind also immer noch dabei, die Subtraktion zu lernen, wie vor 7 
Jahren - meinst du das ernst?

: Bearbeitet durch User
Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan U. schrieb:
> Wir sind also immer noch dabei, die Subtraktion zu lernen, wie vor 7
> Jahren - meinst du das ernst?
>
Nein.
Das der µC in Wirklilchkeit gar keine Subtraktion kennt, sondern nur die 
Addition mit dem Zweierkomplement, habe ich mir die ganzen Jahre über 
gemerkt und weiß es sogar auch anzuwenden :-)

Mein Problem lag in dem Verständnis des von dir verlinktem
" Instruction Set Manual ". Dein Beitrag hat mir in der Hinsicht etwas 
mehr die Augen geöffnet, so daß ich mich nicht nur auf diese Sache 
versteifen sollte H = P3 + /Rd3, sondern auch nach dem dortigen Text 
richten muß => Set if there was a borrow from Bit3; cleared otherwise.

Allerdings bin ich mit dieser Aussage nicht ganz einverstanden. Kann 
natürlich daran liegen, das ich das Englische falsch interpretiere und 
habe mir deshalb aus allem was ich hierzu gelesen habe, einen eigenen 
Satz zum Halfcarry-Flag zusammengezimmert :

Das Halfcarry-Flag wird gesetzt, wenn das Low-Nibble ( Bit3..0 ) 
überläuft, es also zu einem Übertrag zum High-Nibble kommt, oder bei 
einer Subtraktion der Wert des Low-Nibble größer ist, als der des 
High-Nibble, es also zu einem Borgen kommt.

Hab da jedoch noch eine Frage : " Was soll P3 bedeuten " ?


Bernd_Stein

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das der µC in Wirklilchkeit gar keine Subtraktion kenn...
> Was soll P3 bedeuten?

Wer ist "der" Mikrocontroller und wo hast du etwas über "P3" gelesen?

Die 8bit AVR Mikrocontroller, um die es in dem von mir zittierten 
Datenblatt geht und auf das ich Bezug nahm, können durchaus subtrahieren 
(SUB Befehl). Und P3 kommt in dem gesamten Dokument nirgends vor.

Kann es sein, dass du die Dokumentationen mehrerer Mikrocontroller 
durcheinander gewürfelt hast?

Autor: Bernd Stein (bernd_stein)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Stefan U. schrieb:
> Die 8bit AVR Mikrocontroller, um die es in dem von mir zittierten
> Datenblatt geht und auf das ich Bezug nahm, können durchaus subtrahieren
> (SUB Befehl). Und P3 kommt in dem gesamten Dokument nirgends vor.
>
Wenn du nicht über 7000 Beträge bisher geschrieben hättest und ich nicht 
der Meinung wäre, daß du etwas von der Materie verstehst, hätte ich 
nicht geantwortet.
Nun, da ein Bild ja bekanntlich mehr sagt als tausend Worte, habe ich 
dies mal angefügt.

Die ALU ( Arithmetic and Logic Unit ) bzw. das Rechenwerk kann ja noch 
nicht einmal im eigentlichen Sinne addieren, aber logische Verknüpfungen 
druchführen schon. Darauf baut ja die Addition auf.

Siehe : Beitrag "Re: Buch AVR von Günter Schmitt durcharbeiten"

oder die Seiten 13 bis 15 in dem zur Diskussion stehendem Buch.


Bernd_Stein

: Bearbeitet durch User
Autor: Alexander S. (alesi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd S. schrieb:
> Mein Problem lag in dem Verständnis des von dir verlinktem
> " Instruction Set Manual ". Dein Beitrag hat mir in der Hinsicht etwas
> mehr die Augen geöffnet, so daß ich mich nicht nur auf diese Sache
> versteifen sollte H = P3 + /Rd3, sondern auch nach dem dortigen Text
> richten muß => Set if there was a borrow from Bit3; cleared otherwise.

Bernd S. schrieb:
> Hab da jedoch noch eine Frage : " Was soll P3 bedeuten " ?

Stefan U. schrieb:
> Und P3 kommt in dem gesamten Dokument nirgends vor.

Auf S. 129 unter 84.2. Status Register (SREG) and Boolean Formula
in http://www.atmel.com/images/Atmel-0856-AVR-Instruc...
steht tatsächlich
  H  Ρ3 + /Rd3
  Set if there was a borrow from bit 3; cleared otherwise.

Ich denke das ist ein Tippfehler und soll R3 + /Rd3 heißen.

/Rd3 steht für Rd3 mit Oberstrich.

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessant, ich hatte eben in meine lokale Kopie des Manuals geschaut, 
und da steht in Kapitel 84.2 "H: R3 + /RD3"

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss meinen " selbstgezimmerten " Text zum Halfcarry-Flag bezüglich 
der Subtraktion noch einmal korrigieren, da er anscheinend so nicht 
stimmt. Es heißt nun für mich :

" Das Halfcarry-Flag wird gesetzt, wenn das Low-Nibble ( Bit3..0 )
überläuft, es also zu einem Übertrag zum High-Nibble kommt.
Bei der Subtraktion ist es zu invertieren. "

Wenn ich nämlich das folgende programm Handschriftlich nach der Devise :

" Der µC subtrahiert den Subtrahenden, indem er das Zweikomplement des 
Subtrahenden addiert " durchgehe, trifft dieser Satz zu.
_MAIN:
 ldi    r16,100   ;0110 0100
 subi   r16,50    ;0011 0010 Handschriftlich H = 1

 ldi    r16,100   ;0100 0100
 subi   r16,100   ;0100 0100 Handschriftlich H = 1

 ldi    r16,100   ;0100 0100
 subi   r16,200   ;1100 1000 Handschriftlich H = 0

 rjmp   _MAIN
;
;Ende des Hauptprogramms (falls keine Endlosschleife im Hauptprogramm)
;
_END:
 nop
 rjmp  _END        ;Endlosschleife


.EXIT          ;Ende des Quelltextes

Obwohl im letzem Beispiel ( 100 weniger 200 ), der Low-Nibble Wert 
nicht größer ist, wird das H-Flag vom µC gesetzt.


Bernd_Stein

Autor: Route 66 (route_66)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Ich hoffe noch so alt zu werden, bis du die nächste Frage zum Zero-Flag 
stellst.

Autor: Modellflieger (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Wie geil ist  das denn?
Sieben Jahre vor dem Rechner und den Büchern gesessen und jetzt wieder 
eine Frage.

Bernd programmierst Du eigentlich irgendetwas mit AVR oder sitzt Du nur 
vor dem Simulator und suchsts Schreibfehler im Datenblatt?

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Mit Vorzeichen kann ein Byte nur -128 bis +127 darstellen. -200 gibt es 
nicht (in einem Byte).

: Bearbeitet durch User
Beitrag #4953600 wurde vom Autor gelöscht.
Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bernd S. schrieb:
> Das Halfcarry-Flag wird gesetzt, wenn das Low-Nibble ( Bit3..0 )
> überläuft, es also zu einem Übertrag zum High-Nibble kommt, oder bei
> einer Subtraktion der Wert des Low-Nibble größer ist, als der des
> High-Nibble, es also zu einem Borgen kommt.

Scharf wäre es gewesen, wenn Du die entsprechenden Artikel mal gelesen 
hättest (in den vergangenen 7 Jahren):

Das Haupteinsatzgebiet ist der Bereich der BCD Arithmetik, bei der 
jeweils 4 Bits eine Stelle einer Dezimalzahl repräsentieren.

https://www.mikrocontroller.net/articles/AVR-Tutor...

Autor: Markus K. (markus-)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bernd S. schrieb:
> Die ALU ( Arithmetic and Logic Unit ) bzw. das Rechenwerk kann ja noch
> nicht einmal im eigentlichen Sinne addieren, aber logische Verknüpfungen
> druchführen schon. Darauf baut ja die Addition auf.

Was ist denn eine Addition "im eigentlichen Sinne"? Wird eine Addition 
in einem Prozessor nicht immer durch logische Verknüpfungen gemacht? Ist 
denn nicht sogar der ganze Prozessor eine große Ansammlung an 
Logikgattern?

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter F. schrieb:
> Mit Vorzeichen kann ein Byte nur -128 bis +127 darstellen. -200 gibt es
> nicht (in einem Byte).
>
Oh danke für diesen Hinweis. Habe ich auch völlig übersehen. Es geht mir 
eigentlich darum, im Vorfeld oder zumindest beim handschriftlichem 
Druchspielen zu erkennen, wann das H-Flag gesetzt wird oder nicht.

Habe mich jetzt mal eingehender mit der BCD-Arithmetik beschäftigt, 
finde aber immer nur 4-Bit und nirgends 8-Bit Aufgaben die 
handschriftlich zeigen wie es funktioniert. Habe mir diesbezüglich 
selber gepackte BCD-Aufgaben gestellt und dachte schon, das ich 
verstanden hätte wie es geht, aber dann...

 97d   1001 0111 $97
+16d  +0001 0110 $16
----  ----------
       1010 1101 Pseudotetrade    2x
      +0110 0110 Dezimalkorrektur 2x
      ----------
113d  C0001H0011 $113 passt alles wunderbar !!!


 99d   1001 1001 $99
+99d  +1001 1001 $99
----  ----------
      C0011H0010 Halfcarry gesetzt => Dezimalkorrektur anwenden
      +0110 0110 bei beiden Nibbles ?
      ----------
198d   1001 1000 $98

In der BCD-Arithmetik bei der Addition heißt es ja, wenn es ein Übertrag 
zu Bit4, also in die 5.Stelle gibt (H-Flag gesetzt ), so ist eine 
Dezimalkorrektur durchzuführen.

Jetzt stellte sich mir die Frage, ob dies nur beim Low-Nibble zu machen 
ist oder bei beiden. Wenn ich dies bei beiden machte kam ich dem 
Ergebnis schon sehr nahe, aber das Carryflag wurde nicht gesetz.
Es kommt als Ergebnis also nur 98 heraus und nicht die gewünschten 198.

Was läuft hier falsch und wo kann ich so etwas üben ?


Bernd_Stein

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsch läuft hier, dass du alle CPU's der Welt in eine Schublade stecken 
willst.

Wenn ein hersteller will, dass baut er Dir auch ein Carry Flash, dass 
nur bei der Addition und Überlauf von Bit 2 nach 3 gesetzt wird.

Du solltest Dich mal von deiner Vorstellung trennen, daß alle CPU's 
gleich funktionieren. Sie sind nicht die Inkarnation der 
Schul-Mathematik. Jede CPU hat irgendo ihre Sonderlocken.

Autor: Light up the magic in every little part (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Stefan U. schrieb:
> Jede CPU hat irgendo ihre Sonderlocken.

Das macht die Programmierung haarig.

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd S. schrieb:
> 99d   1001 1001 $99
> +99d  +1001 1001 $99
> ----  ----------
>       C0011H0010 Halfcarry gesetzt => Dezimalkorrektur anwenden
>       +0110 0110 bei beiden Nibbles ?
>       ----------
> 198d   1001 1000 $98

  99d        1001 1001 $99
 +99d       +1001 1001 $99
 ----       ----------
            C0011H0010 Halfcarry gesetzt => Dezimalkorrektur anwenden
            +0110 0110 bei beiden Nibbles ? -> ja, natürlich
            ----------
198d    0001 1001 1000 $198

-> passt. Das geht dann natürlich nur bei mehr als 8 Bit BCD - mit 8 Bit 
BCD kannst Du als Zahl nur max. 99 abbilden. Logisch - oder?

Übrigens:

https://kowa.hs-augsburg.de/medium/text/lehre/2009...

: Bearbeitet durch User
Autor: Bernd Stein (bernd_stein)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dieter F. schrieb:
> -> passt. Das geht dann natürlich nur bei mehr als 8 Bit BCD - mit 8 Bit
> BCD kannst Du als Zahl nur max. 99 abbilden. Logisch - oder?
>
Wie du siehst, kann man bei geschickter Carryflag-Auswertung auch bis 
198 darstellen.

Der Link hat einen unwichtigen Fehler, aber danke, daran konnte ich 
sehen wie so etwas bei mehr als 4-Bit gehandhabt wird. Folgendes 
Beispiel zeigt auch schön wie das H-Flag bei der Addition von BCD-Zahlen 
gebraucht wird. Nämlich dann, wenn es einen Übertrag gibt und dadurch 
angezeigt wird, das eine Dezimalkorrektur nötig ist.

 3619d   0011 0110 0001 1001
+5438d  +0101 0100 0011 1000
------  --------------------
         1000 1010 0101H0001  H=1 und Pseudotetrade
        +0000 0110 0000 0110  Dezimalkorrektur
        --------------------
 9057d   1001H0000 0101 0111  Ergebnis ( H-Flag jetzt uninteressant )


Bernd_Stein

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd S. schrieb:
> Wie du siehst, kann man bei geschickter Carryflag-Auswertung auch bis
> 198 darstellen.

Nö, nur erkennen. Darstellen und weiterverwenden ist etwas anderes.

Bernd S. schrieb:
> 9057d   1001H0000 0101 0111  Ergebnis ( H-Flag jetzt uninteressant )

Und wie kommt dann die 1 dahin?

100 1 H0000 0101 0111

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter F. schrieb:
> Und wie kommt dann die 1 dahin?
>
> 100 1 H0000 0101 0111
>
Schön zu sehen, das es mir allein nicht immer so geht, das ich mich 
ständig vertue.

Ich bin immer noch der Meinung, das man mit einem Byte bei geschickter 
Carryflag-Auswertung, drei Siebensegmentanzeigen, dahingehend nutzen 
kann, um zwei zweistellige positive gepackte BCD-Zahlen nach einer 
Addition bis zum Wert 198 richtig darauf anzuzeigen.

Allerdings könnte ich dies nur mit einem funktionierendem Programm bzw. 
mit zugehöriger Hardware beweisen. Dazu fehlt mir leider die Motivation, 
da dieser BCD-Kram ja nur äußerst selten genutzt wird und so wie ich 
gelesen habe aus der Finazwelt kommt, um Rundungsfehler auszuschließen.


Bernd_Stein

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd S. schrieb:
> Ich bin immer noch der Meinung, das man mit einem Byte bei geschickter
> Carryflag-Auswertung, drei Siebensegmentanzeigen, dahingehend nutzen
> kann, um zwei zweistellige positive gepackte BCD-Zahlen nach einer
> Addition bis zum Wert 198 richtig darauf anzuzeigen.

Was hat das Byte mit den Siebensegment-Anzeigen zu tun? Wenn Du nicht 
gerade BCD sondern integer (ohne Vorzeichen) rechnest kannst Du 
natürlich den Wert 198 in einem Byte ablegen und dann irgendwo und 
irgendwie anzeigen.
Das hat nichts mit dem Carryflag zu tun - welches nicht einem speziellen 
Byte zugeordnet ist sondern nur als Ergebnis eines Programmschrittes zu 
Beginn des Folgeschrittes sicher zur Verfügung steht.

Zum Sinn von BCD kann ich nur Wikipedia zitieren: "BCD-Arithmetik stammt 
aus Zeiten, in denen man den Aufwand der Wandlung zwischen interner 
Repräsentation und externer Darstellung gering halten wollte.".
Das halte ich auch für sinnvoll - wenn man Zahlen nur speichern und 
wieder ausgeben will, warum soll man sie dann jeweils aufwändig 
umrechnen (z.B. in/aus Fließkomma-Zahlen). SAP-ERP-Systeme arbeiten 
heute noch damit.

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Thema Halfcarry-Flag soll nun sein Ende finden.
Ich merke mir hierzu :

Das Halfcarry-Flag wird zum einen gesetzt, wenn die Addition der 
Low-Nibble Summanden ( Bit3..0 ) einen Übertrag in das High-Nibble 
erzeugt, also der Wert 15 der Summe überschritten wird.

Zum anderen, wenn der Low-Nibble-Wert des Subtrahenden größer ist,
als der Low-Nibble-Wert des Minuenden. Es also zu einem Borgen kommt.


Um diese knapp gehaltenen Terme im AVR-Instrution Set Manual zum 
H-Flag zu verstehen, habe ich mal alle Befehle herausgesucht, die das 
H-Flag beeinflussen. Damit dann alle vier Möglichkeiten mit den beiden 
Bits Rd3 und Rr3 bzw. K3 vorgenommen und nun erklären sich auch solche 
Sachen bei der Addition wie :

H =  Rd3&Rr3  +  Rr3&/R3  +  /R3&Rd3

oder bei der Subtraktion :

H = /Rd3&Rr3  +  Rr3&R3   +  R3&/Rd3

oder dem NEG-Befehl :

H = /Rd3      +  R3

      |      |      |      |SBCI  |      |
      |ADC   |SBC   |CPC   |SUBI  |$00-Rd|
      |ADD   |SUB   |CP    |CPI   |NEG   |
   Rd3| 1010 | 1010 | 1010 | 1010 | 1010 |
K3;Rr3| 1100 | 1100 | 1100 | 1100 | 1100 |
    R3| 0110 | 0110 | 0110 | 0110 | 0110 |
     H| 1000 | 0100 | 0100 | 0100 | 0111 |
        #       #      #      #      ###

Wenn man die Spalten nimmt, wo der Lattenzaun drunter ist und die Zeilen 
hierzu Senkrecht betrachtet, findet man die obigen Terme wieder,
an denen man sieht wann das H-Flag gesetzt wird.


Bernd_Stein

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd S. schrieb:
> habe ich mal alle Befehle herausgesucht

Das hättest Du auch einfach haben können:

http://www.avr-asm-tutorial.net/avr_de/beginner/co...


Aber schön, dass jetzt für Dich alles erklärbar ist - dann kannst Du den 
Thread ja schließen lassen.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




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.