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   839 / 1210
(#) zenetom válasza gabilow hozzászólására (») Aug 20, 2016 /
 
A fordító készít assembly fájlt? Ha igen, kíváncsi vagyok mi van benne, feltöltenéd?
(#) ktamas66 válasza gabilow hozzászólására (») Aug 20, 2016 /
 
Az utasítások is időt visznek el, csökkentsd a késleltetést 19-re.
A PIC-nek csak 4MHz belső órajele van, ha mást szeretnél külső megoldás kell. A programod ezt nem tudja és úgy számolja az időzítést mintha 8 lenne, ezért tart dupla ideig.
(#) gabilow válasza zenetom hozzászólására (») Aug 20, 2016 /
 
Köszi,holnap otthonról feltöltöm.
Ktamas66: bármennyire csökkentem ez a plafon. Akkor elvileg, ha külső 20 MHz-es kvarcot használok a PIC 5x gyorsabb lesz és az időzítés sem változik? Persze ha a PIC alkalmas rá?
(#) Hp41C válasza gabilow hozzászólására (») Aug 20, 2016 / 1
 
Idézet:
„Az utasítások is időt visznek el...”

Nagy igazság, főleg a goto, aminek a végrehajtása kétszer olyan hosszú ideig tart, mint a többié. 4MHz -en egy normál utasítás végrehajtása 1us, a goto, call, return, retfie -e pedig 2us.
Tegyük fel, hogy a fordító jó kódot készít a WaitUs 20 utasításhoz. Ekkor ezek végrehajtása 2*20us. Ehhez jön még 1-1 us a port állítására és 2 us a goto végrehajtásához. A periódusidő 44us, a frekvencia 22.73 kHz.
Ha a 3. sorban WaitUs 19, az 5. sorban WaitUs 17 szerepelne, a periódusidő (1+19+1+17+2) = 40us lenne, a frekvencia 25kHz lenne...
  1. kezd:
  2.  bsf GPIO,2
  3.  nop   ;; 19 nop összesen
  4.  ...
  5.  bsc GPIO,2
  6.  nop   ;; 17 nop összesen
  7.  ...
  8.  goto kezd
A hozzászólás módosítva: Aug 20, 2016
(#) pajti2 válasza Hp41C hozzászólására (») Aug 20, 2016 /
 
Esetleg valami ilyesmit is meg lehetne próbálni:
  1. clrw
  2.  addlw 2
  3. kezd:
  4.  xorwf GPIO,1
  5.  nop   ;; valamennyi
  6.  ...
  7.  nop
  8.  goto kezd


Könnyebb az időbeli szimmetriát kezelni vele.
(#) gabilow válasza Hp41C hozzászólására (») Aug 20, 2016 /
 
Köszi. Ha viszont ráteszek egy 20 MHz-es kvarcot és a programban is beállítom a 20 MHz-et, akkor 200ns lesz egy ciklus (adatlap szerint is), mennyire lesz stabil a működés, így nagyon csúcson járna?
(#) Pali79 válasza gabilow hozzászólására (») Aug 20, 2016 /
 
Teljesen stabilnak kell lennie 20 MHz-en is.
(#) Hp41C válasza gabilow hozzászólására (») Aug 20, 2016 /
 
Mehet 20MHz -n is, de akkor a port állítása 200ns, a goto végrehajtása 400ns lesz.
(#) Poostmaster válasza Poostmaster hozzászólására (») Aug 20, 2016 /
 
Megcsináltam 629-re is a programot, a LED-eket pedig kibővítettem 2-vel. Az egyik a 0-2 lábon, a másik pedig az 1-3-ason van, ugyanabban az állásban, mint a többi. Itt a program:
  1. // CONFIG1
  2. #pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
  3. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  4. #pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
  5. #pragma config MCLRE = ON       // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
  6. #pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
  7. #pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
  8. #pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
  9.  
  10. #define _XTAL_FREQ 4000000
  11.  
  12.  
  13. void main(void) {
  14. /**/
  15.     TRISIO=0b00111100;      // alapban  xx543210
  16.     WPU = 0b00111100;
  17.     GPIO=0b00000001;        
  18.     __delay_ms(500);
  19.     TRISIO=0b00111001;      
  20.     WPU=0b00111001;      
  21.     GPIO=0b00000010;
  22.     __delay_ms(500);
  23.     TRISIO=0b00101011;  
  24.     WPU=0b00101011;      
  25.     GPIO=0b00000100;
  26.     __delay_ms(500);
  27.     TRISIO=0b00001111;  
  28.     WPU=0b00001111;      
  29.     GPIO=0b00010000;
  30.     __delay_ms(500);
  31.     TRISIO=0b00011110;  
  32.     WPU=0b00011110;      
  33.     GPIO=0b00100000;
  34.     __delay_ms(500);
  35.  // Itt lesz a baj
  36.    TRISIO=0b00111010;  
  37.     WPU=0b00111010;      
  38.     GPIO=0b00000001;
  39.     __delay_ms(500);
  40.  
  41.    TRISIO=0b00101101;  
  42.     WPU=0b00101101;      
  43.     GPIO=0b00000010;
  44.     __delay_ms(500);
  45. }


A gond most az, hogy bár szépen végigmegy mindegyiken, amikor a 0-2 lábakon levőt kapcsolja, (a jelölt helyen) akkor nem csak az világít, hanem a 0-1-es is fél fénnyel.
no de miért?
(#) gabilow hozzászólása Aug 20, 2016 /
 
Köszi mindenkinek,sokat tanultam.
(#) Lamprologus hozzászólása Aug 20, 2016 /
 
Előfordulhat az, hogy amikor engedélyezek egy megszakítást ( enable_interrupts(INT_TIMER2); ) az egyből le is fut?
  1. setup_timer2(TMR_INTERNAL | TMR_DIV_BY_256,655);
  2.  
  3.             set_timer2(0);
  4.             enable_interrupts(INT_TIMER2);

Nem úgy kéne működnie, hogy akkor fut le a megszakításban szereplő programrészlet amikor eléri az időt?
(#) pajti2 válasza Lamprologus hozzászólására (») Aug 20, 2016 /
 
A megszakítás akkor éleződik, amikor egy órajel érzékeli, hogy az interrupt flag aktív, és az interrupt élezése nincsen tiltva a kiértékelési láncban. Az int flageket azért is kell mindig kapcsolni az interrupt kezelőből. Ha aktív volt a trigger, és engedélyezted a kiértékelési láncban az utolsó kizárást is, akkor teljesen normális, hogy azonnal a megszakítási rutinod kapjon behívást. A kiértékelési lánc elemeiről az adatlap általában mindent szájbarágósan leír.
(#) Lamprologus válasza pajti2 hozzászólására (») Aug 20, 2016 /
 
Idézet:
„Az int flageket azért is kell mindig kapcsolni az interrupt kezelőből...”
Aha ... Csak C-be abban bíztam, hogy ezeket megoldották helyettem!
(#) Zsora válasza Lamprologus hozzászólására (») Aug 20, 2016 /
 
Már az engedélyezéskor is aktív lehet a jelzőbit, így azonnal be is lép a megszakítási rutinba. Ezt úgy tudod elkerülni, ha közvetlenül az engedélyezés előtt törlöd a jelzőbitet, és az időzítőt is akkor indítod.
(#) sonajkniz válasza Poostmaster hozzászólására (») Aug 20, 2016 /
 
Ellenőrízd, hogy a kérdéses, fél fényerőn világító ledhez tartozó, bemenetként beállított lábon nincs-e bekapcsolva a belső felhúzó ellenállás!
(#) pajti2 válasza Lamprologus hozzászólására (») Aug 20, 2016 / 1
 
Vannak azok a mindenféle attribok a C függvény fejlécekben, de azok a megszakítás kiszolgálóhoz tartoznak. Ott egyáltalán lehet esélye a fordítónak, hogy értesüljön róla, hogy te implicite kezeltetni szeretnél vele valamit. Viszont a főprogramod init részében ugyan hogyan értesülhetne róla?

Alapinit helyett a főprogramhoz csak annyi van, hogy a GlobalInterruptEnable bit mindegyik pic-en tradicionálisan inaktívként alapinitel hideg reset után. Egyetlen interrupt sem tud éleződni úgy. Meg talán egy szintnyivel lejjebb is inaktív mindegyik csoport mindegyik pic-en, de abban már nem vagyok biztos. Interrupt éleződni csak akkor fog, ha bekapcsolod a csoport engedélyezést, és a global flaget is. Margóra széljegyzetnek: a megszakítás kiszolgáló periféria is olyan, mint bármelyik másik. Nem muszáj bekapcsolni, de ha bekapcsoltad, figyelned kell minden egyes bitjére. Rendesen alapinitelned kell előtte, amit külön ki kell nulláznod, azt külön ki kell nulláznod, stb, stb. Kissé talán alábecsülted a jelentőségét, hát ne tedd.

Az asm és a Cxx még sokkal inkább hardver közeli környezetek. Talán a microC és a Basic meg hasonló szintű SDK-k már lekezelnek neked automatán ezt-azt, de a C18 / C30 / C32 fordítók még alig többek, mint az asm kicsit kényelmesebb változatai.

Van a Cxx fordítóknak olyan kapcsolója, hogy generáljon lista file-t. Ha van valami asm vénád is, abban mindent konkrétan végig nézhetsz, mit rakott bele a fordító, és mit nem.

Az XC fordítók configjaiban meg ofc annyi hiba van még mindig, hogy részemről azokkal egyáltalán nem is foglalkozom. Csinálják meg normálisra, én addig bottal sem piszkálom.
(#) ktamas66 válasza gabilow hozzászólására (») Aug 20, 2016 /
 
Én kipróbálnám hogy pl. az alábbi megoldásból mekkora frekvencia kerekedik ki, abból már lehetne következtetni mekkora késleltetés kell.
  1. kezd:
  2.     High GPIO.2
  3.     Goto kezd2
  4. kezd2
  5.     Low GPIO.2
  6.     Goto kezd
(#) kissi válasza Lamprologus hozzászólására (») Aug 20, 2016 /
 
Szia!
Az nem lenne jó dolog, ha ez automatán menne... Van amikor később akarom engedélyezni, van, amikor menet közben is tiltom, majd újraengedélyezem...Nem lenne jó, ha a fordító "egyből" engedélyezné, majd ha Te utasítod rá, akkor tegye !
(#) Poostmaster válasza sonajkniz hozzászólására (») Aug 20, 2016 /
 
Be van kapcsolva.
Mindegyiken, amelyik bemenetre van állítva.
De már rájöttem, hogy a PK2 csinálja, amiről futtatom. Ha lehúzom, és külső tpról megy, akkor nem világít.
(#) Kapagerenda hozzászólása Aug 20, 2016 /
 
Sziasztok,
A mikrokontroller vezérléséhez 3 különböző kapcsolót használok. Az SW2 és az SW3 normálisan működnek. Ha az SW1 -et megnyomom megőrül az egész, mindenféle össze-visszaságok jellenek meg a kijelzőkön. Próbáltam másik lábára kötni a mikrokontrollernak és cseréltem kapcsolót is ,de a próbléma maradt. A felhúzó ellenálások különböző értékűek mivel sajnos csak ilyen ellenálásaim voltak otthon, viszont mindegyik legalább 100k értékű. Mellékeltem a kapcsolási rajzot. A pic és a kijelző közé képzeljétek oda az ellenálásokat a valóságban ott vannak. Lehet a próbléma a próbapanelos megoldás miatt van és a sok vezeték miatt zavarjelek alakultak ki?
(#) Pali79 válasza Kapagerenda hozzászólására (») Aug 20, 2016 /
 
Én nem látom a rajzot....
(#) don_peter válasza Kapagerenda hozzászólására (») Aug 20, 2016 /
 
Program hiba lesz az.. Nem látszik a kapcsolás..
(#) Kapagerenda hozzászólása Aug 20, 2016 /
 
Bocsi

p.png
    
(#) Pali79 válasza Kapagerenda hozzászólására (») Aug 20, 2016 /
 
Szinte biztos, hogy programhiba. Ha mutatod a forrást, nem fogunk tudni segíteni.
(#) Kapagerenda válasza Pali79 hozzászólására (») Aug 20, 2016 /
 
Amikor először összeraktam a próbapanelen akkor jól működött és a proteusban is teszteltem és ott is okés a dolog.
(#) don_peter válasza Kapagerenda hozzászólására (») Aug 20, 2016 /
 
Pali azt akarja mondani, hogy muti meg a forrást mert akkor tudunk csak segíteni, ha látjuk mit írtál

Tovább:
RB0, RB1, RB2-őt digitális bemenetre kell állítani.. A bekötés stimmel.
Programba, ha nem használsz megszakítást és C-ben írod, akkor:
  1. if(!PORTBbits.RB0){    // Ha lenyomtad a gombot
  2. while(!PORTBbits.RB0);    // Várakozol a gomb felengedéséig (pergés mentesítés)
  3. //...stb
  4. }
A hozzászólás módosítva: Aug 20, 2016
(#) Kapagerenda válasza don_peter hozzászólására (») Aug 20, 2016 /
 
Értem én hogy jó lenne a forráskód, de hogy azon csak én igazodok ki az is biztos azért nem akartam ide bemásolni.
Digitálisra vannak állítva a bemenetek, a pergés mentesítést rárakom. Kösz!
(#) Tasznka válasza Kapagerenda hozzászólására (») Aug 20, 2016 /
 
Szia!
Én még tennék 100n kondikat a nyomókkal párhuzamosan.A pergést szűrd ki szoftveresen.
Ezekkel a felhúzó ellenállásokkal(eléggé nagyok) bármilyen zaj bezavarhat annyira ,hogy úgy érzékelje,mintha lenyomtad volna a nyomót .
(#) pajti2 válasza Tasznka hozzászólására (») Aug 20, 2016 /
 
Szerintem sok lesz oda a 100n. Beszikrázik tőlük a kapcsoló, oxidálódik a kapcsoló felület. Pici szikra, pici korom, de összegyűlik. Kapcsolókkal párhuzamosan én 1n-nál többet nem raknék.
(#) Tasznka válasza pajti2 hozzászólására (») Aug 20, 2016 /
 
Azt csak példának írtam,mert én azt használom.Csak én a nyomó és a bemenet közé szoktam tenni ellenállást és ott a kondi,így nem közvetlenül a nyomó süti ki.De ekkora felhúzókhoz kell kondi,hogy a tüskéket megfogja.
Következő: »»   839 / 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