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   173 / 1211
(#) röntgen válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Mit csinál a programod a LED-del?
(#) szitko hozzászólása Nov 12, 2011 /
 
Sziasztok.
Elakadtam egy kissebb programban. A CCPR1L regisztert, 0-ról növelem, 160-ig, 10-esével, és minden lépés között a TMR0 túlcsordulását figyelem.
  1. pwm_fkezd
  2.   movlw  0x0a           ; W-be 10-et írunk
  3.   addwf  CCPR1L,w   ; hozzáadjuk pwm_ert-hez
  4.   movwf  CCPR1L      ; beírjuk CCPR1L regiszterbe
  5.   call   pt_var            ; várakozás Timer0-ra
  6.   movlw  0xa0           ; 160-at írunk W-be
  7.   subwf  CCPR1L,w   ; Összehasunlítjuk CCPR1L regiszterrel
  8.   btfsc  STATUS,Z      ; Z vizsgálata
  9.   goto  jvar_1           ; ha Z=1 akkor ugrunk tovább
  10.   goto   pwm_fkezd   ; ha Z=0 akkor ujrakezdjük
  11.  
  12. pt_var
  13.   btfss  INTCON,T0IF      ; TMR0 túlcsordult ?
  14.   goto  pt_var                ; nem
  15.   bcf   INTCON,T0IF        ; igen,flag törlés
  16.   decfsz  pwm_szam,f    ; számláló dekrementálása
  17.   goto    pt_var              ; ha nem 0 akkor előröl
  18.   return

A gondom az, hogy valamiért a túlcsordulási ciklus csak egyszer fut le, ígyhát a CCPR1L regiszter csak 10-ig jut el. Amikor másodszorra hívja meg a TMR0 szubrutint a program, a túlcsordulás figyelésnél leáll, tehát nem csordul túl, de nem tudom mitöl.
(#) El_Pinyo válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Egyik lába GND-re (Vss) a másik meg a +tápra (Vdd). Ezt minél közelebb a kontroller táplábai közé.
(#) dawe69hun válasza El_Pinyo hozzászólására (») Nov 12, 2011 /
 
A kontrollerhez közel? És egyébként miért kell oda? nem értem a logikáját :S
(#) dawe69hun válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Villogtatná a LED-et, de nemműködik. Az előbb azért működött mert rossz PIC et raktam bele.
(#) dawe69hun válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
WÍÍÍÍÍÍÍÍÍÍ MÉGIS működik csak az a baj, hogy nagyon ritkán villog, átírom a programot és kész
(#) El_Pinyo válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Ha bővebben érdekel, keress rá a PIC-es témákban, rengetegszer le lett már írva.
(#) Pepebá hozzászólása Nov 12, 2011 /
 
Hali!
Miért dobja a fordító ezt a hibaüzenetet, amikor a project beállításoknál hozzáadom az interrupt makrót:
[quote]C:\Program Files\Microchip\MCC18\h" "main.c" -fo="main.o" -DUSE_INTERRUPT -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
Error [1034] previous definition of macro 'USE_INTERRUPT' does not agree
(#) Poostmaster válasza szitko hozzászólására (») Nov 12, 2011 /
 
Ebből a részletből nem derül ki, hogy a pwm_szam változóba beírod-e újra a kezdőértéket.
(#) icserny válasza Pepebá hozzászólására (») Nov 12, 2011 /
 
A hibajelzésből úgy tűnik, hogy egynél több helyen definiálod az USE_INTERRUPT makrót.
(#) szitko válasza Poostmaster hozzászólására (») Nov 12, 2011 /
 
Köszi. Közben megoldottam, az agyammal volt a probléma. Elég rosszul írtam meg a hsz.-t, mert a PIC típusát (PIC16f628) se írtam meg. Egyébként nem az értékadás volt a probléma, hanem a flag-et úra törölni kellett.
Van egy másik problémám is (igazából kettő). A pwm konfigurálás után, ha a CCPR1L regiszterbe 0-t írok, akkor is megjelenik, egy minimális pwm jel. Ez mitől lehet?
  1. pwm_conf
  2.   clrf  T2CON
  3.   clrf  TMR2
  4.   bsf  STATUS,RP0  ; Bank_1
  5.   movlw  0xff  ; PWM freki 2khz
  6.   movwf  PR2
  7.   bcf  STATUS,RP0  ; Bank_0
  8.   movlw  b'00000001'
  9.   movwf  T2CON
  10.   clrf  CCPR1L
  11.   movlw  b'00111100'
  12.   movwf  CCP1CON
  13.   bsf   T2CON,TMR2ON
  14.   return

A másik problémám, hogy a CCPR1L regiszterbe nem tudok dec.120-nál többet írni.
(#) doup hozzászólása Nov 12, 2011 /
 
Ha még mindig nem sikerült akkor mutass már egy kapcsolási rajzot.
(#) Hp41C válasza szitko hozzászólására (») Nov 12, 2011 /
 
- A 10 bites PWM kitöltési érték úgy áll elő, hogy a CCPRxL regiszter kiegészül a CCPxCON 5..4 bitjeivel. Az alacsony helyiértékű 2 bit jön a CCPxCON regiszterből. Az inicializáláskor b'11' -et állítasz be ezeken a biteken...
(#) szitko válasza Hp41C hozzászólására (») Nov 12, 2011 /
 
Köszönöm, közben rájöttem. Mondom, hogy az agyammal van baj. Viszont azt nem tudom, hogy mért bolondul meg a CCPR1L reg. ha eléri a decimális 120-at. A szimulátor, (ISIS) és a scop (probapanelen) is azt mutatja, ha a 120-hoz hozzáad 10-et, akkor az eredmény -126 lesz, és onnan számol tovább 10-esével.(-116....)
(#) kissi válasza szitko hozzászólására (») Nov 12, 2011 /
 
Definiáld unsigned-nek a változót ( illetve, lehet, hogy csak a szimulátort kell átállítanod!) !

Steve
(#) szitko válasza kissi hozzászólására (») Nov 12, 2011 /
 
Nem a szimulátorral a hunyó, mert próbapanelen is ugyanetz csinálja. Elindul a pwm jel, a beállított időközönkét ugik a kitöltés (dec.10) és folyamatosan megy fel-le, holtott ha eléri a dec 160-at meg kéne álljon.
(#) Pepebá válasza icserny hozzászólására (») Nov 12, 2011 /
 
Megkeresem a téves definiálást, köszönöm az infót.
(#) icserny válasza Pepebá hozzászólására (») Nov 13, 2011 /
 
Nézd meg a piccolo_config.h-ban, hátha ott már definiálva van! Akkor fölösleges mégegyszer megadni a Project/Build options-ban ...
(#) Pepebá válasza icserny hozzászólására (») Nov 13, 2011 /
 
Köszönöm, megtaláltam.Minden OK.
(#) Hp41C válasza szitko hozzászólására (») Nov 13, 2011 /
 
- Az OPTION_REG T0CS bitjét törölni kell timer0 a belső órajel használatához.
- Ugyan nem tudom mit csinál a program a jvar_1 cimke után, de feltételezem, hogy nem törli a CCPR1L regisztert. Ekkor ugyan vizgálod, hogy a CCPR1L növelésével elérte már a .160 -at, de a regiszter értéke megmarad... A következő növelés ezt az értéket növeli meg...
- Működik az alábbi is:
  1. movlw  0x0a           ; W-be 10-et írunk
  2.   addwf  CCPR1L,f   ; hozzáadjuk pwm_ert-hez

Ekkor a CCPR1L -ben keletkezik az eredmény...
(#) Poostmaster válasza szitko hozzászólására (») Nov 13, 2011 /
 
Én mondjuk azt sem értem, hogy ha a megszakítást használod, miért nem megszakításból fut a program?
(#) szitko válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Az OPTION_REG jól van beállítva, törölve van, 1:64 osztás van beállítva, de az a része már megy rendesen.
Idézet:
„Ugyan nem tudom mit csinál a program a jvar_1 cimke után”

Még semmit, mert egyszerűen nem jutok túl a CCPR1L reg írásán. Lásd előzöleg (bár lehet hogy érthetetlenül írtam le a problémát).
Röviden a programnak az kellene csinálnia, hogy ha megnyomok, egy gombot autómatokusan elkezdi növelni a PWM kitöltést, 95%-ig, ott marad egész addig míg nem kap egy ujjabb jelet, ekkor leveszi a PWM-et 0-ra.
Amúgy köszönöm szépen, hogy válaszoltál, az "addwf adat,f" ki is ment a fejemből, bár már nem látok az idektől, hogy miért nem tudom írni a CCPR1L reg.-et.
(#) szitko válasza Poostmaster hozzászólására (») Nov 13, 2011 /
 
Nem megszakítást használok, hanem csak a TMR0 túlcsordulását figyelem. Ezzel állítom be az időzítést, nem pedig szubrutinnal.
(#) Hp41C válasza szitko hozzászólására (») Nov 13, 2011 /
 
MpLab szimulátorban tudom írni...
(#) szitko válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Ott Én is, sőt ott beírja a dec. 130-at is és számol tovább ahogy a program meg van írva, de valóságban és az ISIS-ben nem. Berakom a progit, hátha.. Az értékeket már átírtam mérgembe 120-ra.
Egy billentyűzetet már szétvertem, pedig nem vagyok ideges típus. Ennél sokkal bonyolultabb problémákat oldottam már meg, és ez meg itt szivat engem.

TT_v_vez.asm
    
(#) szitko válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Ez véletlenül kimaradt az előzö hsz.-ből. A 120-hoz hozzáadott a program 10-et. Az eredmény -126. (ahogy a képeken)
(#) Hp41C válasza szitko hozzászólására (») Nov 13, 2011 /
 
Már írták Neked, hogy az eredmény teljesen jó (0x78+ 0x0A = 0x82), de a számábrázolást nem előjelesre (unsigned) kellene állítani...
(#) doup hozzászólása Nov 13, 2011 /
 
Az én problémám a következő van egy digitális órám ami szépen ketyeg de szeretnék egy gombra megszakítást csinálni ami egy "Beállítás menü lesz" akódoma következő
  1. //--- Megszakítás
  2. void interrupt(void){
  3.      if(INTCON.INTF)
  4.      {
  5.           PORTD.B2 = 1;
  6.           Delay_ms(3000);
  7.           PORTD.B2 = 0;
  8.           INTCON.INTF = 0;
  9.      }
  10. }
  11. //~

Ettől szépen világít is a led azaz a megszakítás megfelelően működik

  1. //--- Main ciklus
  2. void main(){
  3.      I2C1_Init(100000);
  4.      PORTB = 0;
  5.      TRISB = 0;
  6.      TRISB0_bit = 1;
  7.      TRISA = 0XFF;
  8.      PORTA = 0x00;
  9.      TRISD = 0;
  10.      PORTD = 0;
  11.      TRISC = 0xFF;
  12.      CMCON = 7;
  13.      ADCON1 = 7;
  14.      INTCON.GIE = 1; //Enable Global Interrupt
  15.      INTCON.INTE = 1; //Enable RB0/INT external Interrupt
  16.      INTCON.INTF = 0;
  17.      INTCON.PEIE = 0; //Disable all unmasked peripheral interrupt
  18.      OPTION_REG.INTEDG = 1; //Interrupt on rising edge
  19.      Lcd_Init();
  20.      Lcd_Cmd(_LCD_CURSOR_OFF);
  21.      Lcd_Cmd(_Lcd_CLEAR);
  22.      write_ds1307(0,0x80); //Reset second to 0 sec. and stop Oscillator
  23.      write_ds1307(1,0x34); //write min 27
  24.      write_ds1307(2,0x10); //write hour 14
  25.      write_ds1307(3,0x02); //write day of week 2:Monday
  26.      write_ds1307(4,0x12); // write date 17
  27.      write_ds1307(5,0x11); // write month 6 June
  28.      write_ds1307(6,0x11); // write year 8 --> 2008
  29.      write_ds1307(7,0x10); //SQWE output at 1 Hz
  30.      write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
  31.  
  32.      while(1)
  33.      {
  34.              for(i = 0; i <=31; i++)
  35.              {
  36.                    sec=read_ds1307(0); // másodperc kiolvasása
  37.                    minute=read_ds1307(1); // perc kiolvasása
  38.                    hour=read_ds1307(2); // óra kiolvasása
  39.                    day=read_ds1307(3); // nap kiolvasása
  40.                    date=read_ds1307(4); // dátum kiolvasása
  41.                    month=read_ds1307(5); // hónap kiolvasása
  42.                    year=read_ds1307(6); // év kiolvasása
  43.  
  44.                    time[0] = BCD2UpperCh(hour);
  45.                    time[1] = BCD2LowerCh(hour);
  46.                    time[2] = ':';
  47.                    time[3] = BCD2UpperCh(minute);
  48.                    time[4] = BCD2LowerCh(minute);
  49.                    time[5] = ':';
  50.                    time[6] = BCD2UpperCh(sec);
  51.                    time[7] = BCD2LowerCh(sec);
  52.                    time[8] = '\0';
  53.  
  54.                    ddate[0] = '2';
  55.                    ddate[1] = '0';
  56.                    ddate[2] = BCD2UpperCh(year);
  57.                    ddate[3] = BCD2LowerCh(year);
  58.                    ddate[4] ='.';
  59.                    ddate[5] = BCD2UpperCh(month);
  60.                    ddate[6] = BCD2LowerCh(month);
  61.                    ddate[7] ='.';
  62.                    ddate[8] = BCD2UpperCh(date);
  63.                    ddate[9] = BCD2LowerCh(date);
  64.                    ddate[10] = '\0';
  65.                    Lcd_Out(1,5,time);
  66.                    Lcd_Out(2,4,ddate);
  67.                    Delay_ms(1000);
  68.                    if(i == 31)
  69.                    {
  70.                         for(k = 0; k < 13; k++)
  71.                         {
  72.                               Lcd_Cmd(_LCD_SHIFT_RIGHT);
  73.                               Delay_ms(100);
  74.                         }
  75.                         Lcd_Cmd(_LCD_CLEAR);
  76.                    }
  77.               }
  78.               //~
  79.  
  80.               //HŐMÉRSÉKLET MEGJELENÍTÉSE
  81.               for(j = 0; j < 1; j++)
  82.               {
  83.                     for(k = 0; k < 12; ++k)
  84.                     {
  85.                           Lcd_Chr(1, 3+k, text2[k]);
  86.                           Delay_ms(150);
  87.                     }
  88.                     Homerseklet_lekerdezes();
  89.                     Delay_ms(10000);
  90.                     for(k = 0; k < 13; k++)
  91.                     {
  92.                           Lcd_Cmd(_LCD_SHIFT_RIGHT);
  93.                           Delay_ms(100);
  94.                     }
  95.                     Lcd_Cmd(_LCD_CLEAR);
  96.                     }
  97.               }
  98.               //~
  99.               if(gCOUNT == 1)
  100.               {
  101.                         Lcd_Cmd(_LCD_CLEAR);
  102.                         Lcd_Out(1,4,"Beallitas");
  103.               }
  104.        }
  105.  
  106. //~


Hova kellene tennem egy olyat hogy ha gomb nyomás történt akkor szakítsa meg az óra vagy hőmársáklet kiírását és az lcd-t törölje és egy beállítás felirat jelenjen meg mindaddig míg mondjuk a gombnyomás nem éri el az 5-öt?
(#) Hp41C válasza doup hozzászólására (») Nov 13, 2011 /
 
Nem lesz így könnyű... Fordítsd meg a gondolatvilágot:
- Az órát elég másodpercenként kiírni,
- A gomb(ok) figyelését is elegendő kb. 0.02 .. 0.1 másodpercenként elvégezni.
A megszakítási rutinban ne legyen várakozás.

Kell egy alkalmasan választott idejű timert létrehozni, a megszakítás rutin pedig csak a változásokat jelezze a főprogramnak: a kijelzőt frissítei kell, a gomb / egy gomb le van nyomva, hőmérsékletet kell frissíteni...
A főprogramba egy állapot változó hozz létre: mi látható a kijelzőn. A kijelző frissítése e változó alapján történjen. A jelzésekből a főprogram állítsa, hogy mi legyen a kijelzőn. A feldolgozás után törölje a jelzéseket.

Ha ezt betartod, még számtalan feladatot rábízhatsz a kontrollerre...
(#) doup válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Ez így még elég kínai számomra. :d
Következő: »»   173 / 1211
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