Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   654 / 1320
(#) Tonsil válasza icserny hozzászólására (») Jan 27, 2010 /
 
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.
(#) Mate78 válasza Mike30 hozzászólására (») Jan 27, 2010 /
 
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"
(#) Stefan válasza Tonsil hozzászólására (») Jan 27, 2010 /
 
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
(#) Tonsil válasza Stefan hozzászólására (») Jan 27, 2010 /
 
É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.
(#) Stefan válasza Tonsil hozzászólására (») Jan 27, 2010 /
 
Ha szeretnéd összedobok egy alap programot neked C ben.

Viszont mostmár hivatalosan is felteszem a kérdést a kollegáknak:
  1. void interrupt(void){
  2. .............
  3. goto xy;
  4. }
  5.  
  6. void main(void){
  7. xy:
  8. ........
  9. while(1){
  10. .......
  11. }}

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
(#) trudnai válasza Stefan hozzászólására (») Jan 27, 2010 /
 
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.
(#) Tonsil válasza Stefan hozzászólására (») Jan 27, 2010 /
 
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.
(#) Stefan válasza trudnai hozzászólására (») Jan 27, 2010 /
 
É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
(#) Stefan válasza Tonsil hozzászólására (») Jan 27, 2010 /
 
Megpróbálok valamit alakítani, asm be is "tudogatok" programozni (élméletben)
(#) trudnai válasza Stefan hozzászólására (») Jan 28, 2010 /
 
[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)
(#) Stefan válasza Tonsil hozzászólására (») Jan 28, 2010 /
 
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

ledes.zip
    
(#) Stefan válasza trudnai hozzászólására (») Jan 28, 2010 /
 
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.
(#) Tonsil válasza Stefan hozzászólására (») Jan 28, 2010 /
 
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?
(#) Stefan válasza Tonsil hozzászólására (») Jan 28, 2010 /
 
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.
(#) Attila86 hozzászólása Jan 28, 2010 /
 
É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):

Laminalo2.asm
    
(#) kissi válasza Attila86 hozzászólására (») Jan 28, 2010 /
 
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
(#) Hp41C válasza Attila86 hozzászólására (») Jan 28, 2010 / 1
 
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
(#) Attila86 válasza Hp41C hozzászólására (») Jan 28, 2010 /
 
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!
(#) Attila86 hozzászólása Jan 28, 2010 /
 
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.
(#) Stefan válasza Attila86 hozzászólására (») Jan 28, 2010 / 1
 
Pickit 2 Program->Tools->Troubleshoot. De biztos csak konktaktos valami.
(#) Attila86 válasza Stefan hozzászólására (») Jan 28, 2010 /
 
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...

Laminalo2.asm
    
(#) Hp41C válasza Attila86 hozzászólására (») Jan 28, 2010 /
 
Szia!

Az LCD init még mindig a LATC-be ír!!

Szia
(#) Attila86 válasza Hp41C hozzászólására (») Jan 28, 2010 /
 
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...)
(#) Hp41C válasza Attila86 hozzászólására (») Jan 28, 2010 /
 
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
(#) Attila86 válasza Hp41C hozzászólására (») Jan 28, 2010 /
 
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.
(#) watt válasza Attila86 hozzászólására (») Jan 28, 2010 /
 
A megszakítást már az init alatt engedélyezed? Lehet, hogy nem tetszik neki, ha igen. Próbáld letiltani addig.
(#) Hp41C válasza Attila86 hozzászólására (») Jan 28, 2010 /
 
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
(#) Attila86 válasza Hp41C hozzászólására (») Jan 28, 2010 /
 
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.
(#) vicsys válasza Attila86 hozzászólására (») Jan 28, 2010 /
 
Gyári pickit2? Nekem a PIC+LCD (4x20 led háttérrel)+pici egyenáramú motor-t simán vitte.
(#) Attila86 válasza vicsys hozzászólására (») Jan 28, 2010 /
 
Gyári, igen.
Következő: »»   654 / 1320
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