Fórum témák

» Több friss téma
Fórum » PIC programozás assemblyben
 
Témaindító: sonajkniz, idő: Máj 30, 2015
Témakörök:
Lapozás: OK   18 / 32
(#) sonajkniz válasza silent15 hozzászólására (») Jún 6, 2017 /
 
Idézet:
„mert egy kapásból 2 utasításciklussal gyorsabb a dolog”


Igaz ugyan, hogy az assembly legfőbb előnye a tömörségéből adódó gyorsabb futás, de hogy még az inicializálás lefuttatása előtt nyerj két utasításciklusnyi időt, ráadásul mindössze egyszer bekapcsolásonként, annak aztán nincs nagy jelentősége. A főprogram írása során törekedj a tömörségre. Például, ha szükséged van egy linealizációs ciklusra, azt megírhatod úgy is, hogy követed az alapképlet logikáját, és mivel tizedessel nem tudsz dolgozni, így először felszorzod az osztandót mondjuk 100-al hogy egész számot kapj a későbbi számoláshoz, majd a végeredményt újra elosztod, vagy többlépcsős osztásokat csinálsz. Mindenképpen baromi hosszú lesz a kód és a lefutás.
De assemblyben meg van rá a lehetőséged, hogy kiforgasd a képletet, és ezzel a töredékére redukáld a kódot. Ez az, amit egyéb nyelveken nem, vagy csak körülményesen lehet megtenni, ami miatt alig nyersz vele valamit.
(#) silent15 válasza sonajkniz hozzászólására (») Jún 6, 2017 /
 
Igaz. Én ahhoz a mondáshoz tartom magam hogy:
Idézet:
„First make it work then make it better”
. De ez nem azt jelenti hogy menet közben nem lehet a jobb felé kacsingatni. Nem sok a 2 utasításciklus, de ha nekem csak egy kis odafigyelésbe kerül akkor ennyivel jobb lesz a dolog
Bár érzem hogy messze vagyok attól hogy szép assembly kódokat írjak. Jelen esetben:
Idézet:
„My code does not work, but I have no idea why. / My code works, I have no idea why.”


UI: Persze neked is teljesen igazad van, annyira elenyésző hogy felesleges lenne sokszor foglalkozni vele. Én csak azt mondom, ha mondjuk valami nagyobb projektet csinálnék, már kész lenne a program, akkor ilyenekkel lehetne szépíteni
A hozzászólás módosítva: Jún 6, 2017
(#) Hp41C hozzászólása Jún 8, 2017 /
 
Az assembly programozás akkor jön előtérbe, ha valamit gyorsan (rövid, számítható idő alatt) kell elvégezni illetve kis hely áll rendelkezésre.
Az inicializálásra való ugrás megkerülhetetlen. A megszakítási rutinra való ugrással történő "átvezetés" kérdése sokkal bonyolultabb:
- BootLoader átvezeti a megszakítási rutint egy vagy több ugrással. Ugyan ez lehet a megoldás, ha a programot (vagy egy részét) futás közben kell módosítani.
- Túl hosszú (szerteágazó) megszakítási rutint egy külön program lapra (az a bizonyos 2k-s lap) lehet helyezni.
- Időkritikus események kezelésénél lehet, hogy az ugrás végrehajtási idejére is szükség lenne.
- Ha más "túltöltöttük" a program memóriát, minden felesleges utasítás helye jól jön, minden kis zugot ki lehet használni.
(#) IzLuCSi hozzászólása Júl 17, 2017 /
 
Sziasztok!

Van egy PIC32MZ2048EFH144 -es mikrovezérlőm. Ezt a típust lehet assembly nyelven programozni? Mert eddig MPLAB X IDE -hez csak C nyelvü compilert találtam.

Hogyan lehet ezt a típust assemblyben programozni?
(#) Hp41C válasza IzLuCSi hozzászólására (») Júl 17, 2017 /
 
XC32 -ben van assembler is.
(#) IzLuCSi válasza Hp41C hozzászólására (») Júl 17, 2017 /
 
Azt használom és amikor létre akarok hozni egy új .asm-et akkor azt írja ki hogy
"An Assembler file with no content."
Vagy akkor nem az MPLAB X IDE-ben hozzak létre egy új asm-et hanem az asztalon egy txt-ből és azt nyissam meg a programban?
(#) IzLuCSi hozzászólása Júl 25, 2017 /
 
Miért nem tudok assemblyben programot égetni rá? Mi a probléma? Hogyan kéne akkor csinálnom?
(#) usane válasza IzLuCSi hozzászólására (») Júl 26, 2017 /
 
Ugyanúgy ahogy C-ben. Lefordít, beéget. Mi nem megy?
(#) IzLuCSi hozzászólása Júl 26, 2017 /
 
Nem ugyanúgy.
Mert C ben létre hozom a fáljt és mikor rá égetem gond nélkül meg csinálja.
Azonban mikor létre hozom a .asm fáljt már akkor írj hogy "An Assembler file with no content.".
Amikor pedig be akarom égetni hibát jelez.
"
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/magyarazathoz.X'
make -f nbproject/Makefile-default.mk dist/default/production/magyar_zathoz.X.production.hex
make[2]: Entering directory 'C:/Users/magyarazathoz.X'
make[2]: Leaving directory 'C:/Users/magyarazathoz.X'
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
make[2]: *** No rule to make target 'build/default/production/newAsmTemplate.o', needed by 'dist/default/production/magyar_zathoz.X.production.hex'. Stop.
make[1]: Leaving directory 'C:/Users/magyarazathoz.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 376ms)
"
(#) ktamas66 válasza IzLuCSi hozzászólására (») Júl 26, 2017 /
 
Nincs véletlenül egy á betű valamelyik "magyarazathoz"-ban?
(#) IzLuCSi válasza ktamas66 hozzászólására (») Júl 26, 2017 /
 
Nem az a baj. De azért csináltam egy új projectet és tessék:

"
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/magyarazathoz.X'
make -f nbproject/Makefile-default.mk dist/default/production/magyarazathoz.X.production.hex
make[2]: Entering directory 'C:/Users/magyarazathoz.X'
make[2]: *** No rule to make target 'build/default/production/newAsmTemplate.o', needed by 'dist/default/production/magyarazathoz.X.production.hex'. Stop.
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory 'C:/Users/magyarazathoz.X'
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/magyarazathoz.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 528ms)
"
(#) IzLuCSi hozzászólása Júl 30, 2017 /
 
Egyéb ötlet, hogy miért nem akar működni?
(#) usane válasza IzLuCSi hozzászólására (») Aug 2, 2017 /
 
A source könytárban benne van? Bal oldalon a project fán.
Max töltsd fel ide, vagy privátban küldd és megnézem mi a helyzet vele.
A hozzászólás módosítva: Aug 2, 2017
(#) silent15 hozzászólása Okt 26, 2017 /
 
Sziasztok!

Olyanba botlottam egy 10f206 nál hogy nincs return utasítás csak retlw. Viszont az mplab elfogadja a return utasítást is(nem vagyok gépközelben de megnézem majd mire fordítja). Ilyenkor mit csináljak? Nincs szükségem visszatérési értékre. Gondolom ez a pic kevés utasítása miatt van, elvégre ha nem is akarok visszaadni akkor is így bármit visszaadva csak 1 utasítás kell a 2 helyett.
Kérhetek erről egy kis felvilágosítást?

Köszönöm!
A hozzászólás módosítva: Okt 26, 2017
(#) nedudgi válasza silent15 hozzászólására (») Okt 26, 2017 /
 
Az MPLab a return-t nem utasításként, hanem makróként kezeli PIC12F206 esetén. Így RETLW 0 kerül a fordításba.
(#) kissi válasza silent15 hozzászólására (») Okt 26, 2017 /
 
Szia!

Arról azért ne feledkezz meg ( ha számít!), hogy ez felülírja a korábbi W értékedet !
(#) silent15 válasza nedudgi hozzászólására (») Okt 26, 2017 /
 
Sziasztok!

Köszönöm a válaszaitokat, közben haza is értem, és tényleg RETLW 0 ra fordítja. Mivel nincs megszakítás ebben a kontrollerben, ezért nem túl lényeges hogy mentegessem a W értékét, szóval annyira nem vagyok bajban vele. Köszönöm a segítséget!
(#) silent15 hozzászólása Okt 26, 2017 /
 
Sziasztok, egy újabb kérdés jött fel. Adott az alábbi programrészlet:
  1. SHIFT_OUT    
  2.     MOVLW 0x00
  3.     MOVWF COUNTER
  4. SHIFT_OUT_LOOP_PERC_EGGYES  
  5.     BCF GPIO, GP1
  6.     RRF PERC_EGGYES, 1
  7.     BTFSC STATUS, C
  8.     BSF GPIO, GP0
  9.     BTFSS STATUS, C
  10.     BCF GPIO, GP0
  11.     BSF GPIO, GP1
  12.     INCF COUNTER
  13.     MOVLW 0x08
  14.     SUBWF COUNTER, 0
  15.     BTFSC STATUS, Z
  16.     GOTO SHIFT_OUT_LOOP_PERC_EGGYES

Itt egy bájtnyi adatot szeretnék kishiftelni, viszont minden állapot csak magas amit kiad, de nem értem hogy miért. Mit rontok el ?

UI: GP0 az adatláb, GP1 pedig a clock.
A hozzászólás módosítva: Okt 26, 2017
(#) sonajkniz válasza silent15 hozzászólására (») Okt 26, 2017 /
 
Az RRF PERC_EGGYES után mi az a ,1?
A GPIO,GP1 viszont minden feltétel esetén 1-be vált.
A STATUS,C második ellenőrzése és az alatta lévő sor viszont felesleges.
(#) silent15 válasza sonajkniz hozzászólására (») Okt 26, 2017 /
 
RRF-nél az eggyes hogy a fájlregiszteren keresztül forgat. A másik ellenőrzés nekem átláthatóbbá teszi, lehet átírom még. A GP1 nem baj hogy mindíg egybe vált, a GP0 nem akar semmilyen módon se 0-ra váltani.
A kódrészlet úgy működik hogy előzetesen feltöltöm a PERC_EGGYES regisztert a kívánt értékkel, és utána hívom meg ezt. A kód fut, nem akad le sehol (proteusban raktam össze) de nem vált a GP0 soha eggyesre.
(#) sonajkniz válasza silent15 hozzászólására (») Okt 26, 2017 /
 
Szerintem hagyd le azt az 1-est, tedd az 6-os sort a 12-es elé, a 6-os helyére írd, hogy BTFSC PERC_EGGYES,0
a 7-es, 9-es 10-es sort pedig töröld ki.
(#) Hp41C válasza silent15 hozzászólására (») Okt 26, 2017 /
 
Lehetséges okok:
- TRISIO 0. bitje nem 0,
- Analóg funkció nincs kikapcsolva,
- A GPIO 0 kimenet túl van terhelve, esetleg csak dinamikusan.
A bcf, bsf read - modify - write művelet, azaz a port regiszter értékét beolvassa, 1 -re / 0 -ra állítja a megfelelő bitet és kiítja. Ha az előzőleg végrehajtott utasítás hatására a port lábon a feszültség nem emelkedik kellően (ld. adatlap) magasra, akkor azon a biten alacsony szintet fog beolvasni és már egy hibás értéken hajtja végre a műveletet.

Idézet:
„Az RRF PERC_EGGYES után mi az a ,1”

Jobban méz ki így:
  1. RRF PERC_EGGYES ,F

Ugyanígy, a INCF COUNTER -t is érdemes átírni INCF COUNTER,F -re.
(#) silent15 válasza Hp41C hozzászólására (») Okt 26, 2017 /
 
Kezdem elveszteni a reményem. Rájöttem hogy van kiadott adat, csak nem helyes, de azt nem értem miért.
Linkelem a teljes kódot hátha valaki rájön.
  1. #include "p10f206.inc"
  2.  __CONFIG _WDTE_OFF & _CP_OFF & _MCLRE_OFF
  3.  
  4. CBLOCK 0x08
  5.     SHIFT_ADAT
  6.     COUNTER
  7. ENDC
  8. RES_VECT  CODE    0x0000          
  9.     GOTO INIT
  10. INIT
  11.     MOVLW 0xD0
  12.     OPTION
  13.     MOVLW 0x08
  14.     TRIS GPIO
  15.     BCF GPIO, GP2
  16.     GOTO MAIN
  17. MAIN  
  18.     MOVLW 0x6D
  19.     MOVWF SHIFT_ADAT
  20.     CALL SHIFT_OUT  
  21.     GOTO MAIN
  22. ;INNENTŐL KEZDŐDIK AZ ADATOK KISHIFTELÉSE    
  23. SHIFT_OUT    
  24.     MOVLW 0x00
  25.     MOVWF COUNTER
  26. SHIFT_OUT_LOOP
  27.     BCF GPIO, GP1
  28.     RRF SHIFT_ADAT, F
  29.     BTFSC STATUS, C
  30.     BSF GPIO, GP0
  31.     BTFSS STATUS, C
  32.     BCF GPIO, GP0
  33.     BSF GPIO, GP1
  34.     INCF COUNTER, F
  35.     MOVLW 0x08
  36.     SUBWF COUNTER, W
  37.     BTFSC STATUS, Z
  38.     GOTO SHIFT_OUT_LOOP
  39.     BCF GPIO, GP1
  40.     BSF GPIO, GP2
  41.     BCF GPIO, GP2
  42.     RETLW 0x00
  43. ;ITT ÉR VÉGET AZ ADATOK KISHIFTELÉSE
  44.     END

Most annyit módosítottam hogy 8 bites csoportokban küldi ki az adatot. A két bit tesztet bent hagytam, nekem ez így átláthatóbb és könnyebb leprogramozni;
-ha az érték 0 ugorja át a következőt
-nem ugorta át ergó 1 - beállítom a lábat 1-re
-ha az érték 1 ugorja át a következőt
-nem ugorta át ergó 0 - beállítom a lábat 0-ra

GP0, adatláb. GP1, órajel. GP2, strobe láb.

A kód az én értelmezésemben; clock alacsony, carrybe beshiftelem az első bitet, tesztelem hogy milyen és aszerint állítom a GP0 lábat, clock magas, növelem a számlálót, megnézem hogy hol tartok, 8x csinálom meg. Ha letelt visszatérek.

Valamit nagyon elnézek, de nem értem mit
(#) sonajkniz válasza silent15 hozzászólására (») Okt 26, 2017 /
 
Próbáld ki azt, hogy az adatbyte 0-ás bitjét vizsgálod a carry helyett.
Mivel nem találok hibát az elgondolásodban, csak arra tudok gondolni, hogy nem tolja be valamiért a carryba az adat soron következő bitjét. Viszont a kivonásnál a carry 1-be vált.
Ha így sem működik, akkor maga az eltolás nem teljesül.
(#) Pali79 válasza silent15 hozzászólására (») Okt 26, 2017 /
 
Idézet:
„A kód az én értelmezésemben; clock alacsony, carrybe beshiftelem az első bitet, tesztelem hogy milyen és aszerint állítom a GP0 lábat”

Az első bit nálad az a 0.?
(#) Hp41C válasza silent15 hozzászólására (») Okt 26, 2017 /
 
- Analóg funkció nincs kikapcsolva:
A PIC10F206 -ben van egy analóg komparátor, ami alaphelyzetben be van kapcsolva. Ettől a GP0 (CIN+) és a GP1 (CN-) analóg módban van a reset után, de a komparátor kimenete nem kapcsolódik a GP2 (COUT) lábra. Ld. adatlap 8.8
A TRIS GPIO utasítás után egy bcf CMCON0, CMPON utasítás kell még.

Más:
A 10F206 a program memória legutolsó rekeszében tárolja az OSCCAL gyári beállítását. A memória törlése kitörölheti ezt az értéket.

Javaslat DIP8 tokozáshoz: A OSCCAL beállítási értékét egy új kontrollernél olvasssuk ki és az érték szerint jelüljük meg a lábait: A 0 bit szerint az 1. lábat, az 1. bit szerint a 2. lábat stb. Ránézéssel bármikor be tudjuk állítani az OSCCAl értéket.

PICkit2 -nél a hex file beolvasásakor a program memória legutolsó rekesz tartalmát a kontrollerből kiolvasottal helyettesíti. Tehát már az állomány beolvasása előtt csatlakoztassuk a kontrollert.

  1. #include "p10f206.inc"
  2.  __CONFIG _WDTE_OFF & _CP_OFF & _MCLRE_OFF
  3.  
  4. CBLOCK 0x08
  5.     SHIFT_ADAT
  6.     COUNTER
  7. ENDC
  8. RES_VECT  CODE    0x0000          
  9.     GOTO INIT
  10.  
  11. INIT
  12.         MOVLW   0xD0
  13.         OPTION
  14.         MOVLW   0x08
  15.         TRIS    GPIO
  16.         BCF             GPIO, GP2
  17.  
  18.                 bcf             CMCON0,CMPON
  19.         GOTO    MAIN
  20.  
  21.  
  22. MAIN  
  23.         MOVLW   0x6D
  24.         MOVWF   SHIFT_ADAT
  25.         CALL    SHIFT_OUT
  26.         GOTO    MAIN
  27.  
  28.  
  29.     ;INNENTŐL KEZDŐDIK AZ ADATOK KISHIFTELÉSE  
  30. SHIFT_OUT  
  31.         MOVLW   0x08
  32.         MOVWF   COUNTER
  33. SHIFT_OUT_LOOP
  34.         BCF             GPIO, GP1
  35.         RRF             SHIFT_ADAT, F
  36.         BTFSC   STATUS, C
  37.         BSF             GPIO, GP0
  38.         BTFSS   STATUS, C
  39.         BCF             GPIO, GP0
  40.         BSF             GPIO, GP1
  41.         DECFSZ  COUNTER, F
  42.         GOTO    SHIFT_OUT_LOOP
  43.         BCF             GPIO, GP1
  44.         BSF             GPIO, GP2
  45.         BCF             GPIO, GP2
  46.         RETLW   0x00
  47.  
  48.     ;ITT ÉR VÉGET AZ ADATOK KISHIFTELÉSE
  49.         END
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 26, 2017 /
 
Idézet:
„A PIC10F206 -ben van egy analóg komparátor, ami alaphelyzetben be van kapcsolva.”

Ezek szerint ennél acPIC-nél a kimenetnek állított lábat is tudja blokkolni az analóg bemenet?
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 27, 2017 /
 
Sajnos ez nem olvasható ki az adatlapból, a port kimenet ábráján sincs feltüntetve.
Nézd meg a 10F220, 10F222 adatlapját is. Ott a megszokottól eltérő megoldás látható. Az analóg mód a kimenetet tiltja le. A rajz szerint a bekapcsolt analóg módú portbit szintje beolvasható a GPIO regiszter olvasásával.
Nem biztos, hogy a kimenettel van a probléma:
Tegyük fel, a BSF GPIO, GP0 beállítja a kimenetet 1 -re. A következő BSF GPIO, GP1 beolvasná a GPIO0 lábról a szintet, mivel az analóg, így feltehetőleg 0 -t olvas, átállítja a GPIO1 értékét és visszaírja a GPIO regiszterbe. Ezzel 0 -ra állítja a GPIO0 lábat.
Csak méréssel dönthető el, hogy melyik módszert alkalmazták a 10F200 - 10F206 esetén.
(#) silent15 válasza sonajkniz hozzászólására (») Okt 27, 2017 /
 
Kikapcsoltam a komparátort, most már a adatbyte bitjét vizsgálom (a carry-vel igazatok van, fals adatot fog visszadobálni a kivonás miatt, bár mivel minden egyes függvényhívás előtt frissítem az adatbytot ennek nem kéne bezavarnia.) Viszont továbbra sem akarja az igazat, kipróbálom még pár dolgot, aztán lehet átírom az egészet más elgondolás alapján, esetleg tanácsot kérnék tőletek hogy ti ezt hogy oldanátok meg?
A hozzászólás módosítva: Okt 27, 2017
(#) silent15 válasza Hp41C hozzászólására (») Okt 27, 2017 /
 
Utólag elnézést kérek tőletek, ugyanis én hibáztam. CD4094-et használok , aminek a 8 bit kishiftelése után egyből a strobe lábbal beírtam az adatot és ez volt a hiba, és a fals és villodzó kiírások oka. Most egy egyszerűsített (és hosszabb) kóddal fut, és a hiba okának tudatával már kijavítva szépen azt jelzi ki ami nekem kell! Ezt én nem mondtam nektek, ezért nem is tudhattátok, de azért mindenkinek jár egy hatalmas virtuális pacsi!

Köszönöm!
Következő: »»   18 / 32
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