AVR-Assembler, brvs Verständnissfrage

Gast #1096441
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
Gast #1096461
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...
#1096478
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
Gast #1096506
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren