Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Rendben,értem.Sajnos nekem lényeges lenne ennek kiküszöbölése mivel a kapcsolás tovább lesz fejlesztve,nem csak 8 ledet kell villogtatnia.
Volt hogy hosszan nyomtam a gombot,de akkor átugrott a következő mintára.
Magadnál vagy? Ember!
Idejössz, köszönni sem tudsz, helyesen írni sem,és az irományaidnak is eléggé követelőzős hangvétele van.Sőt azt sem tudjuk, mi a kérdésed.A végén meg benyögöd, hogy "mindenhova kötögettem"
16f84 et sose használtam de úgytudom elég "buta" jószág, de ha van rajta külső megszakítási lehetőség, akkor csak annyi a dolog, hogy a fő rutinban kell egy változó, ennek az értéke függvényében elágazás, a mintákhoz. A külső megszakítás pedig növeli ezt a változót, és nem RETFI utasítással térsz vissza hanem GOTO val ugrassz a mintákat kiválasztó elágazáshoz.
Ebben az esetben nemtudom a STACK hogy fog viselkedni . Ezt majd egy okosabb kollega megmondja. Ha újratervezed a kapcsolást C ben csináld, akkor többet tudok mondani
Értem mire gondolsz,köszönöm. (Ha nagyképű akarnék lenni,akkor mondanám,hogy én is valami hasonlóra gondoltam)
Gyakorlati megvalósítás terén viszont teljesen esélytelen vagyok.C-ben méginkább.
Ha szeretnéd összedobok egy alap programot neked C ben.
Viszont mostmár hivatalosan is felteszem a kérdést a kollegáknak:
Ilyenkor mi törénik a stack-el? Gondolom túlcsordul. Vagy a megszakításra külön stacket használ és semmi? ui: goto utasítást még sose kelett használnom, csak annyi maradt meg, hogy a tanárok belénkverték, hogy sose használhatjuk
Nem hiszem, hogy igy latni fogja-e a cimket. De amugy valoban, ha nem hasznalsz return-t, akkor nyilvan a stack-rol nem fogja leemelni a visszateresi cimet es ezert elobb-utobb tulcsordulas lesz (nemcsak interrupt-bol de akarmilyen fuggvenybol). Azonban interrupt-nal nem return-t, hanem retfie-t hasznalnak aminek meg egy funkcioja van: ujra engedelyezni az interruptot. Ha ez nem tortenik meg akkor nem lesz kovetkezo interrupt nyilvan valoan...
[OFF] Amugy a tanarok vs. goto: A goto jo! Ez csak egy tevedes, hogy az nem jo. A tevedes pedig abbol adodik, hogy anno matematikailag bebizonyitottak, hogy goto nelkul is minden problemat le lehet vezetni. Es mivel a goto-val lehet nem strukturalt modon programozni ezert azzal eleg kesze-kusza, atlathatatlan kodot lehet generalni -- ezert kerulendo. Csak, hogy anno az ilyen goto-s kesze-kusza programokat tuzzel-vassal kellett irtani. Namost, ha bele gondolsz, nemcsak a goto goto... Pl a return is es a break is az! Ezek is ugyanugy strukturalatlan modszerek. Sot bizonyos ertelemben a fuggveny pointerek is azok. Es ezeket pedig mindenki siman hasznalja, bele sem gondolnak, hogy mit csinalnak, es kozben melluket verve hangoztatjak a goto ellenes jelszavaikat. A Linux kernel amugy tele van goto-val a hibakezeles miatt, es emiatt lehet ennyire gyors es hatekony. Windows meg egyenesen patchelgeti a processzeket, tehat meg rosszabb, mint a sima goto -- de csak igy tudtak gyorsra megcsinalni.
Köszönöm a felajánlást! A gond csak annyi,hogy ebben a programban tetszőlegesen tudom változtatni a villogási mintákat,mivel a forráskódban az egyes ledek állapota 1-gyel vagy 0-val van megadva.Ez így nekem nagyon kényelmes mivel a programozáshoz nem értek,de vizuálisan látom a mintát gyakorlatilag.
Tehát egy újból,más nyelven megírt programban nem tudom,hogy lehetne-e így ezt módosítani,illetve megéri-e egyáltalán a megszakítás miatt új progit írni rá. Csak ezt kellene megoldani hogy bármikor lehessen a következő mintára léptetni,és ne kelljen az adott minta lefutását végigvárni.
Éreztem, hogy több sebből vérezni fog a dolog.
Köszönöm a fejtágítást. Ezen a példán okulva viszont már szerintem is kerülendő. Ha valaki profin programoz bizonyára hasznosan tudja használni, de a stackelés miatt igen sok problémát is tud okozni, alacsony szintű nyelveknél persze folyamatosan használjuk a ugróutasításokat, de magasszinten nagyon sok kellemetlenséget okozhat az előző példa Teljesen igazad van a break és return is sima goto, bele se gondolunk, de a return legalább kiolvassa a stacket, a break pedig nem ugrik ki a subrutinból, ezáltal hibát se okoz benne
Megpróbálok valamit alakítani, asm be is "tudogatok" programozni (élméletben)
[OFF]Na jo, csak a break es a return sem biztos, hogy minden esetben jo am!
Pl. return-t hasznalsz egy fuggvenybol torteno kilepesre tobb helyen is. Rogton felmerul a kerdes, hogy mielott kileptel valoban minden dolgot felszabaditottal-e amit a fuggvneny elejen ill. mindenesetre a return elott lefoglaltal? Ezert szoktak egyetlen kilepesi pontot megadni es oda inkabb el goto-znak (ilyen szempontbol biztonsagosabb). Vagy break-et hasznalsz egy beagyazott ciklusban, kozben modositasz valamit, a ciklust atirod feltetelre, es a break benne marad -- ekkor a break a magasabb szinten levo ciklusbol fog kilepni, es butasagot csinal a program, es nem erted miert... Vagy eszre sem veszed, mert evente csak 1x lesz olyan feltetel mikor ez bekovetkezik... Felhasznalo meg nez miert allt meg a lift felemeleten... Es van mikor a break elkerulhetetlen, sot fuggvenyek kozott kell ugralni! Pl. 18F-nel van hiba az interruptok automatikus kontextus mentesenel, ezert bele kell rakni egy goto-t... Vagy bootloadert csinalsz... Vagy RTOS-t fejlesztesz es kell a taszkvaltashoz... Es akkor meg nem is beszeltem a setjmp/longjmp-rol (az is goto)
Nem tudtam vele mit kezdeni a túlsok call miatt... viszont nem bírtam magammal és megírtam C ben. Pár sor az egész és úgy szerkeztettem, hogy lazán át tudod írni, felkommenteztem amit módosítani kell.
Ha lövésed sincs a C ról akkor is lazán belepiszkálsz. Üdv
Majd rájövök ha odáig jutottam, hogy mégsem lehet élni nélküle. Eddig sikerult megúszni. Amikor elkezdtem programozni eleinte a cím aritmerikát se fogtam fel, hogy mi értelme van, most már élni nem tudnék nélküle. Mindennek eljön az ideje.
Köszönöm,hogy fáradtál vele.Nagyjából működik.
Annyi,hogy a másik progiban a villogás sorai között is lehetett időintervallumot megadni,de gondolom ez kivitelezhető még.(elég bonyolult mintákat szeretnék csinálni) A másik,hogy az MPLAB fordításnál hibákat ír ki így hiába módosítok bele,nem tudok belőle hex-et csinálni. Még egy kérdés: a gomb pergése alatt mit értesz?
Hi tech C vel fordítod?
Project->buld options->project es ott a language default gombot megnyomod akkor az talán segít azon ha valami file-t nem talál. A gomb pergése az egy átmeneti jelenség ami a mechanikus kapcsolóknál jelentkezik. Pár ms-ig összevissza kapcsolgat 0 és 1 között. A késleltetés ezt küszöböli ki. Ha eltérő késleltetést akarsz a minták között, azzal megint az lesz a baj mint az eredetinél, hogy akkor meg kell várni, hogy végigfusson, vagy interruptot kell alkalmazni, amit ez a PIC nem tud sajnos.
Érdekes problémám van:
Írtam egy programot PIC18F2520-ra, amely egyenlőre egy LED-et villogtat megszakításból. TMR0 úgy van beállítva, hogy 0,1 másodpercenként túlcsorduljon és ezzel megszakítást generáljon. A megszakításban egy regiszter értékéhez mindig hozzáad 1-et és vizsgálja, hogy ennek a regiszternek az értéke egyenlő-e egy másik (konstanst tartalmazó) regiszter értékével. Ettől függően kapcsolja ki-be a LED-et. De nem is ez a lényeg... A főprogramban próbálok egy 2x16-os LCD-t vezérelni. Ha a "call LCD_inicializalas" sort beírom, akkor a LED amit a megszakításból villogtatok, folyamatosan világít! Ha kikommentelem az LCD inicializálásának meghívását, majd így égetem bele a programot a PIC-be, akkor érdekes módon még mindig világít folyamatosan a LED! Pedig a programkód így ugyan az mint az előbb amikor még jó volt... Ha a PICkit2-t lehúzom az áramkörről és rádugom újra, akkor már jó és újra villog a LED. Itt van a program (ebben a formában működik):
Nem néztem meg a programodat, de valószínűleg a megszakítás "megszakítja" az LCD-re történő kiírást is és esetleg mást is kirak--> ezt nem lehet akármikor --> tiltsd le!
Steve
Szia!
T0bb baj is van ezzel a programmal: - LCD init a LATC-be írja a peállító parancsokat, az LCD pedig a RA3..0-n várja. - Az első paranccsal 4 bitesre állítod a kommunikációt, a többi parancsot két részletben kell elküldeni. - A motor bit figyelése és állítása máshol történik. A MOTOR - LATB,4 -gyel állítod, de PORTC,4 -gyel figyeled. - a goto $ -ba a főprogram belefagy, csak a megszakítási rutin fog lefutni a kérésekre. Szia Idézet: „a goto $ -ba a főprogram belefagy, csak a megszakítási rutin fog lefutni a kérésekre.” Tudom, pontosan ez volt a célom! Idézet: „LCD init a LATC-be írja a peállító parancsokat, az LCD pedig a RA3..0-n várja.” Valóban, rosszul definiáltam az elején... Idézet: „- Az első paranccsal 4 bitesre állítod a kommunikációt, a többi parancsot két részletben kell elküldeni.” Úgy küldöm! Ez a szubrutin egyébként működött egy másik PIC-el egy másik áramkörben szóval biztos jó. Idézet: „- A motor bit figyelése és állítása máshol történik. A MOTOR - LATB,4 -gyel állítod, de PORTC,4 -gyel figyeled.” Tényleg... köszi! Idézet: „Found PICkit 2 - Operating System Version 2.32.0 Target power not detected - Powering from PICkit 2 ( 5.00V) PKWarn0003: Unexpected device ID: Please verify that a PIC18F2520 is correctly installed in the application. (Expected ID = 0x1100, ID Read = 0x0) PK2Error0049: VPP Voltage error. Check target and retry operation. PICkit 2 Ready” Hmm? Eddig jó volt minden.
Pickit 2 Program->Tools->Troubleshoot. De biztos csak konktaktos valami.
Miért nem tudom kiírni az A-betűt a kijelzőre? Ugyan ez a rutin a 18F4520-as PIC-en a másik áramkörben működött! Most semmit nem csinál a kijelző, még csak kétsoros módba se vált át (mert a kontrasztot állítva csak a felső sor látszik), nem hogy szöveget írna ki.
Szerk.: Ja valószínűleg azért, mert 4,08V a tápfeszültség...
Szia!
Az LCD init még mindig a LATC-be ír!! Szia
Szia!
De az miért baj? A C portra van kötve az LCD modul! (Bár tényleg valami hiba lehet, mert kereken 5V-os tápfeszültséggel sem ír ki semmit...)
Szia!
Bocsánt, most látom, hogy az adatbiteket elvitted a A portról a C-re. A kíírásnál a BSF EN és a BCF EN egymást követik, nincs elég ideig fent az EN. Vajon mindig kivárod-e a parancs végrehajtását? Szia
Mondom, ez a rutin így ahogy van működött ugyan ezzel az LCD modullal a 18f4520-on, ugyan ekkora órajellel.
De most nem értem, valamiért nem konfigurálja az LCD-t. Egyáltalán nem csinál ugyanis az LCD semmit, csak a felső sor összes pixele világít kicsit a kontraszt miatt. Szóval még csak a kétsoros mód bekapcsolása sem sikerült, hiszen akkor egyforma lenne a kontrasztja a két sornak. Meg hát persze ki kellene írnia egy A-betűt.
A megszakítást már az init alatt engedélyezed? Lehet, hogy nem tetszik neki, ha igen. Próbáld letiltani addig.
Szia!
Most jut eszembe, hogy így jártam az LCM3-mal, ott a D6 nem ment át az LCD-re... Mérd meg az összes vezetéket a pic-től az LCD panel forrpontjára. Szia
Szia!
Nekem is ez volt az első gondoltatom, de nem! Az RS és az EN lábai a PORTC-re voltak definiálva, valójában viszont a PORTA-ra kötöttem őket. Nektek pedig a kapcsolási rajzot nem is mutattam, szóval ezt nem tudhattátok. Bocsi! Most már tudok kiírni szöveget, csak kár hogy a PICkit2 nem tud akkora feszültséget adni, hogy működjön az LCD.
Gyári pickit2? Nekem a PIC+LCD (4x20 led háttérrel)+pici egyenáramú motor-t simán vitte.
|
Bejelentkezés
Hirdetés |