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   262 / 1210
(#) Zsora válasza Stadi hozzászólására (») Máj 29, 2012 / 1
 
Igen, a pergés mind összeérintkezéskor, mind szétváláskor jelentkezik. A legegyszerűbb megoldás az pergésmentesítésre, ha a gombok olvasását bizonyos időközönként lefutó megszakítási rutinban helyezzük el, ami eltárolja azokat egy változóba. A főprogram pedig ezt a változót ellenőrzi csak.
Ezt lehet finomítani is:
A megszakítási rutinban a változót csak akkor állítjuk be, ha felengedett->lenyomott átmenet van, és csak akkor töröljük, ha lenyomott->felengedett átmenet van. (Ehhez tárolnunk kell az előző állapotot.) Ilyenkor a főprogram a változó olvasása után törölheti is azt, így 1 lenyomáshoz 1 esemény fog tartozni. (Pl. 1 gombbal lehet így valamit ki-be kapcsolni.)
(#) Zsora válasza Zsora hozzászólására (») Máj 29, 2012 /
 
A másik (hardveres) megoldás: egy ellenállás és egy kondenzátor bekötése a lábra, valamint Schmitt-triggeres bemenet használata.
(#) Zsora válasza Zsora hozzászólására (») Máj 29, 2012 /
 
Persze megszakításrutin nélkül is megoldható a dolog, ha nincs időérzékeny dolog a programban. Ekkor csak minden érzékelt állapotváltozás után várni kell egy picit. (pl. 0,1 mp-et) Így a következő olvasásra már biztosan beáll az állandó állapot.
(#) Hp41C válasza Stadi hozzászólására (») Máj 29, 2012 /
 
(#) llaczo hozzászólása Máj 29, 2012 /
 
Sziasztok. Az a kérdésem hogy a 12F675 GP3-ik bemenet csak egy ciklust hajt végre és aztán semmi addig amíg meg nem szűnik és újból nem kap jelet. Persze ez pozitív tulajdonság is lehet, de informálódnék hogy lehet e módosítani ezt a tulajdonságát. Előre is köszi. Üdv
(#) Death01 hozzászólása Máj 29, 2012 /
 
Üdv.
Nem találtam semmilyen ehhez hasonló témát,de biztosan van,csak nem voltam elég kitartó a keresésben.
Így tehát előre is elnézést kérek ha rossz helyen teszem fel a kérdésemet.
Abban kérnék segítséget,hogy egy PIC égetőt szeretnék készíteni,és ehhez kellene nekem nyákterv,beültetési rajzzal.
Valaki linkelne nekem?
(#) Zsora válasza Death01 hozzászólására (») Máj 29, 2012 /
 
Ha esetleg mégsem PIC égetőre, hanem PIC programozóra lenne szükséged, akkor nézz be pl. ide:
PICkit2 klón építése
(#) Dave87 válasza Death01 hozzászólására (») Máj 29, 2012 /
 
Szia!

Én ERRŐL az oldalról a K128-ast építettem meg, semmi bajom vele, ami esetleg probléma lehet, hogy az újabb szériájú pic-eket már nem támogatja.
(#) SKY hozzászólása Máj 29, 2012 /
 
Sziasztok!
Egy futófény-szerű dolgot szeretnék összerakni, de a ledek nem sorban vannak a portokra kötve, ezért valahogy szeretném "hozzárendelni" a ledeket( port bitek) egy változó bitjeihez, amit már egyszerű léptetni/változtatni stb...
Egy ilyen megoldásra gondoltam, de nem akarja elfogadni a fordító (mikroC), mi a hiba ebben, esetleg van elegánsabb megoldás is?

  1. unsigned k;
  2.  
  3. void led(void){
  4.  PORTA.0 = k.0;
  5.  PORTA.1 = k.1;
  6.  PORTA.2 = k.2;
  7.  PORTC.0 = k.3;
  8.  PORTC.1 = k.4;
  9.  PORTC.2 = k.5;
  10.  PORTB.4 = k.6;
  11.  PORTB.5 = k.7;
  12.  PORTB.6 = k.8;
  13.  PORTB.7 = k.9;
  14.  PORTC.7 = k.10;
  15.  PORTC.6 = k.11;
  16.  PORTC.3 = k.12;
  17.  PORTC.4 = k.13;
  18.  PORTC.5 = k.14;
  19.  PORTA.4 = k.15; }
(#) Zserigta hozzászólása Máj 29, 2012 /
 
Sziasztok.

Egy lézeres köridőmérő-stoppert kezdtem el készíteni, amely elég szépen halad. A későbbiekben bevezetésre kerülő sleep utasítás miatt, a T1oscillátor lábaira tettem egy 32.768 kHz-s kristályt.
Viszont azóta nem tudom belőni, hogy századmásodpercenként növelje 1-el a global_t változót a Timer1.
Jelenleg 2 perc alatt 33mp-et késik.
Gondoltam a "set_timer1(-327);"-et átírom 253-ra, de ilyenkor átvált kb 2.5mp-es ciklusra a 0.01 helyett.

Áttudná valaki írni nekem úgy, hogy tizedmásodpercenként növelje a Timer1 a global_t változómat?
Vagy mit kell átírnom mire?

A másik, mellékes kérdésem, miért van az, hogy ha váltogatom a menüt akkor még jobban késik a timer1??

Előre is köszönöm a segítséget.

  1. #include <16f887.h>
  2. #zero_ram
  3. #fuses XT,NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP
  4. #use delay(clock=4000000)
  5. #include <flex_lcd.c>
  6. #include <math.h>
  7. int32 global_t;
  8. //set_timer1 alapból -10000
  9. //Ha késik vagy siet a képlet a következő:
  10. //10000 * PIC_idő/külső_idő (Az időt másodpercben kell megadni!)
  11. //5*60 = 300, 9966 = int(10000 * 300/301).
  12. #int_TIMER1
  13. void TIMER1_isr(){
  14.    set_timer1(-327);
  15.    global_t=global_t+1;}  
  16. #define SW_PIN   PIN_B1
  17. #int_rb
  18. void rb_isr(void){
  19.    delay_ms(10);  
  20.    if(input(SW_PIN)){output_high(pin_e0);}}
  21. void inits(void){
  22.    set_TRIS_E( 0x01 );          //RE0 Kijelző világítás
  23.    set_timer1(-327);
  24.    setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT );
  25.    clear_interrupt(INT_RB);
  26.    enable_interrupts(INT_RB1);        
  27.    enable_interrupts( GLOBAL );}
  28. void main(){
  29.    inits();
  30.    int poti, volt, menu, erzek, user, szakad, mehet, start;
  31.    int ido_ms, ido_s, ido_m;
  32.    int32 ido, user1;
  33.    user1=59999;
  34.    output_high(pin_e0);
  35.    erzek=100;
  36.    menu=1;
  37.    user=1;
  38.    set_tris_d(0x00);  
  39.    set_tris_b(0b00000111);
  40.    setup_ccp1(CCP_PWM);
  41.    setup_adc( ADC_CLOCK_INTERNAL );            
  42.    setup_adc_ports(sAN0);
  43.    set_adc_channel(0);
  44.    lcd_init();
  45.    delay_ms(20);
  46.    printf(lcd_putc,"\f[1] 2  3  <->  1");
  47.    while(1){
  48.    //if (global_t>1000 && global_t<1005){output_low(pin_e0);sleep();
  49.    //#asm nop #endasm}
  50.       delay_ms(10);
  51.       poti = read_adc();
  52.       set_pwm1_duty(volt);  
  53.       if(poti<volt-1 | poti>volt+1){volt=poti;}
  54.       if(input(PIN_B4)) {volt=volt-10;}
  55.       if(input(PIN_A2)){
  56.          menu=menu+1;
  57.          if(menu>3){menu=1;}
  58.          if(menu==1){printf(lcd_putc,"\f[1] 2  3  <->  %u ", user);}
  59.          if(menu==2){printf(lcd_putc,"\f 1 [2] 3  <->  %u ", user);}
  60.          if(menu==3){printf(lcd_putc,"\f 1  2 [3] <->  %u \n0:00:00--9:59:99", user);}
  61.          delay_ms(300);}
  62.       if(menu==1){
  63.          if(input(PIN_A3)) {erzek=erzek+1;}
  64.          if(input(PIN_A4)) {erzek=erzek-1;}
  65.          printf(lcd_putc,"\n%u ",erzek);
  66.          lcd_gotoxy(8,2);
  67.          printf(lcd_putc,"-- %u  ", poti);
  68.          delay_ms(50);}
  69.       mehet=0;
  70.       if(menu==3 && volt<20 && global_t>300){
  71.          szakad=0;mehet=1;
  72.          if (user1>ido){user1=ido;}
  73.          global_t=0;}
  74.       if(menu==3 && volt<20 && start==0){
  75.          enable_interrupts( INT_TIMER1 );
  76.          start=1;}
  77.       if(menu==3 ){
  78.          //========Köridő!==========//
  79.          ido=global_t;
  80.          ido_m=ceil(ido/6000);
  81.          ido_s=ceil((ido-(ido_m*6000))/100);
  82.          ido_ms=ido-(ido_m*6000)-(ido_s*100);
  83.          printf(lcd_putc,"\n%u:", ido_m);
  84.          if (ido_s<10){printf(lcd_putc,"0");}
  85.          printf(lcd_putc,"%u:", ido_s);
  86.          if (ido_ms<10){printf(lcd_putc,"0");}
  87.          printf(lcd_putc,"%u", ido_ms);
  88.          
  89.          //========User rekord!==========//
  90.          ido_m=ceil(user1/6000);
  91.          ido_s=ceil((user1-(ido_m*6000))/100);
  92.          ido_ms=user1-(ido_m*6000)-(ido_s*100);
  93.          lcd_gotoxy(8,2);
  94.          printf(lcd_putc,"--%u:", ido_m);
  95.          if (ido_s<10){printf(lcd_putc,"0");}
  96.          printf(lcd_putc,"%u:", ido_s);
  97.          if (ido_ms<10){printf(lcd_putc,"0");}
  98.          printf(lcd_putc,"%u", ido_ms);
  99.       }  
  100.    }
  101. }
(#) Dave87 válasza Zserigta hozzászólására (») Máj 29, 2012 /
 
Esetleg próbáld meg EZZEL kiszámoltatni az értékeket. Én ezt használom ha timer kell egy programhoz.
(#) Death01 hozzászólása Máj 29, 2012 /
 
http://kapcsolasok.hu/digitalis/61-pic-eget

Ezt találtam nemrég és véleményeket kérnék,hogy ez jó lenne-e.
Jah és még azt sem értem,hogy itt a PIC-et hova kell csatlakoztatni,hogy belehessen égetni?
(#) Zserigta válasza Dave87 hozzászólására (») Máj 29, 2012 /
 
Köszi, de nem hiszem, hogy segít, mert "set_timer1(-283);" -al késik de set_timer1(-282);-el meg siet. Szóval köztes nincs.
Valamit máshogy kellene megírnom a programban, csak nem tudom mit és hogyan.
(#) Hp41C válasza Death01 hozzászólására (») Máj 29, 2012 /
 
Egyszóval: Ne.
Idézet:
„- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.”
(#) Hp41C válasza Zserigta hozzászólására (») Máj 29, 2012 /
 
Szia!
Idézet:
„Szóval köztes nincs.”
Már hogyne lenne... Csináld azt, hogy minden 20. lefutás -282 -val megy, a többi -283 -mal...
Idézet:
„T1oscillátor lábaira tettem egy 32.768 kHz-s kristályt. Viszont azóta nem tudom belőni, hogy századmásodpercenként növelje 1-el a global_t változót a Timer1”
Nem csodálom: 32768 = 2^15, ez nem osztható 100 -zal, azaz inkább 25 -tel (100 = 4 * 25).
Idézet:
„"set_timer1(-327);"-et átírom 253-ra, de ilyenkor átvált kb 2.5mp-es ciklusra”
A timer1 regisztere 16 bites (C -ben nem látszik), így a -327 = 0xFEB9, a 253 pedig 0x00FD. A Timer1 erről az értékről indul és növekszik a 0xFFFF ig, azután átfordul. Ekkor keletkezik a megszakítás.
Az időzítés pontosítható a TMR1 +=(-327); megoldással - ugyanis, amíg a vezérlés eljut a set_timer -ig, a timer1 regisztere már növekedhetett.
(#) Zserigta válasza Hp41C hozzászólására (») Máj 29, 2012 /
 
Idézet:
„Már hogyne lenne... Csináld azt, hogy minden 20. lefutás -282 -val megy, a többi -283 -mal...”

Hát ez elég macerásnak tűnik, mert még így se pontos, persze el lehet vele bíbelődni, hogy csak minden X.nél -282, a többinél meg -283, meg így változtatgatni még jó nem lesz, de ez életfogytig tartó meló szerintem.

Idézet:
„Nem csodálom: 32768 = 2^15, ez nem osztható 100 -zal, azaz inkább 25 -tel (100 = 4 * 25).”

Igen, időközbe rádöbbentem, hogy a 32768 hz-s kvarc csak másodperces számolásra jó, épp ezért folyamatban van egy 40kHz-s kvarc beszerzése, csak sajnos Magyarországon nem sok helyen árulják, és egy pár forintos vacakért meg nem szeretnék 2e Ft futárt fizetni.
Ha esetleg tudsz egy üzletet ahol postán LEVÉLKÉNT feladnák, légyszi szólj

Idézet:
„A timer1 regisztere 16 bites (C -ben nem látszik), így a -327 = 0xFEB9, a 253 pedig 0x00FD. A Timer1 erről az értékről indul és növekszik a 0xFFFF ig, azután átfordul. Ekkor keletkezik a megszakítás. Az időzítés pontosítható a TMR1 +=(-327); megoldással - ugyanis, amíg a vezérlés eljut a set_timer -ig, a timer1 regisztere már növekedhetett.”

Ez most, hogy is nézne ki CSS C nyelven?
A "set_timer1(-327);"-ből nem igen értem, hogy lesz " TMR1 +=(-327);"
(#) Hp41C válasza Zserigta hozzászólására (») Máj 29, 2012 /
 
Szia!
32768 = 100 * 327 + 68. Azaz (100 - 68) db -327 -es lefutás + 68 db -326 -os lefutás...

Ha pesti vagy, az FDH ingyen házhozszállítja (inkább: benne van az árában)...

Nem használom a CCS -t...
  1. movlw low(-.327)
  2. addwf TMR1L,f   ; itt még nem valószínű az átvitel (-327 = 0xFEB9 )
  3. movlw high(-.327)
  4. addwf TMR1H,f

és már kész is van...
(#) Zserigta válasza Hp41C hozzászólására (») Máj 29, 2012 /
 
Idézet:
„32768 = 100 * 327 + 68. Azaz (100 - 68) db -327 -es lefutás + 68 db -326 -os lefutás...”

Tyűűű, ennek nekifutottam vagy 3-szor és még most se biztos, hogy jól értelmeztem. Tehát valami ilyesmire gondoltál?:
  1. void TIMER1_isr(){
  2.    if (alma<=68){
  3.       set_timer1(-326);}
  4.    else {
  5.       alma=0;
  6.       set_timer1(-327);}
  7.    global_t=global_t+1;
  8.    alma=alma+1;}

Mert így nem igen jó sajna, így sokat késik. (Bocs az alma változóért, de hirtelen az jutott eszembe, mint mindig.)

Idézet:
„Ha pesti vagy, az FDH ingyen házhozszállítja (inkább: benne van az árában)...”

Az széééép. 383 Ft. Itt csak 220 Ft Áfával.
Bővebben: Link
Csak kérdés levélben feladják e, írtam már nekik, holnap talán válaszolnak.
Sajnos Magyarország nagyon déli részén élek, tehát BP nagyon messze van.
(#) mps hozzászólása Máj 29, 2012 /
 
Sziasztok!
16F886 ADC gondom van nekem. Annyit szeretnék elérni egyenlőre, hogy 1 bájtot kiírjon. A kapcsolás egyszerű, poti táp test közt, csúszka 1KOhm-al a bemenetre. A csúszkán 10n. A gondom az, hogy félállásig nullát mér, felső állásban pedig 144-et. Közte persze szépen végigmegy. A beállítások:
  1. VCFG0 =0;
  2. VCFG1 =0;
  3. ADFM =0;

Az ADRESH-t írom ki.
Remélem jó az az elgondolásom, hogy 0-255 között kellene mutatni neki.
Mit szúrhatok el? Előre is köszönöm a segítséget!
(#) Zserigta válasza Zserigta hozzászólására (») Máj 29, 2012 /
 
Vagy esetleg így értetted?:
  1. void TIMER1_isr(){
  2.    if (alma<=68){
  3.       set_timer1(-326);}
  4.    if (alma<=100 && alma>68) {
  5.       set_timer1(-327);}
  6.    if (alma==101) {
  7.       alma=0;}
  8.    global_t=global_t+1;
  9.    alma=alma+1;}

Mert így meg megy kb 2mp-et majd megáll kb 1 mp-ig és ez ismétlődik végig. Nem tudom miért.
(#) Zserigta válasza Zserigta hozzászólására (») Máj 29, 2012 /
 

Áhh mind1 is, hagyjuk szerintem. Köszi azért a segítséget Hp41C.
Majd ha meglesz a 40kHz-s kvarcom akkor be fogom tudni állítani könnyen és pontosra.

A sleep funkció amúgy is majd talán egy másik project része lesz, csak ebben a projectben akartam kipróbálni és tökéletesíteni tudásom e téren.


Viszont még a másik kérdésemre várnék választ valakitől, hogy a Timer1-et mi foghatja vissza a számlálásban?
A gomb megnyomása? A delay_ms? Vagy mi? Mert ha váltogatom a menüt, és vissza térek a számlálós menübe, elég szépen le van maradva ahhoz képest ahol tartana ha nem mászkálnék a menüben.
(#) Zserigta válasza mps hozzászólására (») Máj 29, 2012 /
 
Nyilván a potmétert nem jól kötötted be.
A középre menjen az egyik analóg láb, a poti 2 szélső lába közül meg az egyik legyen a föld a másik a táp.
És jó is lesz.

Idézet:
„Remélem jó az az elgondolásom, hogy 0-255 között kellene mutatni neki.”

Igen, jól gondolod.

Valahogy így mint a csatolt képen:
(#) mps válasza Zserigta hozzászólására (») Máj 29, 2012 /
 
Természetesen így van bekötve. Ez a része elég egyértelmű.
(#) Pepebá hozzászólása Máj 29, 2012 /
 
Üdv.
TX-4MSIL, BC-NBK adó-vevő páros (433,92MHZ) jelének PIC-el való feldolgozásával akarok megismerkedni (PIC18F4550) Elsőször a vevő jelének feldolgozásával majd az adó modulálásával.
Ehhez kérek segítséget, valami forrás anyagot amiböl ki tudok indulni.
Az oldalon lévő cikkeket olvastam, de az PIC16F877-re és mikroC-ben van. (én C18-al próbálkozom)
(#) mrobi válasza Dave87 hozzászólására (») Máj 30, 2012 /
 
Szia. Ezekhez az égetőkhöz hol találtál kapcsolási rajzot esetleg nyáktervet? Bővebben: Link
(#) Auf válasza mrobi hozzászólására (») Máj 30, 2012 /
 
Szia!

Ha ezt szeretnéd (k128), akkor a dokumentumában benne van a nyák illetve kapcsolási rajz is.
És a hozzá való program, pedig tartalmazza ez a fájl.
Megtalálható a pic-be égetendő hex is.
Utólagosan megjegyezném, hogy az honlapon megtalálható minden, amire szükséged van.
(#) mrobi válasza Auf hozzászólására (») Máj 30, 2012 /
 
Köszi. A hex-et megtaláltam hozzá azon az oldalon. De a dokumentációt nem. Köszönöm szépen! Ezek szerint én voltam a béna.
(#) Hp41C válasza Auf hozzászólására (») Máj 30, 2012 /
 
Szia!

Miért pont ezt? Miért nem a Microchip által (még) támogatott PICKit2 -t építed meg? Csak a problémád lesz vele... Ezt meg azt a típust miért nem kezeli, miért nem kezeli jól? Miért nem őrzi meg az OSCCAL és BOR értékeket? Miért nem tudja a nem 5V -os kontrollereket.
Aztán majd ezeket a kérdéseket szépen egyesével felteszed nekünk... Ráadásul egy drága, felületszerelt illesztőt tartalmaz: FT232 a HeStore -ban 2326Ft, a 18F2550 csak 1893 Ft. Az nem jelenthet problémát, hogy a 18F2550 -et fel kell programozni, a kiválasztottban is van egy felprogramozandó 16F628...
(#) mps válasza mps hozzászólására (») Máj 30, 2012 /
 
Megvan. Leírom azért hátha más is belefut, bár egyszerű volt végül: nem vártam eleget csatornaváltás után.
(#) Zserigta hozzászólása Máj 30, 2012 /
 
Sziasztok!

Az mitől lehet, hogy van egy PIC16F887-esem, amelyre írtam egy stopper programot, amely eddig tökéletesen pontosan számolt 4Mhz-s kristállyal Timer1 módban tizedmásodperc pontossággal.

Utána erről a kódról csináltam biztonsági mentést, majd átírtam egy 32.768kHz Timer1OSC lábra rakott oscillátorhoz, de nem igen jött össze a tökéletes időzítés, hogy tizedmásodpercbe számoljon.

Majd a biztonsági mentéses programot visszatöltöttem, és lám, ugyan azzal a 4Mhz-s kristállyal, most másfél perc alatt fél percet késik..

Létezik hogy a sok használattól belassul a kvarc vagy a PIC?
Mert se a kód se az kapcsolás, sőt még az alkatrészek sem változtak a kiinduláshoz képest.
Össz-vissz csak kb 20-szor lett égetve a PIC közben, meg ment egy pár órát.
Következő: »»   262 / 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