Fórum témák
» Több friss téma |
Ebben a hozzászólásban szinte minden kérdésedre választ találsz. (Arra is, hogy az áramkörök/programok lemásolása csak akkor kivihető, ha a szerzőjük is úgy akarja - azaz nem tiltotta le a program kiolvasását, vagy közzétette a programot).
További linkeket itt találsz. Watt fórumtársunk honlapját is érdemes meglátogatni. Különösen a Gondolatok a PIC kezdésről c. írását ajánlom figyelmedbe. Itt, a Hobbi Elektronikán a kapcsolásoknál a PIC kategóriát nézegesd, valamint a Cikkek szekciót.
Sziasztok! Használt már itt valaki mrf24j40mb-t? Ha igen tudna segíteni nekem, hogy demoboard nélkül, hogyan induljak neki a használatának? Köszi!
Sziasztok, megint én vagyok. Ugyan azt az RGB-ledes villigót csinálom, amit kérdeztem. Működött is, csak tovább fejlesztem, és az nem akar menni.
A probléma timerrel lesz. Olvasgattam fórumokat, meg példaprogikat, hogyan kell csinálni, de nem találtam olyat, ami nekem kell, illetve nem ccs-ben. pic 16f628 Van 4 rgbled,s egy külső 16 mhz-s kristály. RB0 egy nyomógombos interrupt. Felvan húzva 5v-ra egy ellenálláson keresztül, és a kapcsoló földeli. Mivel elfogytak a lábaim, és a belső oszcillátor 4mhz-e kevés, ezért az rb0-t használom olykor kimenetként is. Egy 8as dflipflopra van kötve, amire egy 7 szegmenesen led kijelző. Ez írja ki az effekt számát egy rövid ideig 74ls373 (D-flipflop) Ennek az OE-je folyamatsoan földön van. Enable latch (EL továbbiakban)-je van az RB0-ra kötve, egy inverteren keresztül. Amennyiben RB0-ra megszakítás érkezik, RB0- kimenet lesz, a pic kiküldi a D-flipflopra a kiírandót, engedélyezi az EL-t RB0-lal, így érvényrejut a kimenet, majd elszedi EL-t és az adott effekt száma kiírva marad. Majd a szubrutin elindítja a Timer1-t. Ha a timer 1 letelt, engedéylezi a timeflag-et, ami ugyancsak kimenetté teszi az RB0-t és 0-t küld ki a d-flipflop minden bit-jére. Tehát nullázom a kijelzőt A probléma az, hogy úgy viselkedik, mintha folyton belépne a timer megszakításra, mintha nem lehetne kikapcsolni. A kapcsoló volt már pergésmentesítve is, de úgy sem működik. és mivel jelenleg nincs sok helyem éppen nincs pergésmentesítés beépítve, de szoktam azzal is kipróbálni.
Rájöttem a hibámra. Nem szeretem ezt a ccs-t. Néha olyan dolgokat is megcsinál, amit én nem akarok. Ami leginkább bosszant, hogy piszkálgatja a tris-eket output_x esetén, akkor is ha nem akarom,mert van ami bemenet.
Szia!
A
Köszi
Azthittem a ccs manual sokkalta érthetetlenebb, ezért eszembe se jutott volna hogy beleolvassak. Most azonban látom hogy érdemes itt is keresgélnem legközeleb.
Sziasztok!
Szeretnék MicroC-ben írni egy olyan programot, ami 5-100Hz ig állítható (5hz lépésekben), és a kitöltését is tudom variálni 0-30%ig.(1 vagy 2%os lépésekben) 4 gombbal szeretném állítani, és az eredményt LCD-re kiírni. Hardware-es PWMel szerintem nemlehet ezt megoldani, valahogy software-esen kellene. Esetleg valakinek ötlet rá? eléggé kezdő vagyok ha lehet minnél szájbarágósabban esetleg szemléltetéssel,mintaprogramokkal is jöhet. Idézet: „Szeretnék MicroC-ben írni egy olyan programot, ami 5-100Hz ig állítható (5hz lépésekben), és a kitöltését is tudom variálni 0-30%ig.(1 vagy 2%os lépésekben) 4 gombbal szeretném állítani, és az eredményt LCD-re kiírni.” Szerinted ennek a mondatnak mennyi értelme van? Amúgy pedig a hardveres PWM nagyon is jó erre.
Mit értelmetlen ezen? Esetleg elárulhatnád, hogyan tudom ezt megtenni a hardware-essel, mert rögtön két gondba is ütközök vele, egyrészt a hardware-es pwm minimális frekije(PIC16f876a) 4mhz-es órajel mellett 244Hz. Második, hogy ugye microcben a pwmet PWM1_Init(x)-el hívom meg ahol az x a frekvencia órajele Hz-ben. Namost ezt a PWM_Initet egyszer egy constans értékkel megtudom hívni, és utánna hogyan állítom?
Mert annak a mondatnak konkrétan nincs értelme, mert te egy 5-100Hz-ig állítható PROGRAMOT akarsz írni a mondat szerint.
Pl. csinálsz öt darab 100%-os, majd egy 20%-os, majd négy darab 0%-os kitöltési tényezőjű PWM ciklust, akkor az 24,4Hz-es lesz és 52% eredő kitöltési tényezőjű. Viszont ehhez már nem elég az, hogy PWM1_Init()-et hívsz és hátradőlsz, hanem elő kell venni az adatlapot, megszakítást használni, egyáltalán megérteni a PWM modul működését.
Pont most olvastam az elméletét ennek amit leirtál csak fapadosabban, ez nekem kicsit magas, csak pár napja programozok microcben viszont sürget az idő a problémát meg kell oldanom.... Tehát mondjuk 1Mhz-es órajellel még mehet a PIC, az alá nemszeretnék menni, az akkor minimum 61Hz(10es osztással 6,1hz az már tökéletes). Ha jól értem akkor a 24.4Hz úgy jött ki, hogy a 244Hez alap órajelet 10 ciklusra bontottad, ugy jött ki a 24.4Hz, az 52% pedig szintén ebből hogy 5(x10) bekapcsolás + 0.2(x10) = 54. 10el szórzás a 10ed részre bontás miatt. Ezt eddíg értem, annyit kérlek még próbálj meg elmagyarázni, hogy hogyan tudom minden egyes pwm ciklus elöbb a kitöltés beállítani? Milyen megszakítással kell ezt megoldanom? A pwm postscalejával esetleg? Nagyon kínai még ez nekem de igyekszem. Jah meg persze ha épp nem 10 hanem 15 ciklusra kell bontanom az alap órajelet akkor megint gondom van.....gombokkal ezt kezelni, és ezt még LCDre is írni konvertált formában.... nincs esetleg valami példaprogramod erre?
Amikor egy PWM ciklus véget ér, akkor a Timere megszakítást okoz, és ekkor kell beállítani a kitöltési tényezőjét a következő ciklusba - tehát nem a már folyamatban levőre. Számolni kell a megszakítások számát, és akkor mindig lehet tudni, hogy most épp 100%-os, x%-os vagy 0%-os kitöltési tényezőt kell beállítani. Pl. tized frekvencia kell, akkor fogsz egy segédváltozót (legyen pl. S), amit minden egyes megszakításban növelsz egyel, majd amikor tízre ért, akkor nullázod. Emellett egy másik változóban tárolod, hogy neked most pl. 35%-os kitöltési tényezőre van szükséged, akkor a segédváltozót feltöltöd 3500-ra akkor, amikor az S 10-re ért , majd minden egyes megszakítás alkalmával kivonsz belőle 1000-t, amíg még 1000 vagy afeletti az értéke. Amikor 1000 alatti, akkor ami maradt, azt még direktben beküldöd a PWM kitöltési tényezőjének, majd nullázod a szegédszámlálót, és a 10-ből még hátralevő megszakításoknál mindig nullát adsz be a kitöltési tényezőnek. Érdemes pl. a PR2 regisztert 250-re állítani, hogy kerekebb értékeket kapj, és akkor a kitöltési tényezőt is a fent említett 0 és 999 között tudod állítani, így könnyebb számolni. Vagy pl. van 4.096MHz-es kvarc is, akkor PR2 maradhat 255, csak a kitöltési tényezőnél nem 1000-el, hanem 1024-el kell számolni.
Szóval eljutottam odáig mikroC-ben, hogy megírtam a programom, de szimulálva egy kis gond van vele(software-es debugal szimulálva). A program az elején definiálja a portokat, beállítja a PWM1_Init(20) kezdőértéket(20Hz), és a 0%os kitöltést, utánna pedig a 4 gomb figyelését végzi egy while ciklusban. Ha valamelyik gomb lenyomásra kerül akkor egy változot növelek vagy csökkentek vele(amivel majd állítom a frekvenciát és a pwmet), és elugrok két subrutinra, pwm nyomogomboknál pwm_set-re , freki állításnál freq_setre, ezekben vannak if utasítások, ami ugy néz ki hogy if(feltétel) parancs.egy konkrét példa if(pwm = 20) freq_1 = 20; ahol ugye annak kéne történni hogy ha pwm értéke 20, akkor a freq_1 értékébe 20at tölt.De ehelyett azt csinálja hogy a pwm értékét 20ra állítja. A nyomogombok vizsgálata is if parancsal van megoldva, ott gond nélkül müködik pl. if(PORTB.F0) pwm= 80; . A subrutinomban viszont nem. Van valakinek ötlete miért?
Idézet: Helyesen ezt így kell írni:„if(pwm = 20) freq_1 = 20;”
akkor a gomboknál miért müködik jól, a subrutinban pedig nem? köszönöm a tippet máris kipróbálom!
Idézet: „akkor a gomboknál miért müködik jól?” Gondolom azért, mert ott nem szerepelt a feltételben egyenlőségvizsgálat (==).
if(PORTB.F1) //freq up
{ freq++; if(freq > 22) freq = 22; set_freq(); display_data(); van pl egy ilyen gombvizsgálatom, itt egy második if összehasonlítás és itt működik is. Egyébként kipróbáltam két egyenlőségjellel és ugysem jó Ha esetleg elküldöm a cuccot nem tudnál ránézni mi lehet a hiba? Idézet: Kell is, hogy működjön. A kifogásolt sor is működött volna, ha észreveszed, hogy az "=" jel nem összehasonlítást végez, hanem értékadást, s az "==" jelet használod helyette. „itt egy második if összehasonlítás és itt működik is.” Lásd: BRIAN W. KERNIGHAN – DENNIS M. RITCHIE, A C programozási nyelv
Egy darab egyenlőség jel jelentés: legyen egyenlő. Azaz konstans esetén felveszi a jobboldali értéket.
Két darab egyenlőség jel esetén: Vizsgáld meg, hogy egyenlőek-e? Tehát az első értékadás, a második egy vizsgálat.
Igen megértettem hogy a két egyenlőségjel a vizsgálat, de átírás és újrafordítás után is ugy csinálja, hogy átírja a változómat.(legalábbis a szimuláció azt mutatja) A fordításkor készült asm fájlt azonnal égethetem is a picbe? Cvel kapcsolban még annyit szeretnék kérdezni, hogy a rutinokat a main program elé kell tenni jól értem? (példaprogramnál így láttam) Köszönöm a könyv linket!
Szia!
Az asm fájlt még át kell konvertálnod hex- be.
Sikerült megoldani köszönöm a segítséget! Szerintetek 250kHz-es órajel mellett még rendesen fogom tudni 4bites módban vezérelni az LCD-t?
Sziasztok!
Itt a hétvége és most lenne egy kis időm meg kedvem tanulgatni tovább a PIC programozást... most az AD részhez lenne kedvem, ezért arra gondoltam, hogy egy hőmérőt akarok csinálni LM35-tel... az elképzelés az lenne, hogy veszek egy LM35-öt.. és annak adok 5V-t ugyanis annyi van a próbapanelemen... meg GND-t.. az out-ot meg csak simán rá kell tennem a PIC lábára és ennyi? azaz lényegében a kérdésem arra irányulna, hogy más alkatrész kell e a szenzor és a PIC közé?
Ha jól tudom akkor más alkatrész nem kell a szenzor és a PIC lába közé.
Köszi!
Akkor az lesz, hogy kap 5V-t meg GND-t... aztán a kimenetet meg PIC-re... most csinálom a dual 7 szegmenses kijelző panelt hozzá, hogy valamin ki is tudjam iratni a hőmérsékletet... csak egy gond van már... hogy semmi tutorialt nem találtam ehhez az lm35-höz... pedig azt hittem, ehhez biztos lesz valami, mivel még sosem csináltam AD átalakítást...
Pedig a legjobb barátod talált egypárat! :yes:
Sziasztok!
PIC16F88-al szeretnék vezérelni egy 16x2-es LCD-t. A Microbasic-es példaprogrammal is próbáltam, de nem működik.
A konfigurációra gyanakszom. A hardware biztos jó, mert kipróbáltam 16F628A-val, és működött. Tudna valaki segíteni? Előre is kösz!
Szia!
Máshogy kell a portokat digitálisra kapcsolni: az ANSEL regiszterbe 0 -t kell írni...
Sziasztok!
Valaki rá tudna nézni, hogy nagyjából jó lesz e?
A VDD és a VSS lábak közé köss egy 100 nF-os kerámia (low ESR) kondenzátort! A kvarc két lábára is kellene egy-egy 15-33 pF közötti kondenzátor.
|
Bejelentkezés
Hirdetés |