Fórum témák
» Több friss téma |
Szuper!
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...
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.
Idézet: 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! „Itt mért kell ennyi kód egy kis szünethez?”
Hasznald a TMR1-et IT-vel. 8-as eloosztoval 4 MHz-nel 524 mS az atfordulas.
Idézet: „Itt mért kell ennyi kód egy kis szünethez?” Mert lassú a PC!
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.
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.
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:
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:
Remélem tudtam segíteni.
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?
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.
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...
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.
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.
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
Idézet: Hát ne hagyd benne! Szimulációnál cseréld le rövidebbre. „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.”
Igen, azt csináltam. Az egész SZUN szubrutin pontosvesszővel megjegyzésként van a kódban, csak egy NOP van benne.
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:
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?
Van az __DEBUG, amit az MPLAB sajátmaga állít be attól függően, hogy Debug vagy Release build van kiválasztva.
Idézet: 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. „Van az __DEBUG, amit az MPLAB sajátmaga állít be”
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.
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.
A meghivas igy tortenik:
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
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.
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?
Na így most jónak tűnik. Mobilomon lévő stopperórával méricskéltem.
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?
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!
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
Ok, köszi sikerült megmérnem: 1.03... másodperc
|
Bejelentkezés
Hirdetés |