Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: „Egy szubrutinban lehet több RETURN utasírás?” Illetlenség, de lehet. Egy eljárásnak elvileg csak egy kimeneti pontjának illik lenni, egyebünnen GOTO-val vagy branch utasítással szokás a visszatérési ponthoz ugrani. Ez különösen akkor fontos, ha paraméterátadás, vagy elmentett adatok, ill. veremkeret helyreállítása bonyolítja a visszatérést. Idézet: „az egyszerű címke, amire GOTO utasítással tudok ugorni miben különbözik formailag a szubrutintól?” Egy kis szőrszálhasogatás: Nem a címke különbözik, hanem a meghívás módja. A CALL/RCALL utasítás elmenti a visszatérési címet, amit a RETURN utasítás állít vissza.
Köszönöm Hujikolp!
A következő kérdésem: A STARTUS regiszter Z bitjéről azt olvastam, hogy idézem: Idézet: „zérusjelző- bit "0" - ha a művelet eredménye nem nulla; "1" - ha az eredmény nulla” Ezek szerint ha ezt az utasítássort írom:
Akkor ugye az "akarmi" soromat átugorja? És még egy: Nem lehet az assembly nyelvben olyat mint a POV-Ray-ben, hogy /*-al kezdek egy sort, majd az után az összes sort megjegyzésként értelmezi mindaddig, míg */-t nem talál? Muszáj minden egyes sor elé nekem pontosvesszőt írnom? Na és egy harmadik: Az MPLAB-ban nem lehet egy adott programrészletet kijelölni, majd abban "keresés és csere"-t végrehajtani?
Szia!
Nem mindegyik utasítás állítja a STATUS regiszter flag-jeit. A movwf, swapf, stb. nem állít egyetlen flag-et sem. Hogy beállítsd a Z bitet, a btfsc STATUS,Z elé tegyél be egy movf SZAM1,f utasítást. Az adatlapban az "Instruction set summary" pontosan leírja, hogy melyik utasítás melyik status flag-et kezeli... Szia Idézet: „Hát most így jött ki.” Csak azért, mert erre többen ugrottunk! Van aki elfelejti a nyákról is... Persze, lehet több return is, de arra ügyelni kell, hogy csak az egyikről térj vissza egy rutinból(a hívás utáni sorra). Ezt úgy értsd, hogy egy call, egy return. Lehet ugrálni goto-val egyik rutinból a másikba(nem túl szép és nem ajánlott) de akkor is egy hívás egy visszatérés. Ellenkező esetben a veremben tárolt visszatérési cím elcsúszik, vagy túlcsordul a verem, ami sok bajt okoz. A GOTO abban különbözik, hogy ott nem kerül letárolásra a visszatérési cím a verembe. Lehet ugrálni büntetlenül össze-vissza, csak győzd követni(pont ezért nem ajánlott). Mindent meg lehet oldani szubrutinokkal. Idézet: „Nem lehet az assembly nyelvben olyat mint a POV-Ray-ben...,” Ezt a megjegyzés formát a C-ből vették át. Assemblerben csak a ; van, de az MPLAB szerkesztőjében blokkokat is megjegyzésbe lehet tenni: Kijelölöd a megjegyzésbe kívánt részt, majd Edit->Advanced->Commnet Block/Uncomment Block (vagy ctrl+5 vagy ctrl+6). Ezzel minden sor elejére betesz egy ;-őt. Lehet keresni is és cserélni is a szokásos módon...
Meg annyit, hogy
Idézet: „Akkor ugye az "akarmi" soromat átugorja?” Nem. pont raugrik, mivel a Z akkor lesz 1, ha a megelozo muvelet eredmenye=0. (movf SZAM1,f) Idézet: „Akkor ugye az "akarmi" soromat átugorja?” Ha a movwf állítaná a Z bitet(de nem állítja), akkor éppen nem ugorna át, mert a Z 1 lenne. A btfsc akkor ugrik, ha a vizsgált bit 0. Idézet: „Muszáj minden egyes sor elé nekem pontosvesszőt írnom?” Sajnos igen. A 3. kérdésedre a válasz., hogy kijelölt részeket külön nem lehet így kezelni tudtommal.
Szívesen!
Nekem ez lefut jól, és állítja a bitet vagyis, az AKARMI itt lefut, nem ugorja át:
Ha van megoldás nem egyesével kommentbe tenni, az engem is érdekelne majd Keres és cserére -> kivágod azt a részt, majd egy új ablakba teszed, majd CTRL + H-val elvégzed, majd visszailleszted Idézet: „Ha van megoldás nem egyesével kommentbe tenni, az engem is érdekelne majd” Leírtam... Van egy magyar leírás az MPLAB 8.1-ről, érdemes tanulmányozni!
Nem tudom hogyan, de az adatlap szerint egyik utasítás sem állítja a statust(2. 3. sor)!
Igen, utólag olvastam, köszönöm! A linket meglesem!
Szia!
Mindig az a kérdés, mit akar elérni a programozó. - Igy az 1. sor által beállított érték marad érvényben a 4. sor teszteléséig, mivel sem a movlw sem a movwf nem állítja. - Írd át az 1. sort bsf STATUS,Z -re, az AKARMI kimarad. - Avagy, ha a SZAMOLO aktuális értéke szerint szeretnéd az AKARMI-t kihagyni:
Szia
Megtaláltam én is az adatlapban, ott tényleg azt mondja, hogy nem állítja, akkor nem tudom, hogy miért lehet ez, pedig biztosra tudom mondani, hogy itt nálam állítja Anomália
Hp41C: Értem én, csak azt nem tudjuk, miért állítja a bitet, amikor elvileg nem is kellene neki. XORWF-el is szépen meglehet vizsgálni, hogy nulla-e. Tudom, sok ilyen van.
Szia!
Részlet az MpLab 8.40 / MPASM leírásából:
Szia
Mindenesetre érdekes, de a PIC szinte biztosan az adatlap szerint végzi a dolgát.
Idézet: „XORWF-el is szépen meglehet vizsgálni, hogy nulla-e” Igen, de ahhoz először be kellene állítani a W-t nullára ami további felesleges utasítás. Egyszerűbb a MOVF REG,f Más értékkel való összehasonlításra viszont tökéletes. Persze itt is a W-be bele kell tenni az összehasonlítandót.
Ez mi?
Idézet: „MPLINK 4.30.01, Linker Copyright (c) 2009 Microchip Technology Inc. Error - file './proba_asm1.o', section '.org_0', Symbol '_.org_0_009A' is not word-aligned. It can not be used as the target of a call or goto instruction. Errors : 1”
Igen, ez igaz! De, ezt most miért is ajánlod az én figyelmembe? Mondtam ezzel ellentétes dolgot?
Üdv!
BTFSC STATUS, Z és a hasonló státusztól függő ugrások helyett lehet használni ezeket, ami átláthatóbb kódot eredményez: SKPZ (SKiP if Zero) SKPNZ (SKiP if Not Zero) SKPC (SKiP if Carry) SKPNC (SKiP if Not Carry) Lehet hogy MPLAB-ban alapból megvan, de ha nincs, akkor a program elején definiálni kell: #DEFINE helyettesítő_név helyettesítendő_kifejezés #DEFINE SKPZ BTFSS STATUS, Z
Ebbe a fájlba gyűjtögetem az eddigi programocskáimat. A mostani a START4 amire ezt a hibaüzenetet adja.
(A START4 program futófényszerűen villogtatja a LED-eket. Az első LED 1-et "ér", a második kettőt, a harmadik hármat, negyedik négyet stb. Ha lenyomom a gombot akkor eltárolja azt hogy hányas LED világított amikor lenyomtam. Utána megint futófény és megint eltárol egy másik számot gombnyomásra. Ha eltárolt két számot akkor villództatja pár másodperig az összes LED-et, majd "kiírja" binárisan a két szám összegét és tíz másodpercig mutatja, majd kezdődik az egész elölről.)
Én nem szeretem használni a gyáritól eltérő parancsokat. Csak gondot okoznak, ha valahol nem áll rendelkezésre. Ennyi erővel saját nyelvet is lehet makrózni...
Állítsd be az absolute code módot. Csatoltam egy képet:
Ebben a módban minden memóriával kapcsolatos kiosztást magadnak kell megoldanod. Ha ezt rá akarod bízni a fordítóra, akkor a másik módot kell választanod és likert csatolnod a projecthez. Mindengyik PIC-hez megvan a linker fájl, keressd a telepedett könyvtárban. Egyelőre ráérsz absolute kódban próbálkozni.
Szia!
Kaptál egy választ, ami nekem azt sugalta, hogy a belinkelt leírásban majd találok rá válszt. Nem találtam, helyette megnéztem a Help-ben. Amit találtam az idéztem... Szia
Arról volt szó, hogy hogyan lehet egyszerre több assembler sort is megjegyzésbe tenni. Ennek módját leírtam itt.
Ez megtalálható az általam linkelt pdf-ben a 4. oldalon, a menük leírásában. És elolvasni nem csak ezért érdemes...
Van ez a kis szubrutinom:
Attól függően hogy a PORTC melyik bitje 1-es, beír egy számot a SZAM1 regiszterbe. De teljesen mindegy hogy melyik 1-es, mindig 8-at ír a SZAM1 regiszterbe. Miért?
Azért, mert a goto $+3 nem oda ugrik, ahová gondolod... Használj címkéket!
Szia!
Az fordítóprogram (ha nem adtad meg) az eredményt a RAM-ba írja. A movf PORTC nem tölti fel a W regisztert. Próbáld meg így: movf PORTC,w Szia |
Bejelentkezés
Hirdetés |