Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   72 / 1207
(#) icserny válasza LGS94 hozzászólására (») Aug 23, 2010 /
 
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.
(#) buszkiraly hozzászólása Aug 25, 2010 /
 
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!
(#) chaos89 hozzászólása Aug 25, 2010 /
 
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.

ledek.c
    
(#) chaos89 válasza chaos89 hozzászólására (») Aug 25, 2010 /
 
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.
(#) El_Pinyo válasza chaos89 hozzászólására (») Aug 25, 2010 /
 
Szia!
A
  1. #USE FAST_IO(port)
preprocesszor direktíva segítségével kiküszöbölhető az említett hiba. Lásd: Reference Manual
(#) chaos89 válasza El_Pinyo hozzászólására (») Aug 25, 2010 /
 
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.
(#) proksa1 hozzászólása Aug 28, 2010 /
 
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.
(#) potyo válasza proksa1 hozzászólására (») Aug 28, 2010 /
 
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.
(#) proksa1 válasza potyo hozzászólására (») Aug 28, 2010 /
 
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?
(#) potyo válasza proksa1 hozzászólására (») Aug 28, 2010 /
 
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.
(#) proksa1 válasza potyo hozzászólására (») Aug 28, 2010 /
 
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?
(#) potyo válasza proksa1 hozzászólására (») Aug 28, 2010 /
 
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.
(#) proksa1 válasza potyo hozzászólására (») Szept 3, 2010 /
 
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?
(#) icserny válasza proksa1 hozzászólására (») Szept 3, 2010 /
 
Idézet:
„if(pwm = 20) freq_1 = 20;”
Helyesen ezt így kell írni:
  1. if(pwm == 20) freq_1 = 20;
Ne keverjük össze az értékadás és az összehasonlítás jelét!
(#) proksa1 válasza icserny hozzászólására (») Szept 3, 2010 /
 
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!
(#) icserny válasza proksa1 hozzászólására (») Szept 3, 2010 /
 
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 (==).
  1. if(PORTB.F0) pwm= 80;
(#) proksa1 válasza icserny hozzászólására (») Szept 3, 2010 /
 
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?
(#) icserny válasza proksa1 hozzászólására (») Szept 4, 2010 /
 
Idézet:
„itt egy második if összehasonlítás és itt működik is.”
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.

Lásd: BRIAN W. KERNIGHAN – DENNIS M. RITCHIE, A C programozási nyelv
(#) vicsys válasza proksa1 hozzászólására (») Szept 4, 2010 /
 
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.
(#) proksa1 válasza vicsys hozzászólására (») Szept 4, 2010 /
 
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!
(#) mate_x válasza proksa1 hozzászólására (») Szept 4, 2010 /
 
Szia!

Az asm fájlt még át kell konvertálnod hex- be.
(#) proksa1 válasza mate_x hozzászólására (») Szept 6, 2010 /
 
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?
(#) r3pl4y hozzászólása Szept 11, 2010 /
 
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é?
(#) edison14 válasza r3pl4y hozzászólására (») Szept 11, 2010 /
 
Ha jól tudom akkor más alkatrész nem kell a szenzor és a PIC lába közé.
(#) r3pl4y válasza edison14 hozzászólására (») Szept 11, 2010 /
 
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...
(#) Taki33 válasza r3pl4y hozzászólására (») Szept 11, 2010 /
 
Pedig a legjobb barátod talált egypárat! :yes:
(#) dtocy hozzászólása Szept 12, 2010 /
 
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.
  1. program Lcd_default_test
  2. dim text as char[16]
  3.  
  4. main:
  5.   TRISB = 0                   ' PORTB is output
  6.   Lcd_Init(PORTB)             ' Initialize LCD on PORTB
  7.   Lcd_Cmd(Lcd_CURSOR_OFF)     ' Turn off cursor
  8.   text = "mikroElektronika"
  9.   Lcd_Out(1, 1, text)         ' Print text at LCD
  10. end.

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!
(#) Hp41C válasza dtocy hozzászólására (») Szept 12, 2010 /
 
Szia!

Máshogy kell a portokat digitálisra kapcsolni: az ANSEL regiszterbe 0 -t kell írni...
(#) Auf hozzászólása Szept 20, 2010 /
 
Sziasztok!
Valaki rá tudna nézni, hogy nagyjából jó lesz e?
(#) icserny válasza Auf hozzászólására (») Szept 20, 2010 /
 
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.
Következő: »»   72 / 1207
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