stowoda
10.10.2005, 10:16
Moin
Wenn ich den folgenden Code mit MPLAB simuliere wiederfährt etwas was ich nicht nachvollziehen kann.
Es geht um diese Zeilen:
incf y, f
movlw .1
movwf temp
rrf temp
rlf data_2
Normalerweise sollte nach dem incf Befehl das Z flag gesetzt sein wenn in y ein Überlauf stattfindet. So weit so gut..
Nach den nächsten zwei Zeilen wird das Z flag allerdings wieder gelöscht.
Also quasi nach dem movwf Befehl.
Ich habe gelesen dass, movf das Z flag beeinflusst, movwf jedoch nicht.
Was habe ich da übersehen?
Die Passage um die es sich handelt findet Ihr am Ende das Codes unter dem label "one"
list p=16F84A
#include <p16F84A.inc>
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
y Equ 0x30
data_1 Equ 0x31
data_2 Equ 0x32
temp Equ 0x33
;************************************************* ***************
;* Programmstart *
;************************************************* ***************
org 0x0000
clrf PCLATH
clrf STATUS
clrf INTCON
goto INIT
org 0x0004
goto INT_ROUT
org 0x0020
;************************************************* **************
;* Initialisierung *
;************************************************* **************
INIT ; Initialization
bsf STATUS, RP0
movlw B'00000000' ; PORTA output
movwf TRISA
movlw B'00000001' ; PORTB output except RB0
movwf TRISB
bcf STATUS, RP0
CONFIG_OPTION_REG
bsf STATUS, RP0
movlw B'10000001' ; Pull-up´s off : INT on falling edge :
movwf OPTION_REG ; TMR0 counts internal clock : prescaler 1:4 TMR0
bcf STATUS, RP0
bcf STATUS, Z
CONFIG_INTCON
movlw B'00100000' ; INT on : T0IE on : INTE :off
movwf INTCON ; RBIE off : T0IF, INTF, RBIF cleared
;************************************************* ***************
;* Identyfikacja naglowka! *
;************************************************* ***************
detect
btfsc PORTB, 0 ; Warte auf low
goto detect
call stoper_4t ; 2400ms (naglowek)
btfss PORTB, 0
goto detect ; Fehler, wenn nach 2,4ms immer noch low
detect_bit
btfsc PORTB, 0
goto detect_bit
call vor_bitempfang
stoper_4t
bsf STATUS, RP0
movlw B'10000011'
movwf OPTION_REG ; prescaler TMR0 -> 1:16
bcf STATUS, RP0
movlw .106 ; TMR0 laden für 2,4ms
movwf TMR0
btfsc INTCON, T0IF
count_1
btfss INTCON, T0IF
goto count_1
return
vor_bitempfang
movlw .248 ; Variable wird geladen um abzählen
movwf y ; zu können ob data_1 voll ist
bitempfang
xt
bsf STATUS, RP0
movlw B'10000001' ; prescaler TMR0 -> 1:4
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .109
movwf TMR0
count_2
btfss INTCON, T0IF
goto count_2
btfsc PORTB, 0
goto zero ; sende null
bsf STATUS, RP0
movlw B'10000001' ; prescaler TMR0 -> 1:4
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .109
movwf TMR0
count_3
btfss INTCON, T0IF
goto count_3
goto one
;************************************************* *************
;* eine 0 wurde empfangen, wird nun gespeichert *
;************************************************* *************
zero
btfss STATUS, Z
goto teil_1z
teil_2z
movlw .0
movwf temp
rrf temp
rlf data_2
bsf STATUS, Z
goto bitempfang
teil_1z
incf y, f
movlw .0
movwf temp
rrf temp
rlf data_1
btfsc STATUS, Z
bsf STATUS, Z
goto bitempfang
;************************************************* *************
;* eine 1 wurde empfangen, wird nun gespeichert *
;************************************************* *************
one
btfsc STATUS, Z
goto teil_1o
teil_2o
incf y, f
movlw .1
movwf temp
rrf temp
rlf data_2
goto bitempfang
teil_1o
movlw .1
movwf temp
rrf temp
rlf data_1
bcf STATUS, Z
goto bitempfang
INT_ROUT
end
Gruß
lk
Wenn ich den folgenden Code mit MPLAB simuliere wiederfährt etwas was ich nicht nachvollziehen kann.
Es geht um diese Zeilen:
incf y, f
movlw .1
movwf temp
rrf temp
rlf data_2
Normalerweise sollte nach dem incf Befehl das Z flag gesetzt sein wenn in y ein Überlauf stattfindet. So weit so gut..
Nach den nächsten zwei Zeilen wird das Z flag allerdings wieder gelöscht.
Also quasi nach dem movwf Befehl.
Ich habe gelesen dass, movf das Z flag beeinflusst, movwf jedoch nicht.
Was habe ich da übersehen?
Die Passage um die es sich handelt findet Ihr am Ende das Codes unter dem label "one"
list p=16F84A
#include <p16F84A.inc>
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
y Equ 0x30
data_1 Equ 0x31
data_2 Equ 0x32
temp Equ 0x33
;************************************************* ***************
;* Programmstart *
;************************************************* ***************
org 0x0000
clrf PCLATH
clrf STATUS
clrf INTCON
goto INIT
org 0x0004
goto INT_ROUT
org 0x0020
;************************************************* **************
;* Initialisierung *
;************************************************* **************
INIT ; Initialization
bsf STATUS, RP0
movlw B'00000000' ; PORTA output
movwf TRISA
movlw B'00000001' ; PORTB output except RB0
movwf TRISB
bcf STATUS, RP0
CONFIG_OPTION_REG
bsf STATUS, RP0
movlw B'10000001' ; Pull-up´s off : INT on falling edge :
movwf OPTION_REG ; TMR0 counts internal clock : prescaler 1:4 TMR0
bcf STATUS, RP0
bcf STATUS, Z
CONFIG_INTCON
movlw B'00100000' ; INT on : T0IE on : INTE :off
movwf INTCON ; RBIE off : T0IF, INTF, RBIF cleared
;************************************************* ***************
;* Identyfikacja naglowka! *
;************************************************* ***************
detect
btfsc PORTB, 0 ; Warte auf low
goto detect
call stoper_4t ; 2400ms (naglowek)
btfss PORTB, 0
goto detect ; Fehler, wenn nach 2,4ms immer noch low
detect_bit
btfsc PORTB, 0
goto detect_bit
call vor_bitempfang
stoper_4t
bsf STATUS, RP0
movlw B'10000011'
movwf OPTION_REG ; prescaler TMR0 -> 1:16
bcf STATUS, RP0
movlw .106 ; TMR0 laden für 2,4ms
movwf TMR0
btfsc INTCON, T0IF
count_1
btfss INTCON, T0IF
goto count_1
return
vor_bitempfang
movlw .248 ; Variable wird geladen um abzählen
movwf y ; zu können ob data_1 voll ist
bitempfang
xt
bsf STATUS, RP0
movlw B'10000001' ; prescaler TMR0 -> 1:4
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .109
movwf TMR0
count_2
btfss INTCON, T0IF
goto count_2
btfsc PORTB, 0
goto zero ; sende null
bsf STATUS, RP0
movlw B'10000001' ; prescaler TMR0 -> 1:4
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .109
movwf TMR0
count_3
btfss INTCON, T0IF
goto count_3
goto one
;************************************************* *************
;* eine 0 wurde empfangen, wird nun gespeichert *
;************************************************* *************
zero
btfss STATUS, Z
goto teil_1z
teil_2z
movlw .0
movwf temp
rrf temp
rlf data_2
bsf STATUS, Z
goto bitempfang
teil_1z
incf y, f
movlw .0
movwf temp
rrf temp
rlf data_1
btfsc STATUS, Z
bsf STATUS, Z
goto bitempfang
;************************************************* *************
;* eine 1 wurde empfangen, wird nun gespeichert *
;************************************************* *************
one
btfsc STATUS, Z
goto teil_1o
teil_2o
incf y, f
movlw .1
movwf temp
rrf temp
rlf data_2
goto bitempfang
teil_1o
movlw .1
movwf temp
rrf temp
rlf data_1
bcf STATUS, Z
goto bitempfang
INT_ROUT
end
Gruß
lk