kodas neveikia, nes naują kintamąjį

H

hkBattousai

Guest
Aš mėginu sukurti paprasta programa, kuri bus mirksi LED.

Kodą, kuris veikia be jokių problemų yra:
(LED prijungti uoste D1 mirksi)
Kodas:

org 0; Pradėti kodas 0Delay1 res 1; rezervų 1 baitas į kintamąjį Delay1

Delay2 res 1; rezervų 1 baitas į kintamąjį Delay2Pradžia:

CLRF PORTD

CLRF TRISD

CLRF Delay1

CLRF Delay2MainLoop:

BTG PORTD, RD1; Toggle PORT D PIN-1 (20)

Delay:

DECFSZ Delay1, 1; mažinti Delay1 1, praleisti šalia instrukcija jei Delay1 yra 0

GOTO Delay

DECFSZ Delay2, 1

GOTO Delay

GOTO MainLoop

pabaiga
 
Naudokite MPLAB imitatorius, padės breakpoints ir tiksliai, kas atsitiks.Tai daug paprasčiau, nei laukti, kol kas nors analizuoti kodas ...

 
Ar laukėte visą t * 256 kartą pamatyti, jei ji mirksi ...?

 
XNOX_Rambo rašė:

Ar laukėte visą t * 256 kartą pamatyti, jei ji mirksi ...?
 
Ar Watchdog veikia?
Tai gali būti naujo PIC prieš jį gauna galimybę flash - kurį nebūtų pranešimas su praėjusiais greitai mirksi.

 
XNOX_Rambo rašė:

Ar Watchdog veikia?

Tai gali būti naujo PIC prieš jį gauna galimybę flash - kurį nebūtų pranešimas su praėjusiais greitai mirksi.
 
I'm not that susipažinę su PICs bet specifikacija sako:
Citata:

PIC18F2455/2550/4455/4550

prietaisai turi Watchdog Laikmatis, kuri yra arba

nuolat įjungtas per konfigūracijos bitų ar

programinė įranga, kontroliuojama (jeigu suderintas su negalia).
 
XNOX_Rambo rašė:

Manau tu ją išjungti su "config WDT = OFF", bet gal aparatūros konfigūracija peržiūrėjimus, kad?

Galite pabandyti išjungti konfigūracijos bitų ir žiūrėsime kas atsitiks.
 
Kuris Kompiliavimo naudojate?

Radau tai dokumentaciją MPLAB C Compiler už PIC18 MCUs:
Citata:

2.9.5.2 PAVYZDYS

Toliau pateiktame pavyzdyje parodyta, kaip # pragma config direktyvos galėtų būti naudojami.

Pavyzdžiui, veikia taip:

Leidžia Watchdog Laikmatis,

Nustato Watchdog Postscaler iki 1:128, ir

Selects SS generatorius# pragma config WDT = ON WDTPS = 128

# pragma config OSC = SS

...

void main (void)

(

...

)
 
XNOX_Rambo rašė:

Galbūt Jums reikia įterpti # pragma kiekviename config eilutė?
 
Ahh, aš matau.

Atsiprašome,
bet tada aš ne clue, kodėl ji neveikia ...

 
Jei statyti programą ir pažvelgti į išmontavimo sąrašą rasite:

0007 6A00 CLRF 0, GALIMYBĖ 54: CLRF Delay1
0009 6A01 CLRF 0x1, GALIMYBĖ 55: CLRF Delay2
000B 6A02 CLRF 0x2, GALIMYBĖ 56: CLRF Delay3

Kodėl kintama įsikūręs adresu 0 eilutėse 54

Jūs apibrėžtų kintamųjų tik po Org pareiškimą,
tai kodėl.

naudoti šį kodą po config pareiškimai:

cblock 0x20
Delay1; Susieti adresą į etiketę Delay1
Delay2
Delay3
endc

Org 0

Tai apibrėžia kintamuosius adresu 20

Dissasembly tada parodo:

0004 6A20 CLRF 0x20, GALIMYBĖ 55: CLRF Delay1
0006 6A21 CLRF 0x21, GALIMYBĖ 56: CLRF Delay2
0008 6A22 CLRF 0x22, GALIMYBĖ 57: CLRF Delay3

Programa tada eina su 10 sekundžių nedelsiant.

George

 
Dėkojame geore2000, savo idėją išspręsti mano problemą.Bet vis tiek aš nesuprantu, kaip ji dirba su dviem kintamaisiais rodikliais apibrėžtas, bet ne su trimis iš jų.Ar kas nors paaiškinti, kad tai man?

Bet kokiu atveju, žemiau yra galutinis ir darbo forma mano kodas:

Kodas:

Org 0x40; Apibrėžti kintamieji adresu 0x40Delay1 res 1

Delay2 res 1

Delay3 res 1org 0; Vieta programos kodą pradžioje atmintiesPradžia:

CLRF PORTD

CLRF TRISD

CLRF Delay1

CLRF Delay2

; CLRF Delay3

; CLRF Delay4MOVLW 020

MOVWF Delay3, 0

MainLoop:

BTG PORTD, RD1; Toggle PORT D PIN-1 (20)

Delay:

DECFSZ Delay1, 1; mažinti Delay1 1, praleisti šalia instrukcija jei Delay1 yra 0

GOTO Delay

DECFSZ Delay2, 1

GOTO Delay

DECFSZ Delay3, 1

GOTO Delay

MOVLW 020

MOVWF Delay3, 0

; DECFSZ Delay4, 1

; GOTO Delay

GOTO MainLoop

pabaiga
 
1.Į MPLAB sukurs "Absoliutus kodas", jei tik 1 asm be LKR (negalima naudoti Objektas Failo direktyvų)
2.Į "res" naudojamas atsargų duomenų saugojimo ar programos atminties (Ne relocatable kodas, ji bus laikoma programos atminties)

Jūsų kodą, pirmoji 2 "res" sukurs 1 instrukcijos 0xFFFF (NOP).Iš tiesų, "Start" yra 2,
o ne 0.Būtent todėl jis bus darbo.
The 3th "res" bus encourter neteisinga instrukcija decode į vykdymo metu (Pradìti 3), tačiau turėtų gauti įspėjimą ne žodis suderinta adresą.

Todėl jūs galite naudoti "cblock" kaip george2000 pareigos deklaruoti duomenų saugojimo kaip:Kodas:

org 0; Pradėti kodas 0cblock 0x0

Delay1: 1, Delay2: 1, Delay3: 1

endcPradžia:
 
Kintamųjų pradžioje o kodas erdvėje pradėti Hex FS

FF FF yra nop taigi instrukcija yra sustiprinta daugiau

3 kintamieji Jums kodas
FF FF pirmojo instrukcija, bet
FS 83 antrojo nurodymas, kad programa bando atlikti FS 83, kurios yra BSF instrukcija

Programa turėtų dirbti 4 kintamuosius, nes ji tampa 2 nop instrukcijas.

Tai problema su kintamųjų kodas erdvė luste mano savo kodą.

George

 
yager rašė:

Jūsų kodą, pirmoji 2 "res" sukurs 1 instrukcijos 0xFFFF (NOP).
Iš tiesų, "Start" yra 2, o ne 0.
Būtent todėl jis bus darbo.

The 3th "res" bus encourter neteisinga instrukcija decode į vykdymo metu (Pradìti 3), tačiau turėtų gauti įspėjimą ne žodis suderinta adresą.
 
hkBattousai rašė:

Net keletas kintamųjų deklaracijų pradžioje kodas nebus problema šiuo atveju.
Bet tai nėra tinkamas būdas pateikti deklaracijas, nes kompiliatorių būtų savavališkai pradinių reikšmių į kintamuosius vietoj 0x00, kodėl ne.
 

Welcome to EDABoard.com

Sponsor

Back
Top