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   560 / 1210
(#) kissi válasza don_peter hozzászólására (») Aug 27, 2014 /
 
Ott csak assembly-t használtam eddig ( 12-16-os családok ) !
(#) don_peter válasza kissi hozzászólására (») Aug 27, 2014 /
 
Aham értem. Köszi..

Közben eszembe jutott egy másik dolog.
Nézegettem pár áramkört és valahol a VUSB lábat elektrolit valahol pedig kerámia kondival kötik le testre..
Melyiket és milyen értékűt célszerű használnom? (470nF-ot látok legtöbb esetben)
Jelenleg egy 18F4550-en dolgozom..
A hozzászólás módosítva: Aug 27, 2014
(#) kissi válasza don_peter hozzászólására (») Aug 27, 2014 /
 
Az adatlapban benne van az érték, én ahol lehet, ott nem elkót használok ( SMD 100 nF-osokból szoktam berakni, mert az van sok ! ) .
(#) gustaw válasza ktamas66 hozzászólására (») Aug 27, 2014 /
 
Csak összejött! Köszi mindenkinek a segítséget! Bár még csak egy digitet írattam ki, már látom a lényeget.
(#) usane válasza sprofan hozzászólására (») Aug 27, 2014 / 1
 
Úgy ahogy írod. Csak bemenet lehet. Felhúzod tápra és kikapcsolod a programban a MCLR funkciót ha be van kapcsolva. Működik, semmi baj vele. Én is csináltam már 628A-val.
(#) icserny válasza DJozso hozzászólására (») Aug 28, 2014 /
 
  1. void interrupt(void){
  2.     if (INTCON.RBIF == 1){
  3.        PORTD.B2 = 0;
  4.        Delay_ms(10000);
  5.        INTCON.RBIF = 0;
  6.     }
  7. }


Nem tudom, hogy mit akartál csinálni, de megszakításban nem szabad várakozni, mert akkor addig leáll minden! A megszakítás elve az, hogy ha bekövetkezik valami esemény, ami gyors kiszolgálást igényel, akkor megszakítjuk a főprogramot, villámgyorsan lekezeljük az eseményt és visszatérünk a főprogramhoz.
(#) DJozso válasza don_peter hozzászólására (») Aug 28, 2014 /
 
Köszönöm a segítséget, rendesen megépített áramkörön probálgatom. A szoftvereim: MicroC for PIC-el írom a kódot, ez fordítja hexre is.A hex filét a jó öreg MPlab irja a PIC-be, egy PICKIT 3 klónnal. "Illetve lehet működőik is a program, csak a megszakításod gyors.." 10s-os várakozási idővel nem veszem észre? Hisz elöször kikapcsolja a kimenetet, majd vâr 10s-et, vagyis 10s-ig sötét a led, nem igy van?Miért kell várni a nyomógomb lenyomásának végéig? Gondolom , hogy ne okozzon ujabb interruptot nem? De, ha az első interrupt jel után nem jut el a program a [code=c]INTCON.RBIF = 0;[ /code] sorig, akkor nem tud az ujabb jel interruptot kiváltani?Tévedek?Kezdek kicsit összezavarodni... Esetleg valami help?
A hozzászólás módosítva: Aug 28, 2014
(#) don_peter válasza DJozso hozzászólására (») Aug 28, 2014 / 1
 
Pár dolgot másként csinálnék a helyedben.
1. ne ugyan azt a LED-et akard kapcsolni interrupt-ban mert lehet olyan gyorsan lefut, hogy a változás alig vagy egyáltalán nem észrevehető.
2. A másik amit icserny is mondott, hogy az interrupt lényege a gyors kiszolgálás.
Oké, hogy ez csak teszt, de akkor úgy csináld, hogy jobban észrevehető legyen.

Tehát a megszakításba tegyél egy másik lábat (BIT-et) amelyen egy másik LED van így, ha az felvillan vagy világítani kezd akkor működik a megszakítás.
Itt is érdemes ezt használni: (invert)
  1. PORTD.B4 = !PORTD.B4 = 0; //Egy másik láb

Így ha újabb megszakítást kérsz akkor mindig az invertet fogja vissza adni eredményként.
Tehát, ha nem világít a LED akkor világítani fog és így ordítva..

A while(gomb); sorral megakadályozod, hogy több megszakításod legyen egymás után, más szóval pergésmentesítő.
Esetleg debugolni próbáltál már?
(#) ktamas66 válasza DJozso hozzászólására (») Aug 28, 2014 / 1
 
Nem tudom a megszakítást miként gondoltad, de ha csak simán az INT/RB0 megszakítást szeretnéd használni, az az INTE/INTF biteken kezelhető, és az OPTION_REG-ben állítható, hogy melyik élre. Ha viszont az IOC jellegűt (RBIF), akkor ott több regisztert is állítani kell (IOCB). Esetleg érdemes végiggondolni a WPUB (felhúzó ellenállások) beállítását, mivel nem látjuk pontosan hogyan is kapja a jelet .
(#) nagym6 hozzászólása Aug 28, 2014 /
 
Üdv. Segítséget kérnék. Pic18F46K22 -nél nem tudom a belső oszcillátor beállítást kihámozni a leírásból. Internal 8Mhz osszci kellene PLL 4 szorzóval, azaz 32MHz órajelet szeretnék. És még -más esetben- 16MHz PLL nélkül.
Annyit sikerült, hogy égetésnél a "CONFIG1H" -ba az "Internal oscillator block" legyen választva, de a belső osszcillátor beállítását az "OSCCON" regiszterben nem lehet konfigurálásnál megadni. Ezt menet közben programból kell beírni? De akkor hogyan indul, amíg oda nem ér, hogy program beállítja.
Köszönöm a segítséget.
(#) ktamas66 válasza nagym6 hozzászólására (») Aug 28, 2014 /
 
Úgy látom alapértelmezésben 1MHz-en indul. Az átállítást a programból adod meg, ahogy a PLL bekapcsolását is.
(#) don_peter válasza DJozso hozzászólására (») Aug 28, 2014 / 1
 
Gyorsan összedobtam egy tesztet.
HI-Tech fordítóban és MPLAB-ban.

Behelyettesíteni be tudod, utána már finomíthatsz rajta ahol akarsz.
  1. #include <htc.h>
  2.  
  3. extern interrupt isr(void){
  4.         if (INTF == 1){
  5.                 while(RB0);
  6.                 RB2 = 0;
  7.                 RB3 = 1;
  8.                 __delay_ms(1000);
  9.         }
  10.         RB3 = 0;
  11.         INTF = 0;
  12. }
  13.  
  14. void main() {
  15.         ANSEL  = 0;
  16.         ANSELH = 0;
  17.         TRISA = 0; PORTA = 0;
  18.         TRISB = 1; PORTB = 0;
  19.         TRISC = 0; PORTC = 0;
  20.         TRISD = 0; PORTD = 0;
  21.         TRISE = 0; PORTE = 0;
  22.        
  23.         PEIE = 1;
  24.         GIE  = 1;
  25.         //RBIF = 0;
  26.         //RBIE = 1;
  27.         INTE = 1;
  28.         INTF = 0;
  29.        
  30.         while(1){
  31.                 RB2 = !RB2;
  32.         __delay_ms(200);
  33.         }
  34. }

Remélem tudtam segíteni
(#) icserny válasza don_peter hozzászólására (») Aug 28, 2014 /
 
Megszakításba ne rakjunk már se végtelen ciklust (while) se másodperces nagyságú késleltetést!
(#) DJozso válasza don_peter hozzászólására (») Aug 28, 2014 /
 
Köszönöm szépen mindenkinek a fáradozásait. Mindig tanul az ember valami újat, most pl. a kimenet invertálást. Nézem a programod, és azt fedezem fel, hogy ez nem teljesen azonos az én C nyelvemmel. Ez a Hi-Tech sajátossága? Érthető, mit csinálsz, csak egy kicsit nekem újoncként még gondolkodni kellett rajta. Tudom, az én tudásom a hiányos, de igyekszem minden infót magamba szívni, de sokszor nem egyszerű. Például a progidban miben más a "extern interrupt" , mint az enyémben a void interrupt? Így megadható, hogy külső interruptot szeretnék? Vagy a tied nem MicroC-ben van? Debug... Nagyon szeretném megtanulni, hogy is kellene, de sajnos egyenlőre nem sikerül. Két ok miatt nem:1. MicroC-ben "programozok", viszont a MicroC for PIC nem látja hardveresen a PICKIT3-st. 2.Gondolom lehetne a Mplab-ba is kiolvasni az assambly parancsokat (esetleg debuggolni), de azt meg annyira nem értem(még). Majd ha hazaérek, kipróbálom a két ledes változatot, amit írtál.
ktamas66: Igen, ezen regiszterek lelki világába szerettem volna egy kicsit belemélyülni, de az angollal nem kicsit küzdök.Próbálom tanulmányozni az adatlapot, de kezdő pickesnek, ez a sok regiszter egy kicsit sok. Főleg, hogy az angollal is hadilábon állok. Amit leírtál, annak mindenképp utána nézek, és próbálom megérteni, melyik regiszter melyik bitje mire szolgál. Ha tudsz esetleg egy linket vagy weboldalt, ahonnan ezek megtanulhatók, azt nagyon megköszönném.
icserny: Értelek, hogy nem arra használjuk a megszakítást, amire én így a teszt alapján használtam. Jó tudni, hogy mi a "valós" feladata. Csak gondoltam... De rosszul gondoltam... Köszönöm az infót.
Mindenkinek köszönöm szépen még egyszer.
(#) sprofan válasza usane hozzászólására (») Aug 28, 2014 /
 
Szuper, köszönöm!
(#) usane válasza DJozso hozzászólására (») Aug 28, 2014 /
 
Mikroc-ben is van debug opció. Nem tudom hogy működik, mert csak végszükség esetére telepítettem fel, de van benne.
(#) DJozso hozzászólása Aug 28, 2014 /
 
Nos kipróbáltam. A következő kód részlettel működik:
  1. INTCON.GIE = 1;
  2.   INTCON.INTE= 1; //ahogy ktamas66 mondta
  3.   INTCON.INTF  = 0;//
  4.   OPTION_REG.INTEDG = 1; //Felfutó élre vált.

A void interrupt-ban pedig nullázom a INTCON.INTF bitjét.Köszönök mindent.
(#) Birs Alma hozzászólása Aug 28, 2014 /
 
Sziasztok!
I2C eszköz címzés ügyben szeretnék segítséget kérni.

PIC16F887-el most egy 24c16 memóriát használok és remekül működik a dolog. De ha szeretnék egy PCF8583 óra IC-t is használni, akkor hogyan tudom a két eszközt megkülönböztetni?

Az adatlapok alapján nekem úgy tűnik, mind a kettőnél b'1010xxxx' az eszköz címe. Vagy valamit félreértek?

Kösz, ha tud valaki segíteni.

L.
A hozzászólás módosítva: Aug 28, 2014
(#) nedudgi válasza Birs Alma hozzászólására (») Aug 28, 2014 /
 
Ha megnézed a lábkiosztást, találsz a lábak között Ax nevű lábat. Ezeket az alapcímet módosítják.
Például a PCF8583 az A0 mellett beállítható a 0xA2 címre is.
(#) Birs Alma válasza nedudgi hozzászólására (») Aug 28, 2014 /
 
Hát, nem igazán értem mire gondolsz.

A 24C16-nál nekem úgy tűnik egyáltalán nem tudom az eszköz címét állítani. Ilyen lábai nincsenek. A címként elküldött első byte 1010AAAR formátumú, ahol, nekem úgy tűnik, a 4 felső biten mindig 1010-t vár az eszköz. Az AAA biteken pedig az írni/olvasni kívánt adat memóriacímének felső 3 bitje van. Végül R jelzi, hogy írásról, vagy olvasásról van-e szó.

A PCF8583 cím byte a következő módon néz ki: 101000CR, ahol a felső 4 bit szintén mindig 1010. A C helyén lévő bitet valóban tudom választani azzal, hogy a chip A0 lábát Vdd-re vagy Vss-re kötöm-e, de ennyi.

Mivel mind a két eszköznél 1010 a felső négy bit, és mivel 24C16 a következő 3 bitet már memória címzésére használja, nem látom, hogyan tudnám a két eszközt megkülönböztetni.

A 24C16-on valóban van három láb, ott azonban az egyes blokkok írásvédettségét tudom kapcsolni.

Most úgy látom, hogy ha memóriát és órát is használni szeretnék, akkor a 24C16-ot ki kell cserélnem 24C164-re. Ott három láb nem a blokkok írásvédésére, hanem éppen az eszköz címének beállítására való. (Viszont míg 24C16 kb. 60Ft. 24C164 kb. 400Ft.)

Jól gondolom? Vagy van mégis mód valahogy a 24C16 és a PCF8583 egyszerre történő használatára?

L.
A hozzászólás módosítva: Aug 28, 2014
(#) matheattila válasza Birs Alma hozzászólására (») Aug 28, 2014 /
 
A 24C16-nak vannak Ax lábai (kivéve a SOT23-5-öt) csak éppen nincsenek bekötve. Mivel a PIC-ednek nincs két I2C modulja, így kellene írj egy szoftveres I2C-t, vagy ha nem akkor pl az EEPROM tápját valahogy lekapcsolnád (a PIC-el) ameddig olvasnád/írnád az óra IC-t, vagy a PIC SDA/SCK lábai után teszel egy multiplexert és akkor az adatvonalakat kapcsolgatod, csak ez kicsit macerásabb (csináltam már ilyent USB-vel és működött is szépen 4 eszközzel)...
Legrosszabb esetben lecseréled az EEPROM-ot egy olyanra aminek más a címe, vagy esetleg SPI-al kommunikál.
(#) Birs Alma válasza matheattila hozzászólására (») Aug 28, 2014 /
 
Hát igen. Egyetértek. De a szoftveres I2C-t nem igazán vállalnám be, különben is már kész a panel, és be van forrasztva, sok lehetőségem így nincs. Most úgy gondolom az a legjobb, ha 24c16-ot kiszedem, 24c32-re cserélem és a panel alján meg összeforrasztgatom, hogy semmi esetre se 001 legyen a címe. A többi javaslatod is mind működőképesnek tűnik, csak hát azért nem tudom azt sem megtenni, mivel a panel már kész.
Kösz a válaszodat!
L.
(#) Hp41C válasza Birs Alma hozzászólására (») Aug 29, 2014 /
 
Ha Microchip gyártmányú a 24LC16: Vedd ki és tegyél a helyére Atmel vagy ST gyártmányút. Ezeknem működik az A2, A1, A1 címbemenet.
(#) cross51 hozzászólása Aug 29, 2014 /
 
Sziasztok!
Azt hogyan lehet megvalósítani, hogy (XC8-ban) létrehozok egy header file-t és *.h tartalmaz függvény prototípusokat és a printf-hez hasonlóan meghívja a doprnt.c file-t aztán a putch.c-t, én is ezt szeretném, hogy *.h-ban megadott függvény prototípushoz *.c file-t rendelni lehetséges ez?

Valamit még egy kérdés a printf-el kapcsolatban ha én más néven szeretném elérni a printf függvényt azt, hogyan lehetséges.
Én így próbáltam #define LCDprint(x) printf(x), de így csak ez a formátum használható LCDprint("abc"), a másik típusú LCDprint("%s", string) nem ezt meg lehet valahogy oldani, hogy mind két formátumot lehessen használni?
Köszönöm!
(#) Hp41C válasza cross51 hozzászólására (») Aug 29, 2014 /
 
Az oldal szerint a printf függvény a putch() -t hívjí meg minden kiírandó karakterre. Elegendő azt úgy megírni, hogy az LDC -re írjon.
(#) cross51 válasza Hp41C hozzászólására (») Aug 29, 2014 /
 
Tudom csak a formaság kedvéért szerettem volna megcsinálni a printf átdefiniálását.
(a putch()-t LCDchar ként használom puts meg LCDstring ként mert elviegben a printf hely igényes, csak ha mégis használnám)
(#) don_peter hozzászólása Aug 30, 2014 /
 
Uraim,

" - Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)"
Ez a mondat pont igaz 18F4550-re is igaz?
Nincs rá mód, hogy a RA4-en H szintet tudjak kiadni?

Illetve kérdezném, hogy valaki már készített bármilyen gombmátrixot úgy, hogy a sorokat (vagy oszlopait ki, hogyan) shiftregister-rel hajtotta meg?

illetve,
  1. while(oszlop1); //várakozunk gomb felengedéséig

Ezt a sort én pergés mentesítésnek használom, eddig jól is működött, de most a shiftregister-es megoldásnál beragad a while(oszlop1); ciklusban ezért azt szeretném kiváltani.
Milyen más megoldással tudnám ez a while(oszlop1); ciklusos várakozást kiváltani?

Előre is köszi..
A hozzászólás módosítva: Aug 30, 2014
(#) kissi válasza don_peter hozzászólására (») Aug 30, 2014 /
 
A 4550-nél az RA4 nem nyitott nyelőelektródás, simán használhatod...
(#) don_peter válasza kissi hozzászólására (») Aug 30, 2014 /
 
Ha beállítom LATA regiszterrel, hogy magas szintre kerüljön akkor a szimulátorban úgy jelenik meg mint ha inputra állítottam volna be.
Valamit be kell állítsak ahhoz, hogy tudjam azt a lábat is használni?
(Config registerbe vagy valahol?)
(#) kissi válasza don_peter hozzászólására (») Aug 30, 2014 /
 
Nézz rá a CMCON regiszterre is !
Következő: »»   560 / 1210
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