18F4550-nepochopiteľné správanie-GOTO/BRA/CALL-2B inštrukcie

Po dlhsej odmlke vas zas zravim :slight_smile:
Rozbehavam 4550, ale vykazuje velmi divne spravanie.
Posudte sami:
PortB cely osadim LEDkami, portD cely osadim ledkami.
spustim program a udeje sa nasledovne: Bport zrotuje 0 - 5LED, spolu s tym sa zrotuje portD 0 - 7LED a zhasne. Potom si portB zrotuje este raz 0 - 5 a uz sa nic nezapali :slight_smile: Kde vidite mozny problem ?

[code]list P=18F4550
include <p18F4550.inc>

config WDT = OFF, MCLRE = OFF, FOSC = INTOSCIO_EC, LVP = OFF, FCMEN = OFF
config IESO = OFF, PWRT = ON, PBADEN = OFF, LPT1OSC = OFF , BOR = OFF

C1 EQU 21h
C2 EQU 22h
C3 EQU 23h
C4 EQU 24h

ORG 0
GOTO START

ORG 8
GOTO START

ORG 18
GOTO START

START
setf ADCON1

clrf TRISA
clrf TRISB
clrf TRISC
clrf TRISD
clrf TRISE

clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE

CLRF LATA
CLRF LATB
CLRF LATC
CLRF LATD
CLRF LATE

CLRF UCON

CLRF STATUS

CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE

BSF PORTB,0
BSF PORTD,0

PROGRAM

RLCF PORTB
RLCF PORTD
CALL CAKAJ

GOTO PROGRAM

CAKAJ
MOVLW .100
MOVWF C3
MOVLW .255
MOVWF C2
MOVWF C1
DECFSZ C1
GOTO $-1
DECFSZ C2
GOTO $-4
DECFSZ C3
GOTO $-7
RETURN

END[/code]

A tiez nechapem, preco mi mi goto $-2 skoci sam na seba, a $-4 len o riadok vyssie,…
DAKUJEM :slight_smile:

:arrow_right: administrator: přejmenováno z "18F4550 - nepochopitelne spravanie"

Zkus místo GOTO použít BRA.

BRA $-4 skace o riadok vyssie :frowning:
BRA .4 a BRA 4 hadze zas na ORG 8
BRA -4 a ani BRA .-4 neberie
Este nejaky zapis ? :smiley:

U řady 18 jen sudá čísla. Neplatí to u GOTO a CALL, to je $+2 a někdy $+4, u BRA je to po 2,ale MAX ± 1023. Je to v datasheetu. :smiley:

No ved 4 je sude / parne cislo, ale nerobi to co ma podla DS.

Nevím, zda je to i případ tohoto procesoru, ale instrukce bývají často dvoubajtové, proto $-2 skočí sám na sebe. Když se vykoná, jsi za goto, o instrukci výše(o 2B) je opět goto :wink:.

No, takze taketo vyjadrenia ze skoky o urcite cislo nebudem pouzivat, prerobil som to cez navestia, funguje. Problem s “GOTO” ale nevysvetluje to zvlastne spravanie pri rotovani portov. Uz sa kus znormalizovalo, uz rotuju furt dookola, akurat ze portD ide zo stavu 7 do stavu 0, zatial co portB sa cely zhasne a pri druhej rotacii to robia porty naopak, neviem si to velmi vysvetlit,…

Nepíšou se návěští s dvojtečkou? (“navesti:”)
Nerotuješ porty přes carry? Tady by měla být rotace jen v bytu.

ee v ASM sa urcite pisu bez “:”
Aha, myslis ze prvy port si to vezme do prveho bitu a druhy uz ma nulovy carry,… no je to mozne. Asi sa prestanem hrat z hovadinami a zacnem rozbehavat neco dolezitejsie na tom mcu.

V návěští nepoužívej “:”. V překladu jí assembler bere jako operátor. Je to popsáno v překladu assembleru, který jsem dělal.

Skús použiť RLNCF namiesto RLCF.

Tím po 2 jsem to myslel tak, že co je u 16F GOTO $-7, u 18 je BRA $-14, za předpokladu, že 7 kroků zpět nebude žádný CALL a GOTO, přip RETURN a RETLW.

[code]
PROGRAM

RLNCF PORTB
RLNCF PORTD
CALL CAKAJ

GOTO PROGRAM

CAKAJ
MOVLW .100
MOVWF C3
MOVLW .255
MOVWF C2
MOVWF C1
DECFSZ C1
BRA $-2
DECFSZ C2
BRA $-8
DECFSZ C3
BRA $-14
RETURN[/code]