Fórum témák
» Több friss téma |
Hali
Itt egy mintaprogram a Timer1 IT-s kezelesere. Nagyjabol fel van kommentezve. 4 MHz kvarcra.
Ott a kesz mintaprogram. Termeszetesen a TMR1 also es felso byte-jat is fel kell tolteni. Az OPTION regiszternek semmi koze a TMR1-hez. Adatlap!!
Oké, köszi átnézem, és megpróbálom beépíteni az órába. Vagy inkább az órát építsem bele ebbe?
Inkabb
Hali
Itt egy kicsit bovitett valtozat, itt mar inkrementalja a percet, es az orat is.
Gondolom a STATUS_TEMP és a W_TEMP változók itt is mentésre valók. De hol van maga a mentés, és a visszaállítás? Nem az Inter-en belül kellene lenniük?
Ott kellene legyen, az adatlapban benne van pontosan hogyan kell menteni, mert nem mindegy milyen utasítást használsz.
Ezt sikerült összehoznom valamit.
Még nem teljesen jó, mert túl gyors, de keresem a hibát... Legalább elindult -> működik a timer, fél siker!
A mentésed nem jó az adatlap szerint.
MOVWF SAVEW ;Mentések SWAPF STATUS, W CLRF STATUS MOVWF SAVES MOVF PCLATH, W MOVWF SAVEP CLRF PCLATH MOVF SAVEP, W ;Visszaállítás MOVWF PCLATH SWAPF SAVES, W MOVWF STATUS SWAPF SAVEW, F SWAPF SAVEW, W
Javítottam, de még mindíg bazi gyorsan villog. Valamit elszúrtam. De mit?
Nem tudom milyen értéket akartál beállítani, de a megszakításod az 10 msecundomonként van. Ha 4 MHz az órajeled.
Hát mondjuk 1 másodperc jó lenne
Mit kell átállítani, az 15542-et, vagy az it_cnt vagy valami mást? Már vagy 2 napja vacakolok ezzel az órával, kezdek belekavarodni Végülis a lényeg az lenne, hogy TIMER1-el csináljak egy olyan megszakítást, ami másodpercenként végrehajtja a NOVEL szubrutint.
A timer1 előosztójával tudsz még állítani rajta.
Ok, megnéztem: T1CON-ban lehet állítani, TICKPS0-val és TICKPS1-el. Most 1:1-en van. Lehet 1:1, 1:2, 1:4, 1:8. Ezek közül melyik legyen?
És ebből most hogy lesz 1 másodperc?
Beállítasz egy olyan értéket aminek a többszöröse pontosan 1 sec. Egy változó értékét növeled minden megszakításkor. Ha a megszakítások közötti idő x változó értéke=1 sec akkor léptetsz a másodpercen.
De akkor most az előosztót melyik értékre állítsam be?
És a változót meddig növelem? Hánynál kell nullzni?
Így jó lesz a megszakítás rész?
Azt ki kell számolni. A változó amit növelsz ha egy bájtos akkor ugye nem lehet több mint 255. az 1 secundumot elosztod 255-el. Ami értéket kapsz annál csak nagyobb lehet a megszakítások közötti idő, hogy állítani is lehessen a pontosságon.
Ha a pic 4 MHz-en jár az órajeled 1MHz. Ebből kiszámolod az adott osztási aránnyal milyen idő jön ki a megszakításokra. Amelyik a legjobban megfelel az előző számításhoz azt használod. A timer1 kezdőértékével tudsz pontosítani.
1sec=1000millisec
1000/255=3,921568627 És ezzel most mit csináljak? "Ebből kiszámolod az adott osztási aránnyal milyen idő jön ki a megszakításokra." Hogyan?
Hali
Ahogy en megcsinaltam, miert nem volt jo? Tulbonyolitod az egesz dolgot. A megszakitas ugy ahogy volt jo volt. Nem szabad a megszakitas torzsebe millio dolgot csinalni. Nem kell a tartalom mentes sem, mert nem valtoztatunk az IT alatt semmit. Nalam csak bebillentettem a "tick" jelzobitet, es utana a foprogramban ellenoriztem. Amennyiben volt jelzobit elvegeztem a megfelelo muveletet. Amit masodszor kuldtem probald ki szimulatorban. Az pontosan 1 sec alatt noveli a second valtozot, es bele van epitve a min, es az ora. Onnan mar csak a kijelzes megvalositasa, es az allitast kell megoldani. Probald meg inkabb az en programombol kialakitani a mukodo programot.
Eredetileg azzal próbálkoztam, az elsővel, mert nekem csak a másodperc növelése kell, de túl gyors volt, persze lehet, hogy én rontottam el valamit.
Na fussunk neki mégegyszer... tmr1.asm, amit másodszor küldtél: Ha ehelyett beírom, hogy "call NOVEL", úgy jó lesz? incf second,f ;increment second cntr
Itt az egész fájl.
Ez így már egész normálisan működik. Csak egy kicsit mintha sietne.
Hali
Nem tudom mit csinal a novel, de csak a foprogramban hivd meg, az IT-bol ne. Az IT rutin igy jo ahogy van. Amit masodszor kuldtem az noveli a percet, es az orat is. azt forditsd le valtozatlanul, es futtasd a szimulatorban. Nekem 4 MHz orajelnel pontosan 1 masodperc alatt noveli a second valtozot, de ha beteszem a "Break"-ot a 82. sorba a stopper pontosan 60 secondot mutat a ket "incf min" kozott. Azt nem ertem, ha Te orat akarsz csinalni, akkor miert nem jo igy ahogy en irtam? Ez az egyszeru program megy 23:59:59-ig, majd 00:00:00 oratol fojtatja. Mar csak a kijelzest kellene hozza varialni, es kesz.
A KIIR1 a kiírás, a NOVEL meg növeli az időt 1 másodperccel, és vizsgálja, hogy hol kell nullázni, és növelni a következőt. Elvileg ugyanaz, mint amit küldtél. Nálam a Loop résznek a KIIR felel meg.
És ha a saját NOVEl-emet használom, az óra/perc/másodperc számjegyei megmaradnak külön, pl.: MPERC1 = másodperc egyes helyiérték, MPERC10 = másodperc tízes helyiérték. Így a kiírásnál nem kell még ezzel is vacakolni. De van más is: az óán vannak apró, alig észrevehető felvillanások, amiknek nem kellene ottlenniük. Ez mitől lehet? Átnéznéd azt a kódot, amit utoljára küldtem, hogy jó -e?
Hali
Forditva gondolkodsz. Egy oranal a legfontosabb, hogy az digit szamlalasokat minel gyorsabban elvegezd. A kiirasra es a tobbi csicsa-micsara kesobb van ido. Te feldaraboltad a szamokat helyertekre. Ez is megoldas, de ha megnezed az en megoldasomat, sokkal kevesebb utasitasbol van a teljes ora. Viszont a kiiras meg hatra van. De az nem annyira nehez feladat. Azt is lehet szinkronizalni a "second" noveleshez. Ja es van egy egyszeru megoldas a kiirasra: a "bin2bcd2" a varazsszo. A meglevo binaris szamodat atalakitod pakolt BCD-re, ahol 8 biten az also 4 bit az "egyes" helyertek, a felso 4 a "tizes". A piclistes linken talasz sok ilyen konverzios rutint. Ja meg valami : lehetoleg minel kevesebb valtozot hasznalj. A 0x70-0x7F tartomanyba csak 16 valtozot tudsz berakni.
Jó, akkor megpróbálok a te kódodhoz írni egy kiírást.
Az errorlevel rész mire jó?
Idézet: MPLAB help mit mond? „Az errorlevel rész mire jó?”
Idézet: „Ez is megoldas, de ha megnezed az en megoldasomat, sokkal kevesebb utasitasbol van a teljes ora” Emiatt volt pontatlan, amikor belraktam az én növelőmet, és kiírómat a te kódodba? De ennek elvileg nem kellene hatnia a megszakításra nem? Mármint pont az lenne a lényeg, hogy ne nekem kelljen időzítgetnem a kódot, hanem a megszakítás tudja, hogy mikor hívódjon meg... vagy nem?
És mi van, ha a jelzőbit visszabillen, mire a progi eljut a vizsgálathoz, és a növeléshez? Ez akkor nem történhet meg, ha a növelés is a megszakításban van, és a progiban csak a kiírás marad nem?
És valami tényleg nem stimmel a te kódoddal, mert olyan ledek is felvillannak néha egy nagyon rövid időre, amiknek nem kellene. Még mindig nem tudom miért.
Hali
Az IT az tudja adolgat, es biztosan( na nem egeszen) azonos idonkent fog lefutni. Utana rogton egy rovid kodban inkrementaljuk a szukseges valtozokat. Igy nem viszunk bele plusz hibat. Amikor keszen vannak a valtoztatasok, gondolhatunk a kijelzesre. Mindig nezni kell a muveletek prioritasat! Itt mi a legfontosabb? Az idozites. Tehat eloszor ezzel foglalkozzunk. A kijelzes, gombkezeles, egyeb dolgok raernek kesobb, ha marad idonk (marad elegendo). Ajanlom meg egy jelzobit hasznalatat: ha van valahol valtozas, csak akkor iratjuk ki a kijelzest. Igy nem kell allandoan ezzel foglalkozni, csak ha szukseges. |
Bejelentkezés
Hirdetés |