www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler, brvs Verständnissfrage


Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich benutze 2 LM75 in einer Schaltung die leider beim Eiswürfeltest 1,5 
Grad anzeigen. Dies möchte ich in meiner Software kompensieren indem ich 
die 1,5 Grad abziehe.
Die vom LM75 kommende Zahl ist im Zweierkomplement und 9 Bit breit.

Wenn der LM nun 1 Grad anzeigt und ich ziehe 1.5 davon ab komme ich von 
positiv nach negativ. Habe also einen Overflow (dachte ich jedenfalls).
Aber das V-Bit rührt sich nicht.

Mein Code läuft mittlerweile, habe das anders gelöst.
Trotzdem möchte ich gern wissen wie bvrs und brvc funktionieren. Die ASM 
Hilfe im Studio und das PDF von Atmel helfen net wirklich.


BRVS – Branch if Overflow Set
Description:
Conditional relative branch. Tests the Overflow Flag (V) and branches relatively to PC if V is set. This instruction branches
relatively to PC in either direction (PC - 63 ≤ destination ≤ PC + 64). The parameter k is the offset from PC and is represented
in two’s complement form. (Equivalent to instruction BRBS 3,k).
Operation:
(i) If V = 1 then PC ← PC + k + 1, else PC ← PC + 1
Syntax: Operands: Program Counter:
(i) BRVS k -64 ≤ k ≤ +63 PC ← PC + k + 1
PC ← PC + 1, if condition is false
16-bit Opcode:
Status Register (SREG) and Boolean Formula:
Example:
add r3,r4 ; Add r4 to r3
brvs overfl ; Branch if overflow
...
overfl: nop ; Branch destination (do nothing)
Words: 1 (2 bytes)
Cycles: 1 if condition is false
2 if condition is tr

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch so ein tolles Beispiel aus dem Roboter.net
Beispiel:

    bset 3        ;Setzt das V-Flag
    brvs eins    ;Verzweigen zum Label eins, wenn das V-Flag gesetzt ist.
    ...

eins: nop        ;Verzweigungsziel, Leerbefehl ausführen...

Autor: Sinusgeek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, besser als hier:

Beitrag "Overflow Bit bei Addition"

kann man es nicht erklären...

~

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest das Carry-Bit kontollieren: BRCS (branch if carry set) oder 
BRCC (branch if carry clear)

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn Du den Wert als Zweierkomplement betrachtest, ist der Wertebereich 
+127...-128.
Wenn Du von 1 also 1.5 (wie zeihst Du 1.5 ab, es gibt keine halben 
Bits???)
bist Du bei -0.5 (oder bei 0 oder bei -1).
Das ist alles im Wertebereich, also gibt es auch keinen Overflow.
Es wird höchstens C gesetzt, weil der Bereich 0...255 verlassen wurde,
das wäre aber dann kein Zweierkomplement.
Dort tritt der Overflow erst auf, wenn -128 oder +127 durch die 
Rechenoperation verlassen werden.

Gruß aus Berlin
Michael

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke @all, ich glaube ich habe es verstanden.

Wenn bei Addition oder Subtraktion Bit6 nach Bit7 wandert wird das 
V-Flag gesetzt.

>Wenn Du von 1 also 1.5 (wie zeihst Du 1.5 ab, es gibt keine halben
>Bits???)

Manchmal eben doch, wie gesagt mein Code Funktioniert:
;----------------------------------------------------------------
;Das Temperaturregister LM75. Die 9 Bits liegen linksbündig in einem 16-Bit Register.
;Vorzeichen (DB8) beachten! DB0 = 1/2 Grad (.0 oder .5)
;-----------------------------------------------------------------
; <---------   High   ---------->|<------------ Low ------------>
;|DB8|DB7|DB6|DB5|DB4|DB3|DB2|DB1|DB0| X | X | X | X | X | X | X |
; <---------  temp1  ----------->|<------------ temp ----------->
;-----------------------------------------------------------------

    pop    temp1      ;High-Byte nach temp1, Low-Byte ist in temp
lm3:  lsl    temp      ;Kommastelle (DB0) ins Carry
    rol    temp1      ;Vorzeichen (DB8) ins Carry, Kommastelle -> Temp1
    clr    temp      ;Die X im Lowbyte löschen
    rol    temp      ;DB8 -> Temp
                ;Meine beiden LM75 zeigen 1,5 Grad zuviel an, das korrigiere ich hier.
    subi  temp1,3      ;Korrekturwert*2 abziehen
    sbci  temp,0      ;Carry von DB8 (Vorzeichen) abziehen

;    subi  temp1,-3    ;falls addiert werden muss ..    
;    sbci  temp,-1      ;..die -1 stehen lassen (invertiertes Carry)

    sbrs  temp,0      
    rjmp  plus      ;Sprung bei +0...+125 Grad
;----------------------------------------------------------------
;Wenn Wert negativ

    neg    temp1      ;2er Komplement bilden

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.