Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   620 / 1319
(#) icserny válasza Attila86 hozzászólására (») Dec 13, 2009 / 1
 
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.
(#) Attila86 hozzászólása Dec 13, 2009 /
 
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:
  1. movlw     b'00000000'
  2. movwf     SZAM1
  3. btfsc        STATUS,Z
  4. akarmi

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?
(#) Hp41C válasza Attila86 hozzászólására (») Dec 13, 2009 / 1
 
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
(#) watt válasza Attila86 hozzászólására (») Dec 13, 2009 /
 
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.
(#) MPi-c válasza Attila86 hozzászólására (») Dec 13, 2009 / 1
 
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...
(#) Ktulu válasza Attila86 hozzászólására (») Dec 13, 2009 /
 
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)
(#) watt válasza Attila86 hozzászólására (») Dec 13, 2009 /
 
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.
(#) Hujikolp válasza Attila86 hozzászólására (») Dec 13, 2009 /
 
Szívesen!

Nekem ez lefut jól, és állítja a bitet vagyis, az AKARMI itt lefut, nem ugorja át:
  1. BCF     STATUS,Z
  2.         MOVLW   0X00
  3.         MOVWF   SZAMOL0
  4.         BTFSC   STATUS,Z
  5.         AKARMI


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
(#) MPi-c válasza Hujikolp hozzászólására (») Dec 13, 2009 /
 
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!
(#) watt válasza Hujikolp hozzászólására (») Dec 13, 2009 /
 
Nem tudom hogyan, de az adatlap szerint egyik utasítás sem állítja a statust(2. 3. sor)!
(#) Hujikolp válasza MPi-c hozzászólására (») Dec 13, 2009 /
 
Igen, utólag olvastam, köszönöm! A linket meglesem!
(#) Hp41C válasza Hujikolp hozzászólására (») Dec 13, 2009 /
 
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:

  1. movlw 0x00
  2.   movwf SZAMLALO    ; SZAMLALO itt 0
  3.   addlw 0x01              ; Szándékosan elrontjuk a W ill. a Z értékét
  4.   movf  SZAMLALO,f  ; Beállítjuk a Z-t a SZAMLALO pillanatnyi értéke szerint
  5.   btfsc  STATUS,Z      ; Vizsgáljuk a Z-t
  6.   AKARMI


Szia
(#) Hujikolp válasza watt hozzászólására (») Dec 13, 2009 /
 
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.
(#) Hp41C válasza MPi-c hozzászólására (») Dec 13, 2009 /
 
Szia!

Részlet az MpLab 8.40 / MPASM leírásából:
  1. Comments
  2. Comments are text explaining the operation of a line or lines of code.
  3.  
  4. The MPASM assembler treats anything after a semicolon as a comment. All characters following the semicolon are ignored through the end of the line. String constants containing a semicolon are allowed and are not confused with comments.


Szia
(#) watt válasza Hujikolp hozzászólására (») Dec 13, 2009 /
 
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.
(#) Attila86 hozzászólása Dec 13, 2009 /
 
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”
(#) MPi-c válasza Hp41C hozzászólására (») Dec 13, 2009 /
 
Igen, ez igaz! De, ezt most miért is ajánlod az én figyelmembe? Mondtam ezzel ellentétes dolgot?
(#) watt válasza Attila86 hozzászólására (») Dec 13, 2009 /
 
Csatold a kódot! (tallózás...)
(#) pixels válasza Attila86 hozzászólására (») Dec 13, 2009 / 1
 
Ü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
(#) Attila86 válasza watt hozzászólására (») Dec 13, 2009 /
 
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.)
(#) watt válasza pixels hozzászólására (») Dec 13, 2009 /
 
É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...
(#) Hujikolp válasza pixels hozzászólására (») Dec 13, 2009 /
 
Alapból vannak benne makrók. Link
(#) watt válasza Attila86 hozzászólására (») Dec 13, 2009 / 1
 
Á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.
(#) Hp41C válasza MPi-c hozzászólására (») Dec 13, 2009 /
 
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
(#) MPi-c válasza Hp41C hozzászólására (») Dec 13, 2009 /
 
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...
(#) Attila86 válasza watt hozzászólására (») Dec 13, 2009 /
 
Köszönöm!
(#) Attila86 hozzászólása Dec 14, 2009 /
 
Van ez a kis szubrutinom:
  1. SZAM1_tarolas:
  2.         clrf    SZAM1
  3.         movf    PORTC
  4.         btfss   W,0             ;az első szám 1?
  5.                 goto    $+3
  6.                 movlw   d'1'    ;ha igen, akkor...
  7.                 movwf   SZAM1   ;... írjunk 1-et a SZAM1 regiszterbe
  8.         btfss   W,1             ;az első szám 2?
  9.                 goto    $+3
  10.                 movlw   d'2'    ;ha igen, akkor...
  11.                 movwf   SZAM1   ;... írjunk 2-őt a SZAM1 regiszterbe
  12.         btfss   W,2             ;az első szám 3?
  13.                 goto    $+3
  14.                 movlw   d'3'    ;ha igen, akkor...
  15.                 movwf   SZAM1   ;... írjunk 3-at a SZAM1 regiszterbe
  16.         btfss   W,3             ;az első szám 4?
  17.                 goto    $+3
  18.                 movlw   d'4'    ;ha igen, akkor...
  19.                 movwf   SZAM1   ;... írjunk 4-et a SZAM1 regiszterbe
  20.         btfss   W,4             ;az első szám 5?
  21.                 goto    $+3
  22.                 movlw   d'5'    ;ha igen, akkor...
  23.                 movwf   SZAM1   ;... írjunk 5-öt a SZAM1 regiszterbe
  24.         btfss   W,5             ;az első szám 6?
  25.                 goto    $+3
  26.                 movlw   d'6'    ;ha igen, akkor...
  27.                 movwf   SZAM1   ;... írjunk 6-ot a SZAM1 regiszterbe
  28.         btfss   W,6             ;az első szám 7?
  29.                 goto    $+3
  30.                 movlw   d'7'    ;ha igen, akkor...
  31.                 movwf   SZAM1   ;... írjunk 7-et a SZAM1 regiszterbe
  32.         btfss   W,7             ;az első szám 8?
  33.                 goto    $+3
  34.                 movlw   d'8'    ;ha igen, akkor...
  35.                 movwf   SZAM1   ;... írjunk 8-at a SZAM1 regiszterbe
  36.         RETURN

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?
(#) icserny válasza Attila86 hozzászólására (») Dec 14, 2009 /
 
Azért, mert a goto $+3 nem oda ugrik, ahová gondolod... Használj címkéket!
(#) Hp41C válasza Attila86 hozzászólására (») Dec 14, 2009 /
 
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
(#) icserny válasza Attila86 hozzászólására (») Dec 14, 2009 /
 
Érvénytelen címed adtál meg. Az utasítások páros címen kezdődnek!
Kapkodás helyett olvasd már el a PICCOLO projekt első fejezeteit, légyszi!
Következő: »»   620 / 1319
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem