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   495 / 1210
(#) Hp41C válasza Balagemann2031 hozzászólására (») Feb 28, 2014 /
 
Milyen sokan és milyen sokszor mondták, hogy használjuk a 18F -eket, mert nem kell a bankváltásokkal törődni. Lesz itt is gond a bankokkal, csak elég nagy kontrollert kell használni...
(#) icserny válasza Hp41C hozzászólására (») Feb 28, 2014 /
 
Idézet:
„Lesz itt is gond a bankokkal, csak elég nagy kontrollert kell használni...”
Kész röhej, hogy egyes gyártók 8 bites mikrovezérlőkbe akarnak bezsúfolni mindent, mások meg 8 lábú, 4kB flash/1kB RAM kaliberű 32 bites ARM Cortex M0+ vezérlőt dobnak piacra (LPC810).
(#) Hp41C válasza icserny hozzászólására (») Feb 28, 2014 /
 
PIC18F87K90 - Original data sheet for PIC18F87K90 family devices - September 2009
LPC81XM v.1 20121112 Objective data sheet
Csak három év ...
(#) icserny válasza Hp41C hozzászólására (») Feb 28, 2014 /
 
Ezt a 3 évet nem emlegetném, mert az ARM Cortex-M0 és M0+ valójában egy új vonulat, és egyfajta visszalépésnek tekinthető (hiszen korábban jött ki a nagyob tudású M3 és M4 is!).

Sőt, a Microchipnek is volt már 32 bites mikrovezérlője akkor (2009-ben), hiszen Lucio di Jasio: Programming 32-bit Microcontrollers in C: Exploring the PIC32 c. könyve is 2008 tavaszán jelent meg. A PIC32MX3XX/4XX adatlap rev E. pedig 2008 júniusi dátumú.
(#) Balagemann2031 hozzászólása Márc 1, 2014 /
 
Sziasztok! Egy kis segítséget szeretnék kérni PWM ügyben. Tehát van a18F67K90-es PIC-em, amelynek az adatlap szerint van 7 CCP modulja és 3 ECCP. Nekem 4 HW es PWM re lenne szükségem, de csak 1-et tudok sikeresen beállítani. Timer2-vel tudom használni a CCP4-et, viszont már azt sem értem hogy a CCPTMRS1 (timer select reg) ben beállítom, hogy CCP4 hez Timer6 tartozzon, akkor is Timer2-ről megy. Watch-ban figyelem az összes használt regisztert, de csak a T2+CCP4 kombó billegeti a kimenetet.. Hiába bűvölöm az adatlapot, nem jövök rá a jó megoldásra
(#) Balagemann2031 válasza Balagemann2031 hozzászólására (») Márc 1, 2014 /
 
Megoldódott! Timer2 közös, csak a különböző kitöltéseket kell megadni CCPx-enként.
(#) don_peter hozzászólása Márc 2, 2014 /
 
Uraim, szégyen, de nem tudom hogy tudok LCD-re kiíratni egy változót. (HD44780)
  1. lcd_write_pgm("szám:"+változó);

PHP-ben csak egy dollár előtagot ($változó) kell beírjak a változóneve elé és megy, de itt pfff nem tudom.
Köszönöm előre is a segítő szándékot.
(#) benjami válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Így nem is fog menni, mindenképp kell egy tömb amibe a kiírandó szöveget tárolod. Ebbe az sprintf függvénnyel tudsz hasonló módon számot konvertálni. A hátránya ennek a függvénynek a memóriazabálása és a sebessége. Valamivel gyorsabb és kevésbé memóriapazarló az itoa és társai szám->string átalakító függvények használata.
(#) don_peter válasza benjami hozzászólására (») Márc 2, 2014 /
 
Van egy szam változom amit deklarálok a program elején és nullára állítom.
  1. int szam = 0;

Aztán egy nyomógomb hatására ezt a szam változót illetve annak értékét növelem 1-el.
  1. szam++;

Minden változásnál kiíratom az LCD kijelzőre a szam értékét, vagy is ki akarom íratni
  1. lcd_write_pgm("szam:".$szam);

Ez hogy tehetem meg?
Mindenképpen ehhez is kell egy tömb?
A hozzászólás módosítva: Márc 2, 2014
(#) benjami válasza don_peter hozzászólására (») Márc 2, 2014 /
 
pl:
  1. char LcdText[32];
  2. int szam;
  3. itoa(szam, (char *)LcdText + 3);
  4. lcd_write_pgm(LcdText);

Az itoa paraméterezése fordítónként eltérhet (csak hogy ne legyen annyira egyszerű az élet), az általad használt verzió használatát nézd meg a fordító dokumentációjában.
A hozzászólás módosítva: Márc 2, 2014
(#) don_peter válasza benjami hozzászólására (») Márc 2, 2014 /
 
C18-al fordítok és elvileg a manuál szerint jó a paraméterezése még is hiba jön.
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. #include <delays.h> //Időzítő
  4. #include <HD44780.h> //LCD driver
  5. #pragma config WDT = OFF //Őrzőkutya kikapcsolva
  6.  
  7. void delay(unsigned int ido){
  8.         unsigned int k;
  9.         for(k=0; k<ido; k++){
  10.                 ;
  11.         }
  12. }
  13.  
  14. char LcdText[32] = "szam: ";
  15. int gomb1, szam = 0;
  16.  
  17. void main(void){ //Főprogram
  18.         int i;
  19.         TRISB = 0; //A PIC teljes B portját nullára állítja
  20.  
  21.         // lcd portok 0-ra állítása
  22.         TRISC = 0;
  23.         TRISD = 0;
  24.         lcd_initialize();
  25.         lcd_display_on();
  26.         lcd_goto(1, 1);
  27.         lcd_write_pgm("Proba kijelzes");
  28.         lcd_goto(2, 1);
  29.         lcd_write_pgm("LED:");
  30.         lcd_goto(3, 1);
  31.         lcd_write_pgm("Hany kapcsolas: ");
  32.         lcd_goto(4, 1);
  33.         lcd_write_pgm("4.sor");
  34.        
  35.         while(1){
  36.                 delay(10000);
  37.                 if(PORTBbits.RB5 == 1){
  38.                         if(gomb1 == 0){
  39.                                 lcd_goto(2, 8);
  40.                                 lcd_write_pgm("OFF");
  41.                                 PORTB = (0b00000000);
  42.                         }else{
  43.                                 lcd_goto(2, 8);
  44.                                 lcd_write_pgm("ON ");
  45.                                 lcd_goto(3, 17);
  46.                                 itoa(szam, (char *)LcdText + 3);
  47.                                 lcd_write_pgm(LcdText);
  48.                                 PORTB = (0b00010000);
  49.                         }
  50.                 }else{
  51.                         gomb1 = !gomb1;
  52.                         lcd_goto(2, 8);
  53.                         lcd_write_pgm("ON ");
  54.                         szam++;
  55.                 }
  56.        
  57.         }
  58. }

Mit nézek be Uram?
(ha gány a kód ne akadjatok ki rajta, erősen próbálkozom még ha bénán is, de legalább az akarat megvan )
A hozzászólás módosítva: Márc 2, 2014
(#) benjami válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Lehet, hogy az lcd_write_pgm csak ROM-ban tárolt konstans stringet tud kiiratni, ha van sima lcd_write azzal kellene a RAM-ban tárolt stringet.
(#) don_peter válasza benjami hozzászólására (») Márc 2, 2014 /
 
Jaja azzal próbálkozom most.
Nem egyszerű ez a C, de csak megtanulom a használatát.
  1. itoa(szam, (char *)LcdText + 0);
  2. lcd_write(LcdText);

így már kiírja a változót csak duplán ad hozzá.
De ez már tuti valami növelési hiba.

Meg is van a számolási hiba:
  1. if(gomb1 == 0) szam++;

Köszi a segítséget..
A hozzászólás módosítva: Márc 2, 2014
(#) don_peter hozzászólása Márc 2, 2014 /
 
PIC = P18F4550
Mire használom: semmire, gyakorlom az egyes funkciókat.

Uraim, mi arra a bevett gyakorlat, hogy ha 1 porton belül csak 1 kimondott lábat akarok kapcsolgatni?
Addig jutottan, hogy egy adott porton belül 1 lábat tudok kapcsolni, de ha egy-azon porton belül 2 lábat akarok felkapcsolni az nem megy.
Pl: ez a B port 0-ás lábát kapcsolja be, (ebbe nem vagyok biztos "kimenetre"):
  1. PORTBbits.RB0 = 1;

Ez így rendben van.
De, ha így adom meg akkor csak az utolsó utasítás fog lefutni, vagy is a B port 1-es lábát kapcsolja be és a 0-ást nem kapcsolja be:
  1. PORTBbits.RB0 = 1;
  2. PORTBbits.RB1 = 1;

Tudom, hogy ezen utasítással ez megoldható, de ezzel meg az a bajom, hogy ha már egy lábat bekacsolok akkor azt egy következő utasítás felülírja:
  1. PORTB = (0b10000000);
  2. PORTB = (0b01000000);

Az hogy így adjam meg:
  1. PORTB = (0b11000000);

Számomra nem jó megoldás mert programon belül jó lenne egy-egy lábra hivatkozni és nem állandóan az összesre.
Van erre megoldás vagy mindig csak az utóbbi és annak figyelésével lehet megoldani?
A hozzászólás módosítva: Márc 2, 2014
(#) zenetom válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Szia!
Milyen PIC-et használsz, és kb. mire? Beállítottad kimenetnek az RB0-t?
18F-nél a PORTB-ről olvasni szoktunk, a kimenet állítására a LATB-t használjuk.
Tehát:
  1. LATBbits.LATB0 = 1;
  2.  LATBbits.LATB1 = 1;
A hozzászólás módosítva: Márc 2, 2014
(#) don_peter válasza zenetom hozzászólására (») Márc 2, 2014 /
 
Thanks, tökéletes megoldás

őőőőő
Kimenetre az RB0-át?
Nem hiszem...
Csak próbálgatom mikor mit csinál a PIC (P18F4550)
Hogy kell beállítani ki és bemenetre?
Ezt deklarálni kell az elején?

Esetleg van valami kimondottan illyes fajta doksi amiben a PIC lábainak lekérdezése és utasításokat írják le?
A hozzászólás módosítva: Márc 2, 2014
(#) SBahadurD válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Használhatsz logikai függvényeket is:
Pl PORTB |= 0b11000000. Ekkor a két láb magasra kerül, a többi nem változik. Vagy PORTB &= 0b00111111. Ekkor a két láb alacsonyra kerül, a többi nem változik. (Ez a két láb nem az RB0 és RB1 lesz).

A fő problémát viszont gondolom az okozza, hogy ha a PORT regisztert módosítod a bitenkénti utasítással, akkor azt úgy csinálja meg a PIC, hogy a lábak pillanatnyi állapotát beolvassa, majd módosítja a kívánt értékre és utána visszaírja.
Ehelyett neked vagy a LAT regisztert kell használnod, vagy ha nincs ilyen, akkor kell csinálni egy változót, abban módosítani a kimenetet ahogy szeretnéd, majd azt kirakni a PORTB-re.
(#) SBahadurD válasza don_peter hozzászólására (») Márc 2, 2014 /
 
TRISx regiszterrel lehet az irányt beállítani. Ha az értéke egy biten egyes, akkor az láb bemenet, ha 0, akkor kimenet.
(#) don_peter válasza SBahadurD hozzászólására (») Márc 2, 2014 /
 
Igen ebben az esetben ezt már megadtam a program elején:
  1. TRISB = 0; //A PIC teljes B portját nullára állítja
A hozzászólás módosítva: Márc 2, 2014
(#) SBahadurD válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Igen, csak a komment nem igaz, ami mellette van.
(#) Hp41C válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Hivatkozás egy port (PORTB) bitre:
if (PORTBbits.RB0) ...
vagy
if ((PORTB & 0x08) == 0x00) ...
if ((PORTB & 0x08) == 0x08) ...
Egy portbit beállítása:
LATBbits.LA0 = 0;
Egy porton mind a 8 bit baállításaa (a bemeneteknek állított bitekre nem hat):
LATB = 0x01;
Egy porton több bit átállítása, de nem az összes:
LATB ^= (LATB ^ ertek) & mask;
ahol ertek a beállítandó minta, mask azokon a biteken 1, amelyeket változtatni szeretnénk.
(#) zenetom válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Szia!
Most akkor melyik kimenetet akarod kapcsolgatni?
A port irányát a TRISx regiszterrel tudod beállítani.
Amelyik bit 1-es, az ahhoz tartotó láb bemenet, egyébként kimenet lesz.
Egy kis olvasmány, ebből mindent megtudsz: Bővebben: Link
(#) don_peter válasza SBahadurD hozzászólására (») Márc 2, 2014 /
 
Köszönöm.
zenetom válasza tökéletesen jól teszi a dolgát.
A logikai függvényt még hagynám így is teljes káosz van a fejembe.
Állandóan a PHP és JS utasítás készletét használom..
Néha be is jön
(#) don_peter válasza zenetom hozzászólására (») Márc 2, 2014 /
 
A válaszod jó volt azt tudtam használni egyből.
A Piccolo-t olvastam, de akkor még nem kezdtem el gyakorolni most beleolvasván sokkal érthetőbb a leírtak.
Köszi.

Kösz mindenkinek a segítséget.
Sokat tanulok belőle.
A hozzászólás módosítva: Márc 2, 2014
(#) icserny válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Idézet:
„Esetleg van valami kimondottan illyes fajta doksi amiben a PIC lábainak lekérdezése és utasításokat írják le?”
Hát persze, hogy van! Csak ezt a fejezetet kell fellapoznod. A mai kérdéseidre megtalálod benne a válaszokat.
(#) zenetom válasza icserny hozzászólására (») Márc 2, 2014 /
 
Megelőztelek
(#) don_peter válasza icserny hozzászólására (») Márc 2, 2014 /
 
Igen ezt olvasgatom már 2napja egyfolytában
Már golyóznak a szemeim.
Most ép egy virtuálisan megépített k típusú szenzort kötöttem a P18F4550 A0-ás lábára és ezen jeleket akarom beolvasni és értelmezni és a hőfokot kiíratni a kijelzőmre.
Feltételezve, hogy ez az áramkör analóg jellé alakítja a K típusú szenzorból jövő jeleket.
Bővebben: Link
Az analóg portok beállítását és azok használatát olvasgatom már vagy 2 órája, de egyszerűen nem értem.
Lényegében azzal kísérletezem, hogy a szenzor által mért hőmérsékletet kiírja nekem a program.
Nem értem vagy nem jó irányban mozdultam el...
(#) bbalazs_ válasza don_peter hozzászólására (») Márc 2, 2014 /
 
Tenyleg nem szeretnelek megserteni, de nem celszerubb, hogyha valaki most tanulja a PIC-et, akkor nem egybol atomreaktort akar vele fuzzy logic-kal vezerelni?
Hagyd a virtualis izet a fenebe es koss oda egy mondjuk 4K7-s potmetert, a poti egyik laba a foldon, masik a PIC tapon, a kozepso meg az A0-ra. Beallitasnal a ref-eket ugy bealitani, hogy a teteje tapfeszen, az alja meg foldon. Es csavargatni, valtozik-e a beolvasott ertek. Aztan ha ez megy, akkor johet majd a K tipusu talalkozas
Ha tul sok valtozot viszel bele az aramkorbe , akkor nem fogod tudni, mitol nem mukodik megfeleloen.

Az analog portot az egyik ADCON regiszternel tudod beallitani a referenciakat es hogy ne digitalis, hanem analog legyen, a masik ADCON adja a csatornat, engedelyezi az AD-t es vegul inditja az AD-t, amit ugyanazzal a GO/-DONE bittel tudsz ellenorizni, hogy lefutott-e mar (az elejen celszeru csak sima vegtelen ciklussal ellenorizni), utana meg a also es a felso byte-ot masik ket regiszterbol olvashatod ki - ADRES es ADRESH.
A PIC adatlapja mindent reszletesen leir, peldak is vannak.
A hozzászólás módosítva: Márc 2, 2014
(#) janimester hozzászólása Márc 2, 2014 /
 
Tudnátok nekem ajánlani olyan picet ami legalább 16bites széria , kezeli a pickit 2, és pdip tokozású és minnél több használható lábszámú? Hasonló érdekelne mint a 18f4550 , de az csak 12mips-es de nekem egy ennél két háromszor erősebb proci kellene pdip tokozásban.
(#) vicsys válasza janimester hozzászólására (») Márc 2, 2014 /
 
Következő: »»   495 / 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