-
-
Erfahrener Benutzer
Robotik Visionär
Für das lowbyte nimmt man SUBI, CPI oder ADD, also ohne berücksichtigung des Caarys, denn ist gibt ja keinen übertrag von noch weniger werigen bytes. Für die höherwertigen bytes braucht man den Übertrag und nimmt entsprechend SBCI,ADC, CPCi usw. um den Übertrag zu beachten.
Der brcc Befehl wertet das Carry flag aus. Nach der subtraction (oder CP..) ist das Carry flag gesetzt, wenn die Abgezogene Zahl (2 tes argument im SUBI/CP Befehl) größer was als die erste.
Etwas anders wird das noch, wenn man die Zahlen als Vorzeichenbehaftete Zahlen interpretiert (2 er Komplent), dann wird er brpl Befehr satt bcc genommen.
-
Erfahrener Benutzer
Roboter Experte
Das ist eine 16 Bit (2 x Rechnung. Vor der 1. Rechnung Meswert lo - Vergleichswert lo braucht man sich nichts zu "merken" (Carry). Ergibt sich aber aus dieser Rechnung ein "borrow", so muss dass in die 2. Rechnung, Messwert hi - Verleichswert hi, mit einbezogen werden. Diese 2. Rechnung setzt / cleared erneut das Carry Flag und kann zur Auswertung benutzt werden. In meinem Beispiel wird auch nicht INT_REG_L mit INT_REG_H verglichen sondern mit einem BATT_MIN Wert, wobei ich einen Fehler gemacht habe, dahinter ein _H bzw _L zu vergessen. (Das kommt davon, wenn man abschreibt).
-
Hmm also ist grad schwer zu verstehn wo der Unterschied ist ob beim Subtrahiere der zweite Wert größer oder ob das Ergebnis minus ist.
naja das kann ich notgedrungen noch so hin nehmen
borrow ist docjh der zustand von den Carry ? weil dann wird ja eben dieses Carry mit sbci in die zweite rechnung mit einbezogen
so mal wie ich das verstanden habe
subi register, wert ; register - wert wenn R<wert Carry="borrow"
sbci register, wert ; register - wert - Carry
Brcc jump ; springt wenn der Carry cleared ist
aber noch so am rande wieso macht der das in meine Bsp so kompliziert den Carry einzuspeichern mit ADD und adc ?
-
Erfahrener Benutzer
Robotik Visionär
Der code sieht ein bischen nach dem aus was ein Compiler so generiert. Der C Code könnte so was wie (ADCH <<+ADCL sein. Dann würde auch r1 wieder Sinn machen, denn r1 wird da oft als konstant 0 vorrausgesetzt. Wenn r1 undefiniert ist, macht der ganze Dode keinen Sinn.
-
Erfahrener Benutzer
Roboter Experte
Warum schreibst du nicht einfach einen 3-zeiler: Addiere / subtrahiere r16 / r17 und testest das im AVR Studio mit verschiedenen Werten, die man ja direkt in die Register schreiben kann (sogar in dezimal) und siehst dir dabei das Carry Flag an, ob eventuell ein Übertrag stattgefunden hat (carry set).
Ein paar simple Beispiele in dezimal: 7+2=9 (Carry clear (CC))
7+4=1 (Carry set (CS)) Übertrag hat stattgefunden; 9-5=4(CC) oder
9-12=3 (CS).
Wenn du, wie Besserwessi vermutet, einen Compiler verwendest, dann solltest du mal den original code hier reinstellen.
-
Ahh das mit den C hat mich auf eine Vermutung gebracht
das ist schion Assambler allerdings eine .s datei also die wird über ein C prog aufgerufen daher müsst r1 als o defeniert worden sein die register r24 und r25 also INT_REG_L und H werden vorher benutzt also stellt er damit nur sicher das das carry flag wieder auf null gestellt wird bevor er subtrahiert
also wäre das eine mögliche Erklärung ?
-
Erfahrener Benutzer
Robotik Visionär
das carry flag kann man direkt setzten oder löschen, wenn man es braucht. Für die subtraktion gibt es ja den extra Befehl für die Subtraction ohne beachten des Carry Flags.
Der Code ganz am Anfang ist einfach nur umständlich und unnötig lang.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen