You are here

PIC hardware stack underflow

18 posts / 0 new
Last post
Fricu
Fricu picture

Hali
Kezdő vagyok PIC assembly-ben.
Az alábbi pgm a cím szerinti hibát adja (szimulátorban), miután egyszer fel és le fut a fény.
LED-es futófény 4 digitre:

;-----------------------------------------------------------
LIST P=16F877A
#INCLUDE "P16F877A.INC" ;Hasznald az ebben levo szimbolumokat

; CONFIG
; __config 0x3F72
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF

;-----------------------------------------------------------

;----------------
A EQU 20 ;20-as terület lefoglalása A néven
ORG 0
GOTO BEALL
;----------------

BEALL

CLRF PORTB
BANKSEL TRISB
CLRF TRISB
BANKSEL PORTB
GOTO PROGRAM
;----------------

PROGRAM

MOVLW B'0001'
MOVWF PORTB
CALL IDO
MOVLW B'0010'
MOVWF PORTB
CALL IDO
MOVLW B'0100'
MOVWF PORTB
CALL IDO
MOVLW B'1000'
MOVWF PORTB
CALL IDO
MOVLW B'0100'
MOVWF PORTB
CALL IDO
MOVLW B'0010'
MOVWF PORTB
CALL IDO
MOVLW B'0001'
MOVWF PORTB
CALL IDO
;----------------

IDO

MOVLW D'255'
MOVWF A
X DECFSZ A,F
GOTO X
RETURN
;----------------
END ;Forrasprogram vege

Rossz a ciklus-szervezés?
Tapasztalt(abb) kollégáktól várnék ötleteket.
Üdv

Comments
sim01zoli
sim01zoli picture

Szia!
Én több helyen is találtam hibákat.
A csatolmányt nevezd át, egyszerűen hagyd el a .txt kiterjesztést és látni fogod a forráskódot (877.asm)
Volt egy kis időm meg kedvem, kicsit belejavítottam, írtam kommenteket mivel azt írtad, hogy kezdő vagy.
Ha valamit nem értesz akkor kérdezz bátran.
Üdv: Zoli

File csatolás: 

0

Fricu
Fricu picture

Hát bonyolult művelet a CTRLC-V
És figyelni kell, mit, hova..
A program sorok közül kimaradt egy értékadás a w-nek, rögtön a portB-re írásra lépett.
Javítva, most már szépen lépeget oda vissza.
Marad még az EQU utasítás tisztázása.
Köszi az eddigieket mindenkinek.
Üdv

0

Fricu
Fricu picture

Kipróbáltam a módosított pgm-ot (először a tiéd, aztán az enyémet is a módosított EQU-st is).
Minden jó volt.
De ha lúd..
módosítottam, hogy ne négy, hanem mind a nyolc LED-et meghajtsa.
Az eredmény meglepett:
Szépen lépeget, de 6. led után nem csak a 7. világít, hanem mind a 8!
A következő lépés csak a 7, majd a 8. és vissza hiba nélkül. Az elsőn két ciklust tölt el (ahogy írtad is).
Még nem jöttem rá miért.
Mellékelem.
Más
néztem a kommentjeid.
A config beállítást javítottad (le is fut) az oszcillátor bit körül.
A 877A-ban a "0"-s és az "1"-es config bit szabja meg az oszcillátor üzemmódját:
CONFIGURATION WORD
CP — DEBUG WRT1 WRT0 CPD LVP BOREN — — PWRTEN WDTEN FOSC1 FOSC0

10:HS

Ezt a konfigurációs beállítást egyébként az MPLAB-X csinálta - én csak átkopiztam.
Érdekesebb, hogy a _HS_OSC-t is megette az assembler.

File csatolás: 

0

Oszi11
Oszi11 picture

Szia!

"Szépen lépeget, de 6. led után nem csak a 7. világít, hanem mind a 8!
A következő lépés csak a 7, majd a 8. és vissza hiba nélkül. Az elsőn két ciklust tölt el (ahogy írtad is).
Még nem jöttem rá miért."

Egyszerű a 6. bit után azt csináltad, hogy meghívtad az késleltető szubrutint ami 255 ír a W regiszterbe majd ezt kiírod a portra (ezért világít minden led) és meghívod a késleltetést újra és a W-be b'01000000"-t és innen már jó a futófény.

Üdv,
Oszi

0

Fricu
Fricu picture

Igen, látom, köszi.

Az equ-s problémára nincs ötleted?
(miért jó az A1-B1 és nem jó A - B páros?
üdv

0

Oszi11
Oszi11 picture

Szia!

Itt igazából a B-vel van baj! A B ugyanis az Assemblerben egy parancs (és a bináris szám jele is), a B cím az ugyanaz mint a goto cím! Az equ előtti címke pedig nem egyezhet meg semmilyen paranccsal vagy operátorral és nem kezdőthet dupla aláhúzással (__)!
Én azt ajánlom használj olyan nevet ami utal arra amire használod, mert egy hosszabb programnál ez sokat segít (A_szamlalo, B_szamlalo)
Van még pár makró, ami be van építve a fordítóba és nem használható címkének!

Üdv,
Oszi

File csatolás: 

0

sim01zoli
sim01zoli picture

Szia Oszi11!
Pár év kimaradt nekem a pic-es témában. Kérdeznék, mert nem értek valamit a konfigurációs biztosítékok beállításánál. Az MPASM nem fogad el pár dolgot amit Fricu írt és félkövéren kiemelek a sorból:
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
Hogy lehet, hogy a Fricunak meg igen? Van valami újabb fordító amit nem ismerek? Nekem csak így hajlandó hexát csinálni:
__CONFIG _HS_OSC&_WDT_OFF&_PWRTE_ON&_LVP_OFF&_CPD_OFF&_WRT_OFF&_CP_OFF
Üdv: Zoli

0

Oszi11
Oszi11 picture

Szia!

A programod elején kell, hogy legyen egy #INCLUDE "P16F877A.INC", ahol megadod azt az inc fájlt ami tartalmazza az adott pic registereinek és bitjeinek az elnevezését. Ezek az elnevezések ugyanazok mint amik az adatlapon szerepelnek. Két különboző típusú pic nem szükségszerűen ugyanazt az elnevezést használja ugyanarra a bitre, így neked a általad választott típusnak megfelelő elnevezést kell használni. Ezek az .inc fájlok, a fordító könyvtárában vannak (C:\Program Files\Microchip\MPASM Suite):

A konfiguráció is állhat több bájtból és akkor így kell kinéznie a konfigurációnak:

__config _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_NSLEEP & _CPD_OFF
__config _CONFIG2, _WRT_HALF & _BOR21V

Üdv,
Oszi

0

sim01zoli
sim01zoli picture

Szia Oszi11!
Az rendben van, amit írtál és értem is. De itt a 877A-chipről van szó és a P16F877A.INC-ben csak az alábbiak vannak:
;==========================================================================
;
; Configuration Bits
;
;==========================================================================

_CP_ALL EQU H'1FFF'
_CP_OFF EQU H'3FFF'
_DEBUG_OFF EQU H'3FFF'
_DEBUG_ON EQU H'37FF'
_WRT_OFF EQU H'3FFF' ; No prog memmory write protection
_WRT_256 EQU H'3DFF' ; First 256 prog memmory write protected
_WRT_1FOURTH EQU H'3BFF' ; First quarter prog memmory write protected
_WRT_HALF EQU H'39FF' ; First half memmory write protected
_CPD_OFF EQU H'3FFF'
_CPD_ON EQU H'3EFF'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_RC_OSC EQU H'3FFF'
_HS_OSC EQU H'3FFE'
_XT_OSC EQU H'3FFD'
_LP_OSC EQU H'3FFC'

Pl.: a _BOREN_ON sem szerepel, _FOSC_HS sem igy van eredetileg (ilyet most láttam először), _WDTE_OFF sem így van az "E" nem kell. Ezért nem értem, hogy hogyan sikerülhetett hexára fordítani :?
Nagyon sok forrásprogramot láttam amit a Microchip fejlesztői írtak, de kivétel nélkül mind a megfelelő *.inc -ben szereplő jelöléseket használják.
Üdv: Zoli

0

Oszi11
Oszi11 picture

Szia!

Megnéztem a én is az include fájlt és nem olyan mint a tied! Én az MPLAB IDE v8.88-at használom, de van frissebb is v8.92

http://www.microchip.com/pagehandler/en-us/devtools/dev-tools-parts.html

Csatoltam az include fájlt is, ezzel gond nélkül lefordul!

Üdv,
Oszi

File csatolás: 

0

sim01zoli
sim01zoli picture

Szia!
Tökéletes válasz, mindent értek...
Köszi, ezentúl én is az újabb verziókat használom.
Üdv!

0

Fricu
Fricu picture

Én a MPLAB X IDE v2.05-t használom.
Abban van egy ablak alul, ahol maga generálja a config dolgokat.
Beállítod, hogy mit akarsz az egyes biteken (pl. bekapcsolni a védelmet vagy nem) és létre is hozza a config sort vagy sorokat, amit csak át kell kopizni az asm-be.
üdv

0

Fricu
Fricu picture

Köszi
átnézem, hogy tudjak kérdezni.
Azt már látom, hogy te az elején másként oldod meg az A1-A2 területének kijelölést (CBLOK ut.), és egymásba ágyazod a lassító ciklusokat.
Most én is ezzel próbálkozom, miután az első hiba - hiányzó GOTO Program utasítás miatti stack hibát megszüntettem az előző hozzászóló javaslatára.
Én is egymásba ágyaznék két ciklust, de már az elején elakad az assembler, nem tud mit kezdeni a kijelölésemmel.
Tudom, hogy ez más, de szeretném ezt az utat is végig járni, hogy értsem a lelkivilágát.
Tehát a működő (csak rövid a késleltetés):

;----------------
A EQU H'20' ;az adatmemória 20h-as területére -regiszterére - ezen túl az "A" néven hivatkozhatunk
ORG 0
GOTO BEALL
;----------------

és az átírt és ettől halott változat:

;----------------
A EQU H'20'
B EQU H'21' ;21h-es terület lefoglalása B néven
ORG 0
GOTO BEALL
;----------------

A "B" sornál elakad:
Warning[204] ..\LED.ASM 16 : Found pseudo-op in column 1. (B)
Error[113] ..\LED.ASM 16 : Symbol not previously defined (EQU)
Error[112] ..\LED.ASM 16 : Missing operator
Error[152] ..\LED.ASM 16 : Executable code and data must be defined in an appropriate section

Vagyis nem foglalja le a "B"-nek a 21h regisztert, ezért aztán később nincs definiálva hiba jön.
A 20h az első adatregiszter a Bank0-ban GPR célra (a 877-ben), a 21h-t használnám a második ciklushoz később.
Nem olvastam viszont korlátozást az EQU értékadással kapcsolatban, ami magyarázná a dolgot.
Tudja valaki a magyarázatot?
üdv

0

sim01zoli
sim01zoli picture

Szia!
Írd az alábbiak szerint, két karaktert minimum, és csak szám ne legyen.(00) (01)stb...

A1 EQU H'20'
B1 EQU H'21'

ORG 0
stb... :)

0

Fricu
Fricu picture

Hali

kipróbálom, de akkor az eredetit:
A EQU H'20'
miért fogadja el?
Az EQU szintaxisában nem olvastam erre utalást.
köszi

0

bbgames
bbgames picture

Szervusz,

a hiba ott van, hogy a főprogram utolsó call-ja után magára a szubrutinra fut a program, ami egy ret-el ér véget, csakhogy innen nincs hova visszalépni, mert már legfelül vagyunk. Tégy ide egy goto-t (goto PROGAM), ami a végtelen ciklus elejére mutat.

(A címkék után én kettőspontot szoktam tenni, ez csak tanács)

üdv
bbgames

0

Fricu
Fricu picture

Szia
AHA, már értem.
a sok return cím visszahívás a gond.
így már jó, köszi.
Most még az időzítőt kell megváltoztatnom, mert túl gyors.
Gyakorlatilag félfénnyel ég minden led (a szimulátorral nézve ok).
Egymásba ágyazott ciklusokat használnék, de még nem fordul le a hibák miatt.
Dolgozom rajta..
Köszönöm még egyszer
Fricu

0

Sponsored links