Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   79 / 1210
(#) zenetom válasza hackerfish hozzászólására (») Dec 22, 2010 /
 
Szuper!
(#) watt válasza hackerfish hozzászólására (») Dec 22, 2010 /
 
Töltsd le a 8.6-os MPLAB-ot, mert a 8.1 nagyon régi!
Nekem akkor szürke a Stop Watch, ha meg van már nyitva. Nincs ott valahol a háttérben?
Az MPLAB SIM van kiválasztva?

A PIC utasításait a saját adatlapjában találod meg mindig, azokat használd...
(#) El_Pinyo válasza hackerfish hozzászólására (») Dec 22, 2010 /
 
Idézet:
„Nem lehet egyszerűbben csinálni?”

Ezek egyszerű 8 bites, kis utasításszámú mikrovezérlők és nem PC processzorok. Hardveres támogatás viszont van, lásd timer időzítő perifériák.
(#) icserny válasza hackerfish hozzászólására (») Dec 22, 2010 /
 
Idézet:
„Itt mért kell ennyi kód egy kis szünethez?”
Mert 8 bitesek a regiszterek, s a max. 256-ig számláló ciklussal nem sokra mégy. Használj 32 bites processzort, s akkor kevesebb utasítással is megoldható a késleltetés!
(#) vilmosd válasza hackerfish hozzászólására (») Dec 22, 2010 /
 
Hasznald a TMR1-et IT-vel. 8-as eloosztoval 4 MHz-nel 524 mS az atfordulas.
(#) watt válasza hackerfish hozzászólására (») Dec 22, 2010 /
 
Idézet:
„Itt mért kell ennyi kód egy kis szünethez?”

Mert lassú a PC!
(#) hackerfish hozzászólása Dec 22, 2010 /
 
Jólvan, köszi a magyarázatokat, ötleteket, majd átbogarászom!
Az MPLAB új verzióját meg majd leszedem (ma vagy holnap).

Tök jó, hogy sikerült elkezdenem PICelni, már elég régóta vártam erre. Most hogy az égető hibátlan, és minden szoftver megvan, kicsit belemerülhetek a PIC assembly rejtelmeibe.
Első komolyabb projektem egy bináris óra lesz, ha sikerül, de még csak a tervezés fázisában van.

Íme a mai kísérletezgetésem eredménye:
Egy kis villogó: zsugorcsőben 7805, ellenállás, led meg egy csati.
(#) hackerfish hozzászólása Dec 23, 2010 /
 
Lenne egy kérdésem:
Olyan futófényt már tudok csinálni, ahol egyesével megadok minden lépést.
Pl.:
MOVLW B'00000001'
MOVWF PORTB
CALL SZUN
MOVLW B'00000010'
MOVWF PORTB
CALL SZUN
MOVLW B'00000100'
MOVWF PORTB
CALL SZUN
stb.
De hogyan tudnám megcsinálni ugyanezt egy változó növelésével, majd PORTB-re írásával?
Igazából nem is futófény kéne, hanem egy 8 jegyű bináris szám. Valahogy így:
1.) 00000000
2.) 00000001
3.) 00000010
4.) 00000011
5.) 00000100
Addig jutottam el, hogy van egy SZAM nevű változóm, és ha minden igaz így tudom növelni: INCF SZAM.
De ez valamiért nem működik.
  1. ...
  2. SZAM    EQU     B'00000001'
  3. ...
  4.         MOVLW   B'00000000'
  5.         MOVWF   PORTB
  6.         CALL    SZUN
  7.         MOVLW   SZAM
  8.         MOVWF   PORTB
  9. VISSZA
  10.         INCF    SZAM
  11.         MOVLW   SZAM
  12.         MOVWF   PORTB
  13.         GOTO    VISSZA
  14. ...
(#) zenetom válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
A "SZAM" változót simán deklaráld, mint a "VAR" változókat, és a program elején töröld (CLRF SZAM), majd amikor portra akarod kiírni, akkor használd ezt:
  1. MOVF SZAM,W     ;a "SZAM" változót bemozgatjuk a work-be
  2. MOVWF PORTB    ;a work-ot kiirjuk a portra


A növelésnél pedig meg kell adni a cél regisztert (ami vagy saját maga, vagy a work), ha nem adod meg, akkor a Work-ben lesz a növelt szám. Tehát ha a SZAM regiszert akarod növelni, akkor így kell:
  1. INCF SZAM,F


Remélem tudtam segíteni.
(#) hackerfish válasza zenetom hozzászólására (») Dec 23, 2010 /
 
Köszi szépen, ez működik!
Egyébként a VAR-okat mért úgy kell deklarálni, hogy CBLOCK 0x20? Így hexa 20 lesz az értékük, ez mire jó, mért nem lehet egyből decimális 200?
(#) zenetom válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
Kicsit látom még homályos Neked ez a rész.
Olvastad Topi cikkét ?
Ezt tekintsd bibliának.
A CBLOCK 0x20 az azt jelenti, hogy amiket utána írsz változókat, azok a 0x20-as memóriacímtől kezdődjenek. Az értékük pedig nem tudom mi lesz, valószínűleg 0, vagy 255, de a program elején ilyenkor mindig kell neki adni értéket. Őszintén szólva ezzel az EQU-t nem nagyon szoktam használni, mert (még) nem látom értelmét.
(#) hackerfish válasza zenetom hozzászólására (») Dec 23, 2010 /
 
Már olvasgattam belőle, de most nekiállok rendesen végigolvasni!
Sikerült csinálnom egy olyat, hogy 9 ig kiírja PORTB-re a bináris számot, és utána újrakezdi.
Ez lesz a bináris órám alapja.
A másodperc egyes helyiértékétől kezdve végigvizsgálok minden számjegyet, hogy növelhetem -e még, vagy nullázni kell, és a következőt növelni. Pár egymásba ágyazott ciklus elég is lesz, meg egy kis multiplex, meg bemenetkezelés...
(#) icserny válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
  1. ....
  2.     INCF    SZAM
  3.     MOVLW   SZAM
  4.     MOVWF   PORTB

Ezzel az a probléma, hogy a MOVLW SZÁM utasítás nem a változó tartalmát veszi elő, hanem a változó címét rakja számkonstansként a munkaregiszterbe.
(#) zenetom válasza icserny hozzászólására (») Dec 23, 2010 /
 
Ezt el is felejtettem neki írni...
(#) hackerfish válasza icserny hozzászólására (») Dec 23, 2010 /
 
Aha, értem.
Kicsit off, de hogyan tudnám beállítani az MPLAB-ot, hogy valós időben mutassa a portokat? Mert most ha benthagyom a progiban a rendes időzítést, az animálásnál nem győzöm kivárni míg lefut. Pedig a settingsnél beállítottam a 4MHz oszcillátort.
(#) kissi válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
Az utasítások között próbálj F8-al lépkedni, nem kell ott olyan sokat várni ( hacsak nem órákat időzítesz ?! )!

Egyébként szimulációnál nagyon hasznos, ha nem futtatod a teljes késleltetést ( csak amikor beméred !), egyébként ezzel kapcsolatban nézd meg az IFDEF, IFNDEF fordítói direktívákat ( MPLAB helpjében keresd! ) !

Steve
(#) icserny válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
Idézet:
„most ha benthagyom a progiban a rendes időzítést, az animálásnál nem győzöm kivárni míg lefut.”
Hát ne hagyd benne! Szimulációnál cseréld le rövidebbre.
(#) hackerfish válasza icserny hozzászólására (») Dec 23, 2010 /
 
Igen, azt csináltam. Az egész SZUN szubrutin pontosvesszővel megjegyzésként van a kódban, csak egy NOP van benne.
(#) icserny válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
Azzal is lehet próbálkozni, hogy a program elején definiálsz egy SIM,vagy USE_SIM (vagy amilyen nevet akarsz) szimbólumot, s a programban feltételes fordítási direktívával nem fordítasz be bizonyos sorokat (vagy fordítva: befordítasz bizonyos sorokat). Ennek akkor van értelme,ha több helyen is bele kellene nyúlni a programban. Így egyszerűbb egyetlen helyen beavatkozni, ha szimulátorban futtatsz.

A részleteket az MPASM leírásából kell kihámozni.
Ilyesmire gondolok:

  1. #define SZIM  ;csak ha szimulátorban futtatunk
  2.   ....
  3. SZUN
  4. #ifdef SZIM
  5.         NOP
  6. #else
  7.         MOVLW   d'200'
  8.         MOVWF   VAR
  9. DEL3
  10.         MOVLW   d'200'
  11.         MOVWF   VAR2
  12. DEL4
  13.         NOP
  14.         NOP
  15.         NOP
  16.         NOP
  17.         NOP
  18.         DECFSZ  VAR2,F
  19.         GOTO DEL4
  20.         DECFSZ  VAR,F
  21.         GOTO DEL3
  22. #endif
  23.         RETURN
(#) hackerfish válasza icserny hozzászólására (») Dec 23, 2010 /
 
Köszi a tippet, de szerintem egyenlőre fölösleges a használata egy ilyen apró progiban. Persze egy komolyabb kód esetén hasznos lehet, főleg ha több ilyen rész is van.
Viszont lenne még kérdésem:
A szünet ugyebár 320 milliszekundum. Hogyan lehet ezt megváltoztatni? Gondolom a NOP-ok száma, VAR és VAR2 értéke befolyásolja.
De nekem valami olyasmi kellene, hogy egy változóban megadhassam a szünet idelyét milliszekundumban, majd a szun rutint meghívva pont annyi ideig tartson a szünet. Ehez az lenne jó, ha a szünet pont 1 ms lenne, és egy ciklusban hívnám meg, aminek a változó lenne a ciklusszámlálója. Hogyan tudnám megvalósítani, hogy pont 1 ms legyen?
(#) potyo válasza icserny hozzászólására (») Dec 23, 2010 /
 
Van az __DEBUG, amit az MPLAB sajátmaga állít be attól függően, hogy Debug vagy Release build van kiválasztva.
(#) icserny válasza potyo hozzászólására (») Dec 23, 2010 /
 
Idézet:
„Van az __DEBUG, amit az MPLAB sajátmaga állít be”
Van, de a DEBUG mód és a szimuláció az két különböző dolog. Szimulációhoz nem szoktam a DEBUG módot bekapcsolni, mert az bizonyos dolgokat megváltoztat a programban.
(#) watt válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
Egy várakozás kikerülése nem a program méretétől függő dolog, azt egyszerűen ki kell kerülni szimulációkor, ha nem akarsz előtte megőszülni, kivéve, ha a várakozás időtartamát vizsgálod.
(#) vilmosd válasza hackerfish hozzászólására (») Dec 23, 2010 /
 
Hali
Lehet csinalni valami "delay" rutint, aminek fix ideje van. Vigyazni kell, mert ugye a proci vegrehajtasi ciklusai orajel fuggoek. Viszont tudjuk, hogy 4 MHz orajel eseten egy vegrehajtasi ciklus 1 uS. Itt van egy kesleltetesi rutin, 4 MHz-re. A meghivas elott a W-be be kell irni a 10 mS ciklusok szamat. Tehat ha Te 120 mS kesleltetest akarsz, akkor a w-be 12-t kell beirni a hivas elott.
  1. ;--------------------------------------------------------
  2. ; General purpose Delay routine: Feed multiples of 10mS in via "W" reg
  3.  
  4. Delay           movwf   Coarse_Delay
  5. Delay_M                         movlw   H'0A'
  6.                     movwf       M_Delay
  7. Delay01         movlw   H'FF'
  8.                 movwf   Fine_Delay
  9. Delay02         clrwdt                          ; reset watchdog timer
  10.                 decfsz  Fine_Delay,F            ; this loop takes approx 1mSec
  11.                 goto    Delay02                 ;
  12.                 decfsz  M_Delay,F
  13.                 goto    Delay01
  14.                 decfsz  Coarse_Delay,F
  15.                 goto    Delay_M
  16.                 retlw   0
  17.  
  18. ;-----------------------------------------------------------------------------

A meghivas igy tortenik:
  1. .
  2. .
  3.                movlw     12       ; 120mS delay
  4.                call    Delay

Termeszetesen a program elejen a valtozokat deklaralni kell. Itt a "Coarse_Delay", "M_Delay", es a "Fine_Delay" valtozokrol van szo. Arra ugyelni kell, hogy ez a rutin max 255 erteket fogad el. A max kesleltetes : 255x10 mS= 2.55 S. Igaz a W-be nem tudsz nagyobb erteket irni.
Csa Vili
(#) hackerfish válasza vilmosd hozzászólására (») Dec 24, 2010 /
 
Hali!
Köszi a kódot, de így elsőre nem akar működni...
Nekem WDT nincs bekapcsolva, szóval az a rész gondolom nem kell. Ahelyett a sor helyett beraktam egy NOP-ot, hogy a lefutás idelye ugyanaz legyen.
Coarse_Delay-t, Fine_Delay-t, Delay_M-t deklarálni kell? Egy csomó hibát kiírt.

U.i.: Mostmár semmi gond, megoldódott.
(#) hackerfish válasza vilmosd hozzászólására (») Dec 24, 2010 /
 
Most látom még írtad is, csak az alját nem olvastam el
Ha jól értem, egy másodperces késleltetéshez 100-at kell beírni. De valamiért kicsit tovább tart a led felvillanása. Mi zavar be?
(#) hackerfish válasza hackerfish hozzászólására (») Dec 24, 2010 /
 
Na így most jónak tűnik. Mobilomon lévő stopperórával méricskéltem.

  1. VISSZA
  2. MOVLW   B'01000000'     ; RB6 - világít
  3. MOVWF   PORTB
  4. movlw   65              ; 1 -> 10mS delay
  5. call    Delay
  6. MOVLW   B'00000000'     ; RB6 - nem világít
  7. MOVWF   PORTB
  8. movlw   65
  9. call    Delay
  10. GOTO    VISSZA


Elvileg 1 másodpercig kellene világítania, aztán 1 másodpercig nem.
(Tudom, a "goto vissza" miatt a második rész 1us-al hoszabb, de az időzítőnek 10us pontossággal lehet csak megadni a késleltetést, meg ennyi nem számít.)
De ezenkívül pontos?
(#) watt válasza hackerfish hozzászólására (») Dec 24, 2010 /
 
Olvasd el a PIC adatlapjában az utasításokhoz tartozó leírásokat. Ott láthatod, hogy egy-egy utasítás hány órajelcikllust illetve hány programlépést kíván.(A kettő nem ugyanaz, ezt is nézd meg miért van így, az oszcillátor résznél találod az infókat.).
A második feladat pedig az lenne, hogy tanuld meg a szimulátort használni! A kérdéseidre azonnal választ fog adni a Stop Watch!
(#) vilmosd válasza hackerfish hozzászólására (») Dec 24, 2010 /
 
Hali
A MPLAB tartalmaz egy debuggert. Kivalasztani a "Debugger" ful, " Select Tool", "MPLAB SIM" modon lehet. Utana "Debugger" "Settings.." ablakon beallitod az altalad hasznalt orajel frekit, pl: "4 MHz". Mostmar ki tudod valasztani a " StopWatch" stoppert, amiben tudod merni az esemenyek idejet. Pl a Te programodban beteszel egy "Break"-et a "call Delay" sorra, es a kovetkezo sorra, akkor nem kell kivarni a leptetest. "Run" ami majd megall az elso "Break"-nal. lenullazod a stoppert, majd ujra "Run". Most megall a masodik torespontnal, es a stopperben latod a "Delay" idejet. A leptetessel pedig lathatod a port valtozasokat.
Csa Vili
(#) hackerfish válasza vilmosd hozzászólására (») Dec 25, 2010 /
 
Ok, köszi sikerült megmérnem: 1.03... másodperc
Következő: »»   79 / 1210
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