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


von Jürgen (Gast)


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.


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

von Jürgen (Gast)


Lesenswert?

Hier noch so ein tolles Beispiel aus dem Roboter.net
1
Beispiel:
2
3
    bset 3        ;Setzt das V-Flag
4
    brvs eins    ;Verzweigen zum Label eins, wenn das V-Flag gesetzt ist.
5
    ...
6
7
eins: nop        ;Verzweigungsziel, Leerbefehl ausführen...

von Sinusgeek (Gast)


Lesenswert?

Ich glaube, besser als hier:

Beitrag "Overflow Bit bei Addition"

kann man es nicht erklären...

~

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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

von Michael U. (amiga)


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

von Jürgen (Gast)


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:
1
;----------------------------------------------------------------
2
;Das Temperaturregister LM75. Die 9 Bits liegen linksbündig in einem 16-Bit Register.
3
;Vorzeichen (DB8) beachten! DB0 = 1/2 Grad (.0 oder .5)
4
;-----------------------------------------------------------------
5
; <---------   High   ---------->|<------------ Low ------------>
6
;|DB8|DB7|DB6|DB5|DB4|DB3|DB2|DB1|DB0| X | X | X | X | X | X | X |
7
; <---------  temp1  ----------->|<------------ temp ----------->
8
;-----------------------------------------------------------------
9
10
    pop    temp1      ;High-Byte nach temp1, Low-Byte ist in temp
11
lm3:  lsl    temp      ;Kommastelle (DB0) ins Carry
12
    rol    temp1      ;Vorzeichen (DB8) ins Carry, Kommastelle -> Temp1
13
    clr    temp      ;Die X im Lowbyte löschen
14
    rol    temp      ;DB8 -> Temp
15
                ;Meine beiden LM75 zeigen 1,5 Grad zuviel an, das korrigiere ich hier.
16
    subi  temp1,3      ;Korrekturwert*2 abziehen
17
    sbci  temp,0      ;Carry von DB8 (Vorzeichen) abziehen
18
19
;    subi  temp1,-3    ;falls addiert werden muss ..    
20
;    sbci  temp,-1      ;..die -1 stehen lassen (invertiertes Carry)
21
22
    sbrs  temp,0      
23
    rjmp  plus      ;Sprung bei +0...+125 Grad
24
;----------------------------------------------------------------
25
;Wenn Wert negativ
26
27
    neg    temp1      ;2er Komplement bilden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.