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   1138 / 1203
(#) foxi63 válasza Vfr72 hozzászólására (») Nov 12, 2020 /
 
Szia!
Bár bagatelnek tűnik, de a PIC táp lábán közvetlenül van 100nF kondi?
üdv.:Foxi
A hozzászólás módosítva: Nov 12, 2020
(#) Hp41C válasza Vfr72 hozzászólására (») Nov 12, 2020 / 1
 
Milyen tápról járatod, amikor nem a PICkit -ről jár? A táp szűrése megfelelő? BOR le van tiltva?
A MCLR lábról kösd le a kondenzátort - egy próbát megér.
A hozzászólás módosítva: Nov 12, 2020
(#) usane válasza Vfr72 hozzászólására (») Nov 12, 2020 /
 
Ahogy írták tápszűrés lesz valószínűleg, plusz a reset gombra minek a kondi? Az is bezavarhat.
(#) Vfr72 válasza Hp41C hozzászólására (») Nov 12, 2020 /
 
Szia, Köszönöm tippet, a BOR volt ON-ba állítva, ez okozta a problémát.
(#) Bakman válasza Vfr72 hozzászólására (») Nov 12, 2020 /
 
Ez egyben azt is jelenti, hogy vagy nem jól van beállítva a BOR vagy nagyon instabil a tápfeszültség.
(#) oregharcos hozzászólása Nov 12, 2020 /
 
Sziasztok! Ismét felakadtam. Egy kis programot hoztam össze. Működik, ha a 0-ás porton letelik az időzítés, akkor az 1-es porton világít a LED. Azt szeretném hogy az 1-es portra kötött LED villogjon. Már egy hete próbálkozok, de nem sikerül. Előre is nagyon köszönöm a segítséget!

  1. //a programot mikroC PRO for PIC v:6.00-val készült.
  2.      //PIC12F675
  3.  
  4.     #define nyg GPIO.GP3
  5.  
  6.      void main()
  7.       {
  8.         GPIO = 0;
  9.         TRISIO = 0b00001000;
  10.         ANSEL = 0;
  11.  
  12.         while (1)
  13.           {
  14.             if(nyg != 1)
  15.               {
  16.                 GPIO = 0b00000001;
  17.                 Delay_ms (2000);
  18.                 GPIO = 0b00000010;
  19.                 Delay_ms (500);
  20.               }
  21.        }
  22.  
  23. }
(#) pipi válasza Vfr72 hozzászólására (») Nov 12, 2020 /
 
Akkor a teszted szerint a külső táp a rossz/bizonytalan.
(#) oregharcos válasza oregharcos hozzászólására (») Nov 13, 2020 /
 
Elnézést, rosszul írtam! A PORT 0-ás bitjén letelik az időzítés, akkor az 1-es bitje magas szinten van, azt szeretném ha változó szintű /villogó/ jel jönne ki. Köszönettel!
(#) usane válasza Vfr72 hozzászólására (») Nov 13, 2020 / 1
 
A kondi is okozhatja a MCLR-en. Ha hamarabb feláll a PIC mint az feltöltődik akkor a feltöltődésíg lehet, hogy olyan alacsony a feszültég a lábon ami már a BOR alatt van.
(#) eSDi válasza oregharcos hozzászólására (») Nov 13, 2020 /
 
Hali!

Csak a GP1-en lévő LED-nek kellene villognia? Mert jelen esetben, amíg nyomod a gombot, addig a GP0-n lévő LED 2mp-ig világít, majd a GP1-en lévő LED-re kapcsol, ami 0.5mp-ig világít. Ezután kezdődik előröl.

Nem nagyon ismerem a MikroC-t, de a Microchip XC8-nál, ha nem/nem jól adod meg a frekit amin jár a PIC (pl.: #define _XTAL_FREQ 8000000), akkor a delay_ms funkció nem fog jól működni.
(#) glaci hozzászólása Nov 14, 2020 /
 
Sziasztok!
Szeretném megkérdezni, hogy PIC16F887 -nél az RA2 és RA3 portokról sehogyan nem lehett megszakítást kezdeményezni?
(#) Hp41C válasza glaci hozzászólására (») Nov 14, 2020 /
 
Csak a komparátor modulon keresztül. RA2 - CN2IN+, RA3 - CN1IN+
(#) glaci válasza Hp41C hozzászólására (») Nov 14, 2020 /
 
Köszönöm szépen, átgondolom!
(#) oregharcos válasza eSDi hozzászólására (») Nov 14, 2020 /
 
Szia eSDi! Köszi az infót! Jelenleg úgy működik, hogy gomb nyomásra indul, ha a GP0-án letelik az időzítés, akkor a GP1-en jön ki magas szint addig míg újra nem indítom. Igaz, hogy csak Proteusban próbáltam. Minden jót!
(#) glaci válasza Hp41C hozzászólására (») Nov 16, 2020 /
 
Szia!
Van még egy megoldás. Mivel a timer0-val rendszeres megszakítást generálok más célra, bizonyos rövid időközönként figyelem a két port állapotát és kiértékelés után egy másik portot vezérlek, mintha megszakítás történt volna.
(#) kissi válasza glaci hozzászólására (») Nov 16, 2020 /
 
Szia!
Idézet:
„Mivel a timer0-val rendszeres megszakítást generálok más célra, bizonyos rövid időközönként figyelem a két port állapotát és kiértékelés után egy másik portot vezérlek, mintha megszakítás történt volna.”

Ez nem megszakítás ( a kérdésed arra irányult, nem alternatív megoldást kerestél!), mert a megszakításnak az a lényege, hogy valamilyen esemény bekövetkeztekor AUTOMATIKUSAN belép egy programhelyre, nem kell egyéb, előzetesen elvégzett utasítás!
Az más kérdés, hogy Te így is megoldod a feladatot, de ezt ne nevezzük megszakításnak !
A hozzászólás módosítva: Nov 16, 2020
(#) glaci válasza kissi hozzászólására (») Nov 16, 2020 /
 
Szia!
Igazad van! Erre utaltam a hozzászólás végén
Idézet:
„...mintha megszakítás történt volna.””
(#) glaci hozzászólása Nov 20, 2020 /
 
Sziasztok!
Ismét van egy kérdésem. LCD-re íratnék locsolással kapcsolatos kiíratni valókat itt a kód és kapott lcd kép
  1. if(!allapot.F0)
  2.      {
  3.         LCD_Cmd(_LCD_CLEAR); csat=1;
  4.         LCD_Out(1,2,"Menu  Csatornaszam");
  5.         //           12345678901234567890
  6.         LCD_Out(2,2,"Locsolasi ido:0.00 perc");
  7.       //  LCD_Cmd(_LCD_BLINK_CURSOR_ON);
  8.         allapot.F0=1;   //prografutás idulhat
  9.         allapot.F1=1;    //csatorna léptetés lehet
  10.         allapot.F5=0;//locsolás leáll
  11.      }
  12.  
  13.       //belépés menübe
  14.       while(allapot.F1)
  15.       {   //belépés a csatornaszám és idők beállításába
  16.         txt1[0]=csat/10+48;
  17.         if(txt1[0]==48){ txt1[0]=" "; }
  18.         txt1[1]=csat%10+48;
  19.         LCD_Out(1,21,txt1);    //csatornaszám kiíratás
  20.         allapot.F1 =0;
  21.       }


Vagyis a felső sor végén az "1" előtt van egy áltatalam nem kívánt karakter meg a legvégén is.
A hozzászólás módosítva: Nov 20, 2020
(#) Bakman válasza glaci hozzászólására (») Nov 20, 2020 /
 
Akkor csinál ilyet a kijelző, amikor vagy túl hosszúak a vezetékek, a nem használt bemenetek nincsenek GND-re kötve, a tápfeszültség bizonytalan vagy az időzítések határértéken vannak valahol. Nálad az első három valamelyike/kombinációja a valószínűbb.
A hozzászólás módosítva: Nov 20, 2020
(#) Hp41C válasza glaci hozzászólására (») Nov 20, 2020 /
 
Milyen programnyelvet használsz?
Az LCD_out() rendesen kiírja a szöveget, ha az konstans (program memóriában tárolt).
Ugyan ezt az LCD_out() -ot használod a txt1[] kiíratására is (ram -ban tárolt adat).
Az első sor kiíratása csak 18 karaktert ír ki, a 19. és a 20. -at nem írja felül.
  1. LCD_Out(1,2,"Menu  Csatornaszam  ");
  2. //           12345678901234567890123
  3. LCD_Out(2,2,"Locsolasi ido:0.00 perc");

Ha valamilyen C nyelv:
A csatornaszám karakterekre bontása után hiányzik a string lezárása: txt1[2] = 0;
A hozzászólás módosítva: Nov 20, 2020
(#) glaci válasza Bakman hozzászólására (») Nov 20, 2020 /
 
Szia!
A nem használt bemenetek földelve vannak, a tápfesz stabilizátorról megy a pic tápfesz lábain 100nF kondenzátorok. A hosszú vezetékek meg relatív.
Mint látható az alapkiírásoknál nincs gond, csak a változások kiírásánál.
(#) Peet19 hozzászólása Nov 20, 2020 /
 
Sziasztok!

A A PPSLOCKED mit jelent pontosan és mire jó? Nagyjából értem a jelentését de nem vagyok benne biztos és nem értem mire használható.

Előre is köszi a segítséget!
(#) glaci válasza Hp41C hozzászólására (») Nov 20, 2020 /
 
A programnyelv mikroc. A változó dekralálásakor előzőleg a txt1[2];
Most úgy csináltam, hogy txt1[]=" ";, vagyis értéket kapott, a csatornaszám kiírítása után elmaradt a nem kért karakter. De az elején még ott van
A hozzászólás módosítva: Nov 20, 2020
(#) Hp41C válasza glaci hozzászólására (») Nov 20, 2020 /
 
Ebben a sorban mind a 24 karakter helyére írj, a végén írj betűközöket.
  1. LCD_Out(1,2,"Menu  Csatornaszam  ");

Mit is csinál a
  1. txt1[]=" ";

sor.
Fogja a betűköz kódját (0x20) és beírja a txt1 kezdőcímére: txt1[0] = 0x20;
Mivel a karakterlánc végére ért a txt1 következő helyére beírja a string végjelet: txt1[1] = 0x00;
  1. txt1[0]=csat/10+48;
  2.         if(txt1[0]==48){ txt1[0]=" "; }
  3.         txt1[1]=csat%10+48;

Ezek a sorok módosítják a txt1[0] és txt1[1] értékét, azaz felülírtad a string végjelet. Ezért kellene a deklarációt
  1. unsigned char txt1[3];

-ra változtatni, a számolás során a txt1[2] = 0x00; sort beszúrni a LCD_out(1,21,txt1); sor elé.
Most már csak azt kéne tudni, mennyi is a csat értéke.
Ha csat/10+48 = 0x5E = 94 és csat%10 + 48 = 49, akkor csat csak 461 lehet...


Debugger szimulátor módban, töréspont beállítása a számolás első sorára, a program indítása. Amikor megáll a törésponton, a txt1 felvétele a Watch ablakba. Lépésenként vizsgálható hogyan is alakul az érték a txt1 byte -jaiban...
A hozzászólás módosítva: Nov 20, 2020
(#) glaci válasza Hp41C hozzászólására (») Nov 20, 2020 /
 
A kritikus részlet most így hibátlan:

  1. while(allapot.F1)  //belépés a csatornaszám és idők beállításába
  2.       {
  3.         txt1[0]=csat/10+48;
  4.         if(txt1[0]==48) txt1[0]=' ';
  5.         txt1[1]=csat%10+48;
  6.         for (i=0; i<2; i++) Lcd_Chr(1,21+i,txt1[i]);
  7.       }


vagyis a csatornaszámot karakterenként íratom ki. Mivel tudom, hogy a csatornaszám nem foglalhat több helyet, mint kettő helyiérték azaz 16-ot, így elegendő két elemű tömböt lefoglalnom.
A hozzászólás módosítva: Nov 20, 2020
(#) Hp41C válasza glaci hozzászólására (») Nov 21, 2020 /
 
Nem is kell hozzá a tömb:
  1. while(allapot.F1)  //belépés a csatornaszám és idők beállításába
  2.           {
  3.             char c;
  4.             c=csat/10+48;
  5.             if(c==48) c=' ';
  6.             Lcd_Chr(1,21,c);
  7.             c=csat%10+48;
  8.             Lcd_Chr_Cp(c);
  9.           }
(#) glaci válasza Hp41C hozzászólására (») Nov 21, 2020 /
 
Köszi ez is szuper!
(#) glaci hozzászólása Nov 22, 2020 /
 
Sziasztok!
Szeretnék megszakítást kiváltani pic16f887 RB1 portról, nyomógob használatával. A nyomógomb az RB1 lábat h-ról l-ba viszi. Ehhez milyen regisztereket kell beállítani?
Addig eljutottam, hogy az IOCB regiszter 1-es bitjét 1 be kell állítani és nyilván a TRISB-RB1-et 1 be,
Van még valami?
(#) Bakman válasza glaci hozzászólására (») Nov 22, 2020 /
 
Ezeket a biteket kell bekapcsolni: INTCON/GIE, INTCON/RBIE, IOCB/IOCB1. Az RB1-es lábra csak IOC megszakítást lehet beállítani, tehát mind L->H, mind H->L átmenetkor keletkezni fog megszakítás.

A megszakítás-kezelésben kiolvasod az RB1 állapotát (PORTB regiszter) és ha az 0, végrehajtod a feladatot. Ha 1, akkor csak az INTCON/RBIF bitet törlöd a feladat kihagyásával.
(#) glaci válasza Bakman hozzászólására (») Nov 22, 2020 /
 
Köszönöm szépen!
Következő: »»   1138 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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