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   818 / 1216
(#) ha1drp válasza kriszrap hozzászólására (») Jún 25, 2016 /
 
Nincs baj a programoddal, de vedd figyelembe, hogy ilyen alacsony sebesség mellett lassú lesz az utasítások végrehajtási ideje. Ha másképp nem megy vedd kisebbre a Delay_us értékeit. Fordítsd le, mérd meg a futásidőt és korrigálj. A mikroC tud debuggolni érdemes lenne megpróbálni,sokat segít a futásidő kiszámításában. De még jobb lenne, ha végre megoldódna az oszcillátor konfigurálásod, elvégre ez egy 64Mhz-es PIC.
(#) ha1drp válasza giskard hozzászólására (») Jún 25, 2016 /
 
Idézet:
„eddig még a zener-es megoldás is bevált”


Nálam nem volt zéner, csak kb 8-9 volt váltó, utólag derült ki nem is tudtam róla. Természetesen a PIC ma is fut.
(#) icserny válasza ha1drp hozzászólására (») Jún 25, 2016 / 1
 
A pontosság, a felbontás és a stabilitás az (legalább) három különböző dolog. A tápfeszültség jelentősen eltérhet a névleges értéktől (pl. 5 V helyett 4.7 V), s nincs különösebb igénye a hőfokstabilitásra, vagy hosszú idejű stabilitásra nézve. Ezek indokolhatják egy feszültségreferencia alkalmazását akkor is, ha rövid távon vagy egyedi kalibrációval a tápfeszültség is megfelelne.
(#) kriszrap válasza ha1drp hozzászólására (») Jún 25, 2016 /
 
csak nem tudom hogy kéne((
(#) ha1drp válasza kriszrap hozzászólására (») Jún 25, 2016 /
 
próbáld így:
SetBit(OSCCON,6);
SetBit(OSCTUNE,6);
Az IDE legyen 64MHz, a configban HFINTOSC legyen kiválasztva
(#) Elektro.on válasza ha1drp hozzászólására (») Jún 25, 2016 /
 
Szerintem a belső oszcillátor nem tud többet 8 MHz nél. Külső kvarcot kell használni.
(#) kriszrap válasza Elektro.on hozzászólására (») Jún 25, 2016 /
 
pll4 el nem lehet????
(#) ha1drp válasza Elektro.on hozzászólására (») Jún 26, 2016 /
 
A PIC18FxxK22 belső oszcillátora - HFINTOSC - mindig 16MHz. Adatlap 450. oldal

amúgy a MikroElektronika fórumán találtam:

void Init_Osc()
{
OSCCON.IRCF0=1;///Internal Oscillator Frequency Select bits, 16MHz
OSCCON.IRCF1=1;
OSCCON.IRCF2=1;
OSCTUNE.PLLEN=1; // 4x PLL
}
(#) Hp41C válasza giskard hozzászólására (») Jún 26, 2016 /
 
Átlagolj több mérés eredményét.
(#) jocka0012 hozzászólása Jún 26, 2016 /
 
Üdv!Itt az alábbi program részlet:
  1. char digit_select = 0;
  2. char segment_0 = 1;
  3. char segment_1 = 0;
  4.  
  5. void main(void)
  6. {
  7.    
  8.    
  9.         TRISB = 0x01;
  10.         TRISA = 0x00;
  11.        
  12.         GIE = 1;
  13.         INTE = 1;
  14.        
  15.     while(1)
  16.     {
  17.         digit_select++;
  18.        
  19.         if(digit_select == 1)
  20.         {
  21.             RB1 = 1;
  22.             display_number(segment_0);
  23.             __delay_ms(5);
  24.             RB1 = 0;
  25.         }
  26.        
  27.         if(digit_select == 2)
  28.         {
  29.             RB2 = 1;
  30.             display_number(segment_1);
  31.             __delay_ms(5);
  32.             RB2=0;
  33.         }
  34.        
  35.         if(digit_select == 3)digit_select=0;
  36.        
  37.     }
  38.         return;
  39. }
  40.  
  41. void interrupt ISR()
  42. {
  43.     if(INTF == 1)
  44.     {
  45.         INTF = 0;
  46.        
  47.         __delay_ms(1);
  48.        
  49.         if(INTF == 1)
  50.         {
  51.        
  52.         segment_0++;
  53.         if(segment_0 == 10)segment_0=0;
  54.    
  55.         }
  56.        
  57.         INTF = 0;
  58.     }
  59. }

Egy 16F628A-ra rá van kötve egy hét szegmenses kijelző és annyit szeretnék csak , hogy ha megnyomok egy gombot , ami az RB0-ra van kötve , akkor léptesse a kijelzőn a számot.Megszakítással szeretném megoldani , de valamiért van olyan , amikor 2-t léptet illetve olyan is előfordul , hogy megnyomom gombot és nem reagál.Tudna valaki segíteni , hogy mitől lehet ez?
(#) eSDi válasza jocka0012 hozzászólására (») Jún 26, 2016 /
 
Üdv!

A megszakításban megvizsgálod az INTF-et, majd törlöd és vársz, aztán újra megvizsgálod és végrehajtod a műveleteket és a legvégén megint törlöd az INTF-et. Gondold át még egyszer, kicsit sok itt a vizsgálás és törlés (Törölni csak egyszer a végén, ha már nincs rá szükség).
(#) Pali79 válasza jocka0012 hozzászólására (») Jún 26, 2016 /
 
Én nem ismerem ezt a programnyelvet, de amit írsz az inkább a nyomógomb pergése miatt szokott lenni. Vagy szoftveresen vagy hardveresen kellene megoldani a pergésmentesítést.
(#) jocka0012 válasza eSDi hozzászólására (») Jún 26, 2016 /
 
  1. void interrupt ISR(){
  2.  
  3.        If(INTF == 1){
  4.         segment_0++;
  5.        
  6.         INTF = 0;}
  7.     }
Elején ìgy volt a megszakitád függvény , de ugyan ez volt a jelenség azért irtam át.A nyomógomb pergésmentesitve van egy felhúzó ellenállással.
A hozzászólás módosítva: Jún 26, 2016
(#) Pali79 válasza jocka0012 hozzászólására (») Jún 26, 2016 /
 
Egy ellenállás nem pergésmentesít! Inkább a működéshez van köze. Gondolom az felhúzza a bemenetet Vdd-re és gomb lehúzza GND-re. A pergésmentesítéshez legalább kondi kellene, de méginkább egy 74LS00 vagy ilyesmi.
(#) eSDi válasza jocka0012 hozzászólására (») Jún 26, 2016 /
 
Így működne jól, hagyd így. A többszöri lépés a pergésmentesítés hiánya miatt van. Azt viszont, hogy néha nem lép, nem tudom mire fogni, mert nem vizsgálod a gomb állapotát.
(#) jocka0012 válasza Pali79 hozzászólására (») Jún 26, 2016 /
 
Valóban így van pergesmentesitve.Kondibol egy 100nf parhuzamosan a nyomogombbal?
(#) Pali79 válasza jocka0012 hozzászólására (») Jún 26, 2016 /
 
Akkor még egyszer elmondom, hogy az nem pergésmentesítés! Ha az ellenállás nem lenne, nem működne az egész. A 100nF a gombbal párhuzamosan jó lehet, de nem egy atombizos megoldás. A legjobb a NAND kapu alkalmazása.
(#) cross51 válasza jocka0012 hozzászólására (») Jún 26, 2016 /
 
Szerintem ez lenne a legegyszerűbb pergésmentesítésre:
  1. //...
  2. volatile char segment_0 = 1;
  3. //...
  4. void interrupt ISR() {
  5.  
  6.         if (INTF == 1) {
  7.                 delay_ms(10);
  8.                 if (!PORTBbits.RB0) segment_0++;
  9.                 INTF = 0;
  10.         }
  11. }

De ezt persze timerral is meg lehet csinálni, hogy ne időzzön 10ms-ot a megszakításban, INTIF == 1 elindul a timer vár körülbelül 10ms újra megszakítás és, ha még mindig nyomva van a gomb akkor növeled a segment_0-át. És amit használsz megszakításban használsz változó az volatile legyen.
(#) kriszrap válasza ha1drp hozzászólására (») Jún 26, 2016 /
 
Kedves ha1drp
Ezt nekem írtad?
Idézet:
„A PIC18FxxK22 belső oszcillátora - HFINTOSC - mindig 16MHz. Adatlap 450. oldal

amúgy a MikroElektronika fórumán találtam:

void Init_Osc()
{
OSCCON.IRCF0=1;///Internal Oscillator Frequency Select bits, 16MHz
OSCCON.IRCF1=1;
OSCCON.IRCF2=1;
OSCTUNE.PLLEN=1; // 4x PLL
}”
(#) kriszrap válasza (Felhasználó 15355) hozzászólására (») Jún 26, 2016 /
 
Azt hittem " Elektro.on" Elnézést......

  1. TRISA = 0;
  2.     TRISB = 0;
  3.     TRISC = 0;
  4.     TRISD = 0;
  5.     TRISE = 0;
  6.  
  7.     LATA = 0;
  8.     LATB = 0;
  9.     LATC = 0;
  10.     LATD = 0;
  11.     LATE = 0;

szerk:
ha program futása közbe melyikkel nullázzak TRIS al vagy LATal????
A hozzászólás módosítva: Jún 26, 2016
(#) cross51 válasza kriszrap hozzászólására (») Jún 26, 2016 / 1
 
Már mondtuk/mondtam ... TRIS az I/O irány LAT-al (vagy PORT-al) írod, hogy 1 vagy 0-a LAT-al a latch-t olvasod a PORT-al a láb-on lévő állapotot.
(#) kriszrap válasza cross51 hozzászólására (») Jún 26, 2016 /
 
Akkor a gomb ellenörzést POST al fogom ellenörizni??
  1. if(PORT.RA0!=0)
  2. {
  3.    //lenyomta a gombot
  4. }
A hozzászólás módosítva: Jún 26, 2016
(#) jocka0012 válasza cross51 hozzászólására (») Jún 26, 2016 /
 
Igazából lehet timerrel kene , mert nem akarom , hogy a gomb nyomvatartasanal vegig leptessen.Egy szivattyut akarok ezzel vizsgalni , hogy hanyszor kapcsol be egy nap alatt.
(#) cross51 válasza kriszrap hozzászólására (») Jún 26, 2016 /
 
De a PIC doksija sok mindenre jó ám... például az I/O leírásban mindent megtalálsz amit írtam és amit kérdezel.

IO.png
    
(#) cross51 válasza jocka0012 hozzászólására (») Jún 26, 2016 / 1
 
Mivel INT lábat használsz és a 628-asnál még csak az INT elvezérelt, tehát nem a nyomva tartással kell foglalkozni hanem az átfutó élekkel, hogy ne érzékelje a PIC pl.: 3 gombnyomásnak az egy gombnyomást.

  1. volatile unsigned char segment_0 = 1;
  2.  
  3. void interrupt ISR(void)
  4. {
  5.     static unsigned char btnPressed = 0;
  6.    
  7.     if (INTCONbits.INTIF)
  8.     {
  9.         if (!T0CONbits.TMR0ON && !btnPressed) T0CONbits.TMR0ON = 1;
  10.         INTCONbits.INTIF = 0;
  11.     }
  12.    
  13.     if (INTCONbits.T0IF && !btnPressed && !PORTBbits.RB0)
  14.     {
  15.         btnPressed = 1;
  16.         segment_0++;
  17.         INTCONbits.T0IF = 0;
  18.     }
  19.     else if (btnPressed && PORTBbits.RB0)
  20.     {
  21.         T0CONbits.TMR0ON = 0;
  22.         TMR0L = 0;
  23.         TMR0H = 0;
  24.         //ha 8 bites a timer 0 akkor csak az TMR0L kell torolni
  25.         btnPressed = 0;
  26.     }
  27. }

Én valami ilyesmit képzelek el lehet letesztelni most nem tudom, de működnie kell. És ez úgy lett megírva, hogy a gomb megnyomva '0'-a.
(#) Pali79 válasza pajti2 hozzászólására (») Jún 27, 2016 /
 
Idézet:
„Esetleg ha vannak hozzá szerelési anyagaid kéznél, hogy rárakj egy soros portot a pic kimenetére, viszonylag könnyű írni egy ciklust, ami hideg starton csak kiküldi soros portra a teljes általános célú memória állományt. Talán érdekes tapasztalat lesz, ha jellemzően csak egy kicsike területen fordulnak elő random bitek, vagy talán valami mintát is sikerül felfedezni benne.”

Valamiért ez ma eszembe jutott és megcsináltam. A hardver egy PIC16F628A, az első 4 memóriahelyet egy késleltető ciklus használja, mert másképp most nem tudtam megoldani a dolgot. Az eredmény több be-ki kapcsolás után minimális eltéréssel ugyan az:
  1. 01 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FD FF FF FF DF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF BF FF FF FF FF FF FF FF FF FF FF FF FF FD FF FF FF FF FF FF FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 01

Látható, hogy a legtöbb regiszter értéke FF, de van néhány ettől eltérő is, az érdekesség, hogy mindig ugyan azokon a területeken és mindig ugyanarra az értékre állnak be.
(#) don_peter válasza jocka0012 hozzászólására (») Jún 27, 2016 /
 
Megszakításba nem szoktunk késleltetést tenni, de ha már minden szakad és így oldottad meg akkor tegyél bele szoftveres pergés mentesítést.
  1. void interrupt ISR()
  2. {
  3.     if(INTF == 1)
  4.     {  
  5.         while(!PORTBbits.RB0); // __delay_ms(1);
  6.         segment_0++;
  7.         if(segment_0 == 10) segment_0=0;
  8.         INTF = 0;
  9.     }
  10. }

Ezzel azt éred el, hogy ameddig gomb nyomva marad, addig while() ciklus pörög és nem enged tovább.
Ha a gombot felengeded, akkor program tovább tud lépni.

Jelen esetben RB0 pin alacsony szintje jelenti azt, ha gomb nyomva van.
Ha viszont van lehetőség, akkor az egész programot újra gondolnám, mert arra amire neked kell nem feltétlen kellene megszakítást használni.
(#) jocka0012 válasza don_peter hozzászólására (») Jún 27, 2016 /
 
Van lehetőség újra gondolni.Nyitott vagyok mindenre ha tudsz benne segíteni..
(#) pajti2 válasza jocka0012 hozzászólására (») Jún 27, 2016 /
 
Ha aszinkron állapotgépekkel építesz fel mindent, és van főciklusod, ami emberi időn belül lefut, csinálhatsz állapotgépet arra is.

Tedd a prellezést külön szoftveres részbe, kelleni fog neked két függvény (vagy külön szoftveres részek a főciklusban), meg két változó. Az egyik 1 bites, érték 0-1 az aktuális "virtuális állapot", a másik legalább 3 bit-nyi számláló, értéke 0..7. Ha nincsenek bites mezőid, használhatsz egy byte-ot egészben, és magad szeded szét bitekre, aztán újra egybe gyúrod. A két függvény egyikét a gomb aktuális állapotát lekérdezni hívod be, a másikat a főciklusból frissíteni, az kezeli majd a prellezést. Amikor éppen a főciklus ráfut az ellenőrzésre, megnézed a gomb régi állapotát, a számlálódat, és beolvasod azt, amit éppen a port bemenet mutat. Ha a régi állapottal azonos beolvasásod van, a számlálót lenullázod. Ha nem, lépteted a számlálót 1-el, és amikor elért ilyen 5-6 értékig, kinullázod, és átírod az érték bitet is.

Ha éppen gyakorolni is kedved van, összerakni a fenti kis szösszenetet nem tudhat problémába ütközni, forráskódot egészben most nem írok.
(#) Hp41C válasza jocka0012 hozzászólására (») Jún 27, 2016 /
 
Következő: »»   818 / 1216
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