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   945 / 1210
(#) Pali79 válasza kriszrap hozzászólására (») Máj 7, 2017 / 1
 
Nem! Pont, hogy tiltani kell a BOR-t és nem engedélyezni!
(#) Hp41C válasza kriszrap hozzászólására (») Máj 7, 2017 / 1
 
Nem. Ha a RA5 digitális bemenet, a MCLR a chipen belül a Vdd -re van kötve. Nem árt a felhúzás, a programozási módba való véletlen belépés ellen.
Az a baj, hogy a Brown-out reset még mindig be van kapcsolva.
Kódvédelem nélkül a konfigurációs szó jó értéke: 0x3F09
(#) kriszrap válasza Hp41C hozzászólására (») Máj 7, 2017 /
 
Ja hogy brown out ki kene kapcsolnom?0.0 Ha igen azt hittem azt on olni kell.
(#) slimcolt hozzászólása Máj 7, 2017 /
 
Sziasztok,

Megírtam életem első programját egy PIC16LF1825-re.
MPLAB X-el szimuláltam, tökéletesen működik, viszont eléggé energia pocsékoló.
Szeretnék megszakítást és sleep üzemmódot használni, de sajnos nem tudom hogyan tehetném!

Nem másolom be a teljes programot, mert a kérdésemhez az felesleges, de a lényeg:

  1. void main(void)
  2. {
  3.  
  4.    
  5.     while (1)
  6.     {
  7.         if (PORTAbits.RA4 & PORTAbits.RA5)
  8.         {    
  9.               ciklustörzs
  10.          }
  11.          else
  12.          {
  13.                LATC = 0b00110000;
  14.          }
  15.     }
  16. }


A program elindulásakor amíg "PORTAbits.RA4 & PORTAbits.RA5" feltétel nem teljesül, igazából semmit nem csinál, csak LATC regiszter értékét 0b00110000 bináris értéken tartja.
"PORTAbits.RA4 & PORTAbits.RA5" feltétel teljesülését hogyan tudnám megoldani megszakítással?
Amíg ez nem teljesül, mehetne a sleep üzemmód is, igaz?
Köszönöm a segítséget!
A hozzászólás módosítva: Máj 7, 2017
(#) don_peter válasza slimcolt hozzászólására (») Máj 7, 2017 /
 
A4 és A5-os PIN-eket bemenetre kell állítanod és amikor ezen PIN-eken egyszerre van jelen magas szint, akkor fog lefutni a feltétel. (gomb, ...stb)

Kicsit részletesebb leírás kellene mit akarsz mert érthetetlen, egyelőre...
(#) slimcolt válasza don_peter hozzászólására (») Máj 7, 2017 /
 
Szia,

Bemenetekre van állítva, és nem az a gondom, hogy nem működik, hanem hogyan tudnék beiktatni sleep üzemmódot a programba.
Mert, ha elindul a program, belép a while végtelen függvénybe, és csak akkor megy tovább ha RA4 és RA5-re 1-es érkezik. De mire ez megérkezik eltelhet 6 óra hossza is, addig miért ne aludhatna...?
(#) Pali79 válasza slimcolt hozzászólására (») Máj 7, 2017 /
 
Meg kell nézni az adatlapban, hogy azokra a lábakra lehet-e IT-t beállítani. Ha lehet nyert ügyed van, csak beállítod és az első ciklus után mehet hajcsizni. Ha nem lehet akkor egy timert kell beállítani ami ha lejár, felébreszti a PIC-ket. Ébredés után ránézel a bemenetre ha még mindig semmi akkor hajcsi megint. A két ébredés közti idő lehet viszonylag nagy is, ha pl. gombról van szó mert csak annyit kell tenni, hogy hosszan kell lenyomva tartani. Persze ha mást figyelsz a bemenettel akkor az más tészta, de kivételesen egyetértek Péterrel, több infó kellene.
(#) kriszrap hozzászólása Máj 7, 2017 /
 
Köszönöm sikerült.
(#) slimcolt válasza Pali79 hozzászólására (») Máj 7, 2017 /
 
Igen ilyen működésre gondoltam!
Igazából RA4 és RA5-öt két schmitt trigger buffer vezérel (amit elvileg ezzel a PIC-el ki is válthatnék..? )
A buffereket nyitott drain kimenetű komparátorok kapcsolják, amiket áramgenerátoros feszültség referenciák kapcsolnak. Lehet inkább megkímélnék mindenkit, hogy pontosan mit is csinál, mert elmagyarázásban nem vagyok a legjobb

Pontosan a beállításokkal van problémám, ezért ebben kérnék egy kis segítséget!
Ha egyszer megértem és megtanulom akkor utána menni fog
(#) Pali79 válasza slimcolt hozzászólására (») Máj 7, 2017 /
 
Elméletileg be lehet állítani a PORTA-t, hogy változásra megszakítást generáljon, csak azt is meg kell nézni, hogy kiválasztható-e egy-egy lábra. Az adatlap 143. oldalától kezdődik a leírás, azt kell jó alaposan átrágni, értelmezni. Sajnos a te általad használd programnyelvhez én kuka vagyok, de majd a többiek talán mondanak valami okosat.
(#) zenetom válasza slimcolt hozzászólására (») Máj 7, 2017 / 1
 
Be kell állítani a két bemenetre megszakítást (nem tudom, hogy ezekre lehet-e, nézz utána, max másik lábakat kell), ami felkelti a sleep-ből.
Az else ágban a LATC állítás után be kell rakni egy sleep-et. Aztán ha felébreszti az egyik bemenet változása, akkor az if részre ugrik, ott ha nem érvényes a feltétel, belép az else ágba, LATC.. majd sleep. Aztán ha jön változás ugyanez megint.
Nem tudom ez a PIC sleep-ből hogy reagál a megszakításra (belép rögtön a megszakítás vektorra, vagy onnan folytatja, ahol volt a sleep, illetve az IT flag bitet törölni kell..).
Ha ritkán van a lábakon változás, akkor már ezzel elég sokat lehet spórolni fogyasztás ügyileg, kezdésnek talán elég is lehet.
(#) kriszrap hozzászólása Máj 7, 2017 /
 
Ha valakinek van ideje letudná ellenörizni jöl gondolkottam köszönöm.
  1. unsigned long int levonas_ido=86402;
  2. char kimarad=0;
  3. void interrupt(void){
  4.    if(TMR2IF_bit)
  5.    {
  6.      TMR2IF_bit = 0;
  7.      if(!--count)
  8.      {
  9.        count=100;
  10.        if(kimarad ==0)mas1++;
  11.        levonas_ido--;
  12.        kepfrissit=1;
  13.      }
  14.  
  15.  
  16.      if(levonas_ido <3)
  17.      {
  18.        kimarad=1;
  19.        if(levonas_ido==0)
  20.        {
  21.          levonas_ido=86402;
  22.          kimarad=0;
  23.        }
  24.      }

A müködése annyi inditáskor betöltöma 24 órát és 2 másodpercet és amikor elérjük a 24 órát akkor a kimarad bitet be billentem igy 2 secet nem add hozzá utánna pedig mindent vissza állítok.
úgyfog müködni ahogy elgondoltam?
A hozzászólás módosítva: Máj 7, 2017
(#) slimcolt válasza zenetom hozzászólására (») Máj 8, 2017 /
 
Átrágom az adatlapot (mondjuk nem vagyok hozzá szokva a majd' 500 oldalas doksikhoz )
Megpróbálkozom megírni MPLAB-ban és leszimulálni, ha nem sikerül, akkor lehetséges (sőt igen valószínű), hogy zaklatlak még titeket.
(#) zenetom válasza slimcolt hozzászólására (») Máj 8, 2017 / 1
 
Az adatlap 13. fejezetében lévő megszakítás kell Neked. Úgy néz ki, RA4 és RA5-re is lehet megszakítást beállítani. Lehet pozitív és negatív, ill. mindkét élet beállítani. Neked végülis elég a pozitív élet (tehát felfutót) beállítani mindkét lábra, az IOCAP regiszterben (IOCAP5 és IOCAP4 legyen 1). Ennek eredményeképp csak akkor fog feléledni a PIC az alvásból, ha bármelyik lábra felfutó él kerül.
Közben az még eszembe jutott, hogy ha a sleep-ből feléled a PIC a megszakításra, akkor utána a következő sleep-ig ki kell kapcsolni az IOC (Interrup On Change) megszakítást, különben mindig belépked a megszakítás címre (sleep előtt pedig engedélyezni). Illetve mielőtt elküldöd aludni a PIC-et, meg kell győződni róla, hogy tutira nincs magas szinten a két láb (szóval amíg kikapcsolod a megszakítást, nehogy jöjjön mindkét lábra egy felfutó..).
A hozzászólás módosítva: Máj 8, 2017
(#) slimcolt válasza zenetom hozzászólására (») Máj 8, 2017 / 1
 
Szia!

Sikerült beállítani. MPLAB-al a stimulus segítségével szimuláltam. Tökéletesen működik.
Sőt a program egy másik részébe (ahol csak egy nyomógomb megnyomására vár) oda is implementáltam ezt a megoldást.
Annyi kérdésem még lenne, hogy a "IOCAF: INTERRUPT-ON-CHANGE PORTA FLAG REGISTER" pontosan mire való? Ezt nem sikerült megfejtenem.
Az adatlap 137. oldalán van az IOC blokk ábrája
Ha beállítom 1-re az IOCAPx regisztert, akkor a D ff állapota RAx felfutó élére tárolja IOCAPx 1-esét.
Ami a kapuzás után egy D ff-t aszinkron 1-be állít majd ez lesz a megszakítás.
A Q4Q1 nem tudom mi lehet..
Az IOCAFx regiszterrel elvileg szintén lehetne megszakítást előidézni, de csak akkor ha a D ff nincs aszinkron 1-be állítva.
Vagy teljesen félre értelmezem?

A programomban van egy rész amivel azt érzékelem, hogy hosszan vagy röviden nyomták meg a gombot, ezt is szeretném lecserélni megszakítás alapúra .Ezt biztos nem úszom meg a Timer modul nélkül, bár még azt se használtam soha!

Szóval én így oldottam meg:

  1. for (WAIT = 0; WAIT <= 20000; WAIT++ ) // Gomb hosszan nyomásának érzékelése.
  2.                             {
  3.                                 if (PORTAbits.RA2 != 1) // Ha nincs megnyomva a gomb, akkor a for ciklus megszakítva.
  4.                                 {
  5.                                     break;
  6.                                 }
  7.                                 __delay_us(200);
  8.                             }
  9.                            
  10.                             if (WAIT >= 20000) // Ha minimum 2mp-ig nyomták a gombot.
  11.                             {
  12.                                 LATCbits.LATC5 = 1;
  13.                                 LATCbits.LATC4 = 1;
  14.                                 LATCbits.LATC2 = 1;
  15.                                 LATCbits.LATC1 = 1;
  16.                             }


Ennek milyen jobb megoldása lehet?
(#) slimcolt válasza slimcolt hozzászólására (») Máj 8, 2017 /
 
Most nézem a 127. oldalon lévű ábrát.
Elvileg ha az utolsó D ff is tárolta az 1-et, akkor az aszinkron resetbe állítja az egész fel-lefutó él figyelő D ff-kat, ha Q2 =1. Kicsit homály
A hozzászólás módosítva: Máj 8, 2017
(#) Hp41C válasza slimcolt hozzászólására (») Máj 8, 2017 / 3
 
Az IOCAF regiszter kiolvasásával megtudhatod,mmely bite(ke)n történ jelváltás.
Bit 5..0: 1 = An enabled change was detected on the associated pin.
Ebbe a regiszterbe való beírással lehet törölni az egyes (vagy csoportos) kéréseket. Csak andwf utasítással ajánlott törölni a már feldolgozott változás(ok)hoz tarozó bitet, hogy a végrehajtás alatt bejövő újabb változások ne vesszenek el.
(#) slimcolt hozzászólása Máj 8, 2017 /
 
Így most már világos. Köszönöm!
(#) dani555 hozzászólása Máj 8, 2017 /
 
Sziasztok!

Megint lenne egy problémám a pic-es hőmérővel, de nem tudok rájönni mi a baj. Lm35dz ic-vel csináltam. A pic típusa: 16f877a, a hőmérő IC az RA2 analóg bemenetre csatlakozik. Most olyan jellegű a problémám, hogy mutatja a hőmérsékletet helyesen, de ahogy el kezd nőni a hőmérséklet, úgy pl: 27 28 29 30, majd 31 foknál -31 re vált, nem 32-re, majd tovább -30, -29, -28.....és így tovább lefelé.
Nem hiszem, hogy a kódban lenne a hiba, mert mutatja a hőmérsékletet korrektül, igazából a -28 fok, megfelel a 35 foknak.

Szerintetek a hőmérő ic nyekkent meg a zsugorfoliázás és forrasztás alatt, vagy valami más, rejtett, általam nem felfedezett hiba van. Pl. gondoltam még arra, hogy lehet az a baj, hogy nincsenek a komparátorok kikapcsolva?

Köszi a segítségeteket!
(#) Panhard válasza dani555 hozzászólására (») Máj 8, 2017 /
 
Nem lehet, hogy a programban valahol a hőmérséklet érték 6 biten van tárolva? Előjelesen? Csak akkor tudom elképzelni ezt a hibát. Nem hiszem, hogy a hőmérő IC a rossz, mert analog jelet ad ki. Programhiba lehet.
(#) Bakman válasza dani555 hozzászólására (») Máj 8, 2017 /
 
Mérj műszerrel is feszültséget az analóg lábon. Ha az stimmel, akkor a programban/konfigurációban van a hiba. Olyan ADC, amely negatív végeredményű is lehet, viszonylag kevés PIC-ben van a nyolc bitesek között. Ez a tény is a programhibát feltételezi.

6 bites (signed) változó lenne használva?
A hozzászólás módosítva: Máj 8, 2017
(#) _BiG_ válasza dani555 hozzászólására (») Máj 8, 2017 /
 
A temp és a vartemp változód is előjeles egész (int), próbáld meg előjel nélküli egésszel.
(#) dani555 válasza _BiG_ hozzászólására (») Máj 8, 2017 /
 
Jó megfogom unsigned int-tel próbálni.
Csak az zavar, és ez válasz az előző hszónak is, hogy az inttostr() műveletben amibe konvertálok az 6 bites elvben....
Hiszen az lcd-n vmi ilyesmi látszik: [4 digit semmi, ezt eddig nem sikerült eltüntetni]25 és mikor minusz lesz, akkor a 2-es előtti digitben lesz a minusz. És mindig a fent leírt sorozatnál következik be... De helyes amúgy, mert kissé nevetséges, hogy a víz -(33-77) fokon forr.
(#) dani555 válasza dani555 hozzászólására (») Máj 8, 2017 /
 
De hogy miért pont +31 nél kattan be, az rejtély....
(#) kriszrap hozzászólása Máj 8, 2017 /
 
  1. void sajat_kirajzol(char otodikleded1,char negyedikled1,char harmadikled1,char masodikled1,char elsoled1,
  2. char otodikleded2,char negyedikled2,char harmadikled2,char masodikled2,char elsoled2,
  3. char otodikleded3,char negyedikled3,char harmadikled3,char masodikled3,char elsoled3,
  4. char otodikleded4,char negyedikled4,char harmadikled4,char masodikled4,char elsoled4,
  5. char otodikleded5,char negyedikled5,char harmadikled5,char masodikled5,char elsoled5,int tomb,char szint)
  6. {
  7.      hanyadik=tomb;
  8.      l[hanyadik][0]=szint;
  9.      l[hanyadik][1]=elsoled1;
  10.      l[hanyadik][2]=masodikled1;
  11.      l[hanyadik][3]=harmadikled1;
  12.      l[hanyadik][4]=negyedikled1;
  13.      l[hanyadik][5]=otodikleded1;
  14.  
  15.      l[hanyadik][6]=elsoled2;
  16.      l[hanyadik][7]=masodikled2;
  17.      l[hanyadik][8]=harmadikled2;
  18.      l[hanyadik][9]=negyedikled2;
  19.      l[hanyadik][10]=otodikleded2;
  20.  
  21.      l[hanyadik][11]=elsoled3;
  22.      l[hanyadik][12]=masodikled3;
  23.      l[hanyadik][13]=harmadikled3;
  24.      l[hanyadik][14]=negyedikled3;
  25.      l[hanyadik][15]=otodikleded3;
  26.  
  27.      l[hanyadik][16]=elsoled4;
  28.      l[hanyadik][17]=masodikled4;
  29.      l[hanyadik][18]=harmadikled4;
  30.      l[hanyadik][19]=negyedikled4;
  31.      l[hanyadik][20]=otodikleded4;
  32.  
  33.      l[hanyadik][21]=elsoled5;
  34.      l[hanyadik][22]=masodikled5;
  35.      l[hanyadik][23]=harmadikled5;
  36.      l[hanyadik][24]=negyedikled5;
  37.      l[hanyadik][25]=otodikleded5;
  38.  
  39. }
  40. void tombol_rajz(int mill)// kiíratás
  41. {
  42.   int ido;
  43.   char i,k;//fontos
  44.   for(ido=0;ido<mill;ido++)
  45.   {
  46.      for(i=1;i<6;i++)
  47.      {
  48.       nyfigy();
  49.       oszlopok(l[i][0]);
  50.       LATA.RA4=l[i][1];
  51.       LATA.RA3=l[i][2];
  52.       LATA.RA2=l[i][3];
  53.       LATA.RA1=l[i][4];
  54.       LATA.RA0=l[i][5];
  55.  
  56.       LATB.RB7=l[i][6];
  57.       LATB.RB6=l[i][7];
  58.       LATB.RB5=l[i][8];
  59.       LATB.RB4=l[i][9];
  60.       LATB.RB3=l[i][10];
  61.  
  62.       LATB.RB2=l[i][11];
  63.       LATB.RB1=l[i][12];
  64.       LATB.RB0=l[i][13];
  65.       LATD.RD7=l[i][14];
  66.       LATD.RD6=l[i][15];
  67.  
  68.       LATD.RD5=l[i][16];
  69.       LATD.RD4=l[i][17];
  70.       LATC.RC7=l[i][18];
  71.       LATC.RC6=l[i][19];
  72.       LATC.RC5=l[i][20];
  73.  
  74.       LATD.RD0=l[i][21];
  75.       LATD.RD1=l[i][22];
  76.       LATD.RD2=l[i][23];
  77.       LATD.RD3=l[i][24];
  78.       LATC.RC4=l[i][25];
  79.       Delay_us(200);
  80.       if(megszakitas==1)break;
  81.      }
  82.      if(megszakitas==1)break;
  83.   }
  84.   //tömbök üritése
  85.   for(k=0;k<6;k++)
  86.       for(i=0;i<26;i++)
  87.         l[k][i]=0;
  88. }
  89.  
  90.   while(1){
  91.  
  92.    sajat_kirajzol(0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,2,2);//tömbök feltöltése
  93.    sajat_kirajzol(0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,3,3);
  94.    sajat_kirajzol(0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,4,4);
  95.    sajat_kirajzol(0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,5,5);
  96.    tombol_rajz(1);// meddig legyen a kép
  97.    }


Sziasztok egyszerüen nem tudom miért de a 5. tömb sokkal fényesebb mint a többi. Legföképp akkor jön ki a dolog amikor 1ms re állítom a kirajzolást.
Miért?? Vagy láttok benne hibát??
(#) Tasznka válasza dani555 hozzászólására (») Máj 8, 2017 /
 
Mert előjeles ,és 6.bit az előjel. 5 biten 31 a maxi érték.Ha nem előjeles ,akkor 63-ig tudsz elmenni.
Így a felső bit az előjel:
31 = 0b011111
32 = -0? = 0b100000
33 = -31 = 0b100001
34 = -30 = 0b100010
A hozzászólás módosítva: Máj 8, 2017
(#) ktamas66 válasza kriszrap hozzászólására (») Máj 8, 2017 /
 
Úgy látom, az 5. után nincs kikapcsolva a kijelzés, ezért a számítások idejével tovább világít. Hogy a multiplexben egyenletesek legyenek az idők, inkább fordítva csináld: betöltöd az értékeket, felvillantod egy adott ideig, majd betöltöd az új értékeket, az is adott ideig világít.
(#) kriszrap válasza ktamas66 hozzászólására (») Máj 8, 2017 /
 
Nem úgy csináltam???
Betöltöm a szinten lévő "LEDEKET" 1.2..5 ig
  1. sajat_kirajzol(0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,szint,1);

tombol_rajz bent van egy forciklusom 1...5 ig ott megyek végig a tömbökön.
(#) dani555 válasza Tasznka hozzászólására (») Máj 8, 2017 /
 
És esetleg van valami ötlet, hogyan tudnám 100 fokig ezt megnövelni?
Ugye azt 7 biten, ha előjel is számít akkor 8 biten lehet ábrázolni.
long int? Vagy unsigned long int esetleg?
És azt a "4 üres" karaktert, amit a inttostr() csinál, azzal mit lehet tenni hogy megszűnjön?
(#) ktamas66 válasza kriszrap hozzászólására (») Máj 8, 2017 /
 
Gondolom az oszlopok()-ban engedélyezed, hogy melyik oszlop aktív. Ezt hol kapcsolod ki? Az első négyet a következő kirajzolás kikapcsolja, de az ötödiket mi kapcsolja ki? Én megfordítanám: kirakni a ledek állapotát 1-25-ig, majd adott szint bekapcsolása, várakozás (200us), kikapcsolás, új szint betöltés ....
Következő: »»   945 / 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