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   101 / 1210
(#) foxi63 válasza Fényt Kibocsájtó Leddióda hozzászólására (») Márc 9, 2011 /
 
IGEN!
Azonban a pontossága csak kvarcoszcillátorral garantálható.
(#) Fényt Kibocsájtó Leddióda válasza foxi63 hozzászólására (») Márc 9, 2011 /
 
Köszi.
Úgy érted a saját belsőjével nem?
Vagy milyen más lehetőség van?
555-el csaknem hajtom meg.
Villogó leddel se szivesen.
(#) icserny válasza Fényt Kibocsájtó Leddióda hozzászólására (») Márc 9, 2011 /
 
Idézet:
„Úgy érted a saját belsőjével nem?”
A saját belső oszcillátorához kívülről egy rezgőkvarcot kell kapcsolni, hogy pontos legyen az időalap. Mindez kiderül az alaplapi specifikációból és ajánlásokból, vagy a korábban ajánlott projektekből.
(#) trudnai válasza Fényt Kibocsájtó Leddióda hozzászólására (») Márc 10, 2011 /
 
Tul a pontossagon a PIC ha kulso, un. ora kvartzrol hajtja a timer moduljat, akkor akar olyan kicsi fogyasztas is elerheto, amivel a PIC egy LCD uveget megajtva ket ceruza elemrol evekig is akar elmegy. Ehhez a PIC-nek sokat kell aludnia. Szilva csinalt ilyen orat es ha jol tudom elfogadhato pontossaggal megy neki. Masik lehetoseg, ha un. RTC kulso ora aramkort illesztesz hozza es akkor nem kell mindig ujra programozni az idot, a PIC-nek csak annyi a dolga, hogy lekerdezze az idot mikor szuksege van ra.

De nezd meg a projecteket amiket icserny ajanlott...
(#) Báddzsó válasza icserny hozzászólására (») Márc 10, 2011 /
 
És még ezt a kvarcot "hangolni" sem árt, ami úgy oldható meg, hogy az egyik kondi helyett ami a kvarc és a negatív közt van azt egy trimmerkondival váltod ki és azt tekergeted úgy, hogy pontos legyen a freki. kb 0-3 ezred százalékkal lehet így változtatni a frekin.
itt egy példa: http://www.best-microcontroller-projects.com/pic-frequency-counter.html
(#) Prome hozzászólása Márc 11, 2011 /
 
Sziasztok!

Nem tudjátok van e valahol pic szimulátor?
(#) potyo válasza Prome hozzászólására (») Márc 11, 2011 /
 
De igen. Benne van az MPLAB-ban!
(#) Prome válasza potyo hozzászólására (») Márc 11, 2011 /
 
Köszi, de az a baj, a kezdők közt is kezdő vagyok.
Mi az az MPLAB?
(#) Prome válasza Prome hozzászólására (») Márc 11, 2011 /
 
Na utánanéztem erről már van infó.
Most egy más kérdés:
Tudtok e olyan próbapanelről ami egy sokoutputos pic próbájára jó sok sok leddel?

Inkább ilyenen gyakorolnék.
Köszi
(#) Harry hozzászólása Márc 12, 2011 /
 
segítségeteket szeretném kérni ismét. CCP-vel próbálkozunk, beüzemelni a capture modult.
Nagyon elején járunk a fázisban, viszotn nem nagyon akaródzik működni a dolog. Egy nyomógomb és egy LED-ről van szó.

-PIC16F887, 4MHz, mikroC compiler,
-LED az RC1-en,
-CCP1-en pedig egy felhúzóellenálláson keresztül állandó VCC-t kap, nyomógombbal pedig leföldelem.

Annyit szeretnénk elérni, hogy ha megnyomjuk a nyomógombot, a LED felvillanjon.

Íme a kódrészlet:
  1. void interrupt(){
  2.  
  3.       if(INTCON.CCP1IF==1)    
  4.       {    
  5.          RC1_bit=1;
  6.       //INTCON.CCP1F=0; //clear, nem akartam törölni, egyenlőre ha érzékeli a jelet akkor világítson a led
  7.       }
  8.    
  9. }
  10.  
  11. void main()      
  12. {
  13.    INTCON.GIE=1;
  14.    INTCON.PEIE=1;
  15.    PIE1.CCP1IE=1;
  16.    CCP1CON=0x04;   //lefutó élre érzékeny
  17.  
  18.    ANSEL  = 0;                                    // Configure AN pins as digital I/O
  19.   ANSELH = 0;
  20.   C1ON_bit = 0;                                  // Disable comparators
  21.   C2ON_bit = 0;
  22.  
  23.  
  24.   TRISC2_bit=1; //CCP1 input
  25.   TRISC1_bit=0; //RC1 output (ami egyben CCP2- is)
  26.   RC1_bit=0;               //kinullázom a LED-et
  27.  
  28.   while(1){
  29.   //INTCON.CCP1IF=1; //tesztelés miatt volt benn
  30.  
  31.    }
  32.  
  33. }


A dolog nem akar működni, pedig e szerint, mikor megnyomom a nyomógombot és elengedem, pergés nélkül is keletkezik egy le és egy felfutó él is.
Pedig a led ezt nem jelzi.
A kód jó lenne szerintetek? Vagy kihagytunk belőle valamit?
a kritály frekvenciáját, illetve a PIC egy két alapbeállításást a program menüjéből lehet állítani.

Előre is köszönöm
(#) watt válasza Harry hozzászólására (») Márc 12, 2011 /
 
A megszaíításokat akkor engedélyezd, amikor már mindent beállítottál. Nem néztem jobban utána, és a microC-t sem ismerem, ezért egyelőre csak ennyi...

Azt nézted, hogy a LED világít-e? (direktben bekapcsolni)
(#) Hp41C válasza Harry hozzászólására (») Márc 12, 2011 / 1
 
Szia!

Nem jó ötlet, ha nem törlöd a megszakítás kiváltó okot a kiszolgáló rutinban: A kontroller az első elfogadás után a kiszolgáló rutinból való kilépéskor újra érzékelni fogja a régi kérést, megint a kiszolgáló rutin fog lefutni, a főprogram futtatására nem marad ideje...

A CCP1IF bit nem az INTCON, hanem a PIR1 regiszterben van.
(#) zenetom válasza watt hozzászólására (») Márc 12, 2011 /
 
Idézet:
„A megszaíításokat akkor engedélyezd, amikor már mindent beállítottál.”

Ha egy Timer0 modult akarok működtetni, akkor először a Timer0 (nálam ez most a T0CON regiszter)-t érdemes beállítani, és utána a megszakítás-vezérlő regisztert (INTCON)?
Gondolom azért célszerű így, mert így rendesen el tud indulni a Timer0.
Bár én most fordítva állítottam be (először az INTCON-t, utána pedig a T0CON-t), de elvileg jól megy.
szerk.: ja és ASM nyelven valósítom meg.
(#) potyo válasza zenetom hozzászólására (») Márc 12, 2011 /
 
Mindig el tud indulni rendesen, csak pl. ha először engedélyezed a megszakítást, majd utána állítgatsz még valamit, akkor közben előfordulhat olyan megszakítás, amire nem számítasz és esetleg még valami nincs inicializálva, amit a megszakítási rutin esetleg használna. Gyakran teljesen mindegy a sorrend, de mégis jó szokás, ha mindig az inicializálás legvégén billented 1-be a globális megszakításengedélyező bitet.
(#) Harry válasza Hp41C hozzászólására (») Márc 12, 2011 /
 
Köszönjöm a gyors válaszokat, mindegyikből tanultam, de a közvetlen megoldást az jelentette, hogy:

"A CCP1IF bit nem az INTCON, hanem a PIR1 regiszterben van."

A legszörnyűbb az egészben, hogy a compiler nem szólt miatta hogy INTCON.CCP1IF nincs, és este volt szerencsénk elnézni

Örök hála. Mégegyszer köszi mindenkinek.
(#) potyo válasza Harry hozzászólására (») Márc 12, 2011 /
 
Idézet:
„A legszörnyűbb az egészben, hogy a compiler nem szólt miatta hogy INTCON.CCP1IF nincs”


Igen, ez sajnos hosszú idő óta megoldatlan probléma. Ugyanis az van a header fájlokban, hogy pl. az INTCON mint konstans értéke 0x0B, a CCP1IF értéke 0x04, és a fordító csak behelyettesíti a konstansok helyére a számokat és részéről ennyivel le van rendezve. Írhatsz pl. BSF PORTA, RB0-t is, ami nyilvánvalóan logikátlan, mégis simán elfogadja és az PORTA, RA0 bitet fogja bebillenteni.
(#) zenetom válasza potyo hozzászólására (») Márc 12, 2011 /
 
Én is valahogy így gondoltam, köszi a választ! :yes:
(#) szitko hozzászólása Márc 12, 2011 /
 
Sziasztok.
Szeretnék egy-két (remélhetőleg megválaszolható) kérdést feltenni.
1. Hogyan lehet kiszámolni az AD konverzió késleltetését. Pontosabban az alábbi részletre vagyok kíváncsi.
MOVLW B’11000001’ ;ADC Frc clock,
MOVWF ADCON0 ;AN0, On
CALL SampleTime ;Acquisiton delay
BSF ADCON0,GO ;Start conversion
BTFSC ADCON0,GO ;Is conversion done?
A progiban amit csatoltam az "advar" késleltetést csak saccra adtam meg, mert mikor az érték ".10" volt a mostani ".50" helyett, a PIC leállt amikor a potit lecsavartam a GND felé. Persze ebbe beleszól a "call Delay" késleltetés is, csak ott még nem fejeztem be a progit.
2. A másik kérdésem az lenne, hogy lehet-e olyat csinálni, hogy pl. villog egy led egy kimeneten X ideig, a kimeneten történő változást (a villogást)elmentem a PIC EEPROM-jába, és egy X idő után visszajátszom.

pwm_ccp.asm
    
(#) szkkteam hozzászólása Márc 13, 2011 /
 
Hello. Pickit 2-t használok, és az lenne a kérdésem, hogy érdemes-e használni az LVP mode-ot? Vagy tulajdonképpen mi is annak az előnye?
(#) icserny válasza szkkteam hozzászólására (») Márc 13, 2011 /
 
1. Nem
2. Az LVP előnye az, hogy 5 V-os jelszintű logikai jelekkel is lehet programozni "négy szál dróttal". A hátrány az, hogy a PGM lábat lefoglalja a programozás / programfuttatás módok közötti váltás vezérlése, tehát eggyel kevesebb I/O láb lesz.
(#) szkkteam válasza icserny hozzászólására (») Márc 13, 2011 /
 
Lehet, hogy nagyon noob lesz a kérdés, de hogy kapcsolom ki az LVP módot? jelenleg ott vagyok, hogy a PGM láb, az fel van húzva a tápra, de egy jumperrel oldottam meg, szóval a levegőben is hagyhatom lógni. A másik kérdésem az lenne, hogy én a PIC belső oszcillátorát szeretném használni, a config biteknél akkor az Oscillator-t mire kell állítanom? (PIC16F887)

válaszodat előre is köszi.
(#) watt válasza szkkteam hozzászólására (») Márc 13, 2011 /
 
A config biteknél lehet kikapcsolni az LVP-t és belső oszcira állítsd természetesen az oszcit, ha azt akarod használni.
Az adatlapban minden benne van, nekem is azt kéne megnézzem konkrét értékekért, szerintem ezt meg tudod tenni magad is.
(#) szkkteam válasza watt hozzászólására (») Márc 13, 2011 /
 
Tényleg megvannak köszi, most már a debug mód is jó. Viszont esetleg valakinek van ötlete, hogy miért van az, hogy a debug módban simán tudom futtatni a programom, viszont amikor lehúzom róla a pickit 2-t és ráadom a tápot, sehogy sem akar elindulni a ráégetett program? Tápfesz megvan, MCLR tápra húzva, egyszerűen nem értem.
(#) potyo válasza szkkteam hozzászólására (») Márc 14, 2011 / 1
 
Azért, mert a normál futáshoz nem debug buildet kell készíteni. Válaszd ki a Programmer->Pickit2-t, fordítsd újra és úgy égesd be.
(#) szkkteam válasza potyo hozzászólására (») Márc 14, 2011 /
 
Köszönöm segítséged, minden működik.
(#) SaNyEee1986 hozzászólása Márc 14, 2011 /
 
Sziasztok!

Segítségre lenne szükségem, problémám a következő:

Fordulatszámot szeretnék majd kiírni Grafikus LCD kijelzőre, Capture + Timer1-el, belső OSC-vel.
Jelenleg próbaképp csak időt szeretnék mérni két gombnyomás között, ami eleinte jól is megy, de X gombnyomás után nem frissíti a kijelzést. A kódban lehet látni, hogy hőmérsékletet is mér. Azt a "lefagyás" után tökéletesen frissíti és jól mutatja, csak a gombnyomások közötti időt az istennek sem akarja. A PIC memóriája nincs betelve, tehát ez nem lehet a probléma. Ezt úgy kell elképzelni, hogy kb. 30-szor megnyomom a gombot(nincs pergésmentesítve) 1 másodperces időközökkel 15-öt mutat mindig, mert annyit is kell (timer2 túlcsordulásainak száma). de kb. 30 gombnyomás után nem frissít tovább. Valamikor ez hamarabb következik be, valamikor később. Jelgenerátorral is próbáltam, ott is néhányat kijelzett utána se kép se hang.

A pontosítás után rákötöttem a CCP1-et egy jelgenerátorra, hogy pontos 1HZ-s jelet kapjon a PIC, és a túlcsordulás száma pontosnak mondható, de a TMR1 értéke nem áll be pl. egy 500Hz-s értéknél fix értékre. 15 Hz-es freki után 0-t kell kijeleznie és ez megy is, de az említett probléma miatt csak rövid ideig. Mondom, hőmérsékletet frissíti a hiba beállta után is.

Íme a kódrészlet:

  1. char GLCD_DataPort at PORTD;
  2.  
  3. sbit GLCD_CS1 at RC6_bit;
  4. sbit GLCD_CS2 at RC5_bit;
  5. sbit GLCD_RS  at RC0_bit;
  6. sbit GLCD_RW  at RC7_bit;
  7. sbit GLCD_EN  at RC3_bit;
  8. sbit GLCD_RST at RC4_bit;
  9.  
  10. sbit GLCD_CS1_Direction at TRISC6_bit;
  11. sbit GLCD_CS2_Direction at TRISC5_bit;
  12. sbit GLCD_RS_Direction  at TRISC0_bit;
  13. sbit GLCD_RW_Direction  at TRISC7_bit;
  14. sbit GLCD_EN_Direction  at TRISC3_bit;
  15. sbit GLCD_RST_Direction at TRISC4_bit;
  16.  
  17. unsigned int ido_seged=0;
  18. unsigned int tulcsordul=0, nyomas=0, nyomas2=0, ido_L=0, ido_H=0;
  19.  
  20. unsigned temp;
  21. unsigned int fuel2;
  22. char text[15], *text2;
  23. int seged=0;
  24.  
  25. void nyomas_kiir()
  26. {
  27.    
  28.         delay_ms(100);
  29.         WordToStr(ido_H, text);
  30.         Glcd_Write_Text(text, 35, 6, 1);
  31.        
  32.         WordToStr(ido_seged, text2);
  33.         Glcd_Write_Text(text2, 35, 7, 1);
  34.         ido_seged=0;
  35.                
  36.  nyomas2=0;
  37. }
  38.  
  39. void interrupt()
  40. {
  41.       if(PIR1.CCP1IF==1)
  42.       {
  43.  
  44.       nyomas2=1;
  45.       ido_L=CCPR1L;
  46.       ido_H=CCPR1H;
  47.       CCPR1L=0;
  48.       CCPR1H=0;
  49.       delay_ms(100);
  50.       tulcsordul=0;
  51.  
  52.          PIR1.CCP1IF=0;
  53.       }
  54.      
  55.       if(PIR1.TMR1IF)
  56.       {
  57.       ido_seged++;
  58.       if(ido_seged==6000)
  59.       ido_seged=0;
  60.       delay_ms(100);
  61.  
  62.       TMR1L=0;
  63.       TMR1H=0;
  64.       PIR1.TMR1IF=0;
  65.       }
  66. }
  67. void main()
  68. {
  69.  
  70.      ANSEL=0x01;
  71.      ANSELH=0x00;
  72.      C1ON_bit=0;
  73.      C2ON_bit=0;
  74.  
  75.      T1CON=0x01;
  76.      PIE1.TMR1IE=1;
  77.      PIE1.CCP1IE=1;
  78.      INTCON.GIE=1;
  79.      INTCON.PEIE=1;
  80.      CCP1CON=0x04;
  81.      RC2_bit=1;
  82.      TRISC2_bit=1;
  83.      TRISC1_bit=0;
  84.      RC1_bit=0;
  85.  
  86.      Glcd_Init();                                   // Initialize GLCD
  87.      Glcd_Fill(0x00);                               // Clear GLCD
  88.      TRISA=0xFF;                                    // PORTA is input
  89.      TRISE=0x00;
  90.  
  91.      Glcd_Set_Font(Font_Glcd_System5x7, 5, 7, 32);
  92.      Glcd_Write_Text("Temp:", 3, 1, 2);
  93.        
  94.   do
  95.   {
  96.         ow_reset(&PORTE,2);
  97.         ow_write(&PORTE,2,0xEE);
  98.         ow_reset(&PORTE,2);
  99.         ow_write(&PORTE,2,0xAA);
  100.         temp=ow_read(&PORTE,2);        
  101.  
  102.         Glcd_Set_Font(Font_Glcd_Character8x7, 8, 7, 32);
  103.         WordToStr(temp, text);
  104.         Glcd_Write_Text(text, 71, 1, 1);
  105.  
  106.         if(nyomas2==1)
  107.         nyomas_kiir();
  108.  
  109.   } while(1);
  110. }



-PIC16F887, 4MHz, mikroC compiler,

-A kristály frekvenciáját, illetve a PIC egy két alapbeállítását a program menüjéből lehet állítani.

Kérlek segítsetek, mert nem tudom hol lehet a hiba.


Előre is köszönöm
(#) balazs24 hozzászólása Márc 18, 2011 /
 
Sziasztok!
Hogyan lehet egy 2x16 karakteres LCD kijelzőt PIC-el vezérelni úgy, hogy egy nyomógomb hatására váltsa a szöveget? Pl. Meg van adva 10 szöveg és ezeknek egymás után meg kell jelenniük a gombnyomás hatására.

Sima szöveg kiirás az lcd-re megvan, a kapcs. rajzot mellékeltem, a progi:
  1. program Lcd;
  2. var i:byte;
  3. t1:string[16];
  4. t2:string[16];
  5. {--------------------------------------------------------}
  6.  
  7. begin
  8.  
  9.   i:=0;
  10.   t1:='*** LCD teszt **';
  11.   t2:='*** 123456789 **';
  12.   Lcd_Config(PORTB,7,6,5,4,PORTB,1,2,3);
  13.   while True do begin
  14.     t2[i mod 16]:=32+i;
  15. LCD_Cmd(LCD_CLEAR);
  16. LCD_Cmd(LCD_CURSOR_OFF);
  17. LCD_Out(1,1,t1);
  18. LCD_Out(2,1,t2);
  19.   i:=(i+1) mod 96;
  20. Delay_ms(500);
  21.   end;
  22. end.

picLcd.gif
    
(#) szkrep válasza balazs24 hozzászólására (») Márc 18, 2011 /
 
Én létrehoznék egy változót, amit növel a gombnyomás. Ha eléri a szövegek számának értékét, lenullázod. Egy végtelen ciklusban mindig megvizsgálod az értékét, és ha 1, akkor egyik szöveg, ha 2, másik, stb...
Vagy egy tömböt csinálsz a kiírandó stringekből, és a változó szerint a tömb más-más elemét írod ki.
Konkrét kóddal nem tudok segíteni, ezt a nyelvet nem ismerem.
(#) balazs24 válasza szkrep hozzászólására (») Márc 18, 2011 /
 
A programozási rész nekem is megy, inkább az lenne a kérdés, hogy hogyan kössem rá a gombot?
(#) szkrep válasza balazs24 hozzászólására (») Márc 18, 2011 /
 
A PIC lábat 4,7k ellenállással tápra kötöd, a gomb pedig a láb és a föld közé megy (nyitott állapotban). Tehát gombnyomáskor alacsonyan lesz a láb.
Következő: »»   101 / 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