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   377 / 1210
(#) Hp41C válasza tom75 hozzászólására (») Márc 4, 2013 /
 
Szia!
Melyik MpLab -ot használod? A 8.89 -est? Akkor a zip -ben levő ESR.mcp állományra kattintva indítsd el az MpLab -ot. Aztán a Build ikonnal fordítható...
(#) Beles válasza kissi hozzászólására (») Márc 4, 2013 /
 
Na ezt a problémát megoldottam, de jöt újjabb
LED fényerejét szeretném szabályozni. Két byte-ot küldök a PIC-nek, elsőben az utasítás van, másodikban pedig, hogy mekkora legyen a led fényereje. A PIC-ben a programrészlet:
  1. if(getsUSBUSART(input_buffer,2))
  2.      {
  3.           switch (input_buffer[0])
  4.           {
  5.  
  6.                 case '1' : mLED_1_On(); break;
  7.                 case '2' : mLED_1_Off(); break;
  8.                 case '3':       CCP_set();break;
  9.                 default   : break;
  10.                 }
  11.  
  12. void CCP_set (void)
  13. {
  14.         CCPR1L = input_buffer[1];
  15. }


A gépen pedig egy trackbar értékét küldöm:
  1. byte[] adat = new Byte[2];
  2.                 adat[1] = Convert.ToByte(trackBar2.Value);
  3.                 adat[0] = Convert.ToByte('3');
  4.                 port.Write(adat, 0, adat.Length);


Ugyebár a 3 jelzi, hogy PWM beállítás jön, és a következő 8 bit pedig a pwm értéke. A probléma az, hogy ha állítgatom a trackbart, akkor egyszer csak lefagy a programom. Működni működik egy darabig, állítódik a LED fényereje, azonban egyszercsak lefagy. Valami más módszert kellene alkalmaznom esetleg?
(#) Beles válasza Beles hozzászólására (») Márc 4, 2013 /
 
A program közben folyamatosan beolvassa egy AD konverter értékét. Arra gondolok, hogy összeakad, amikor küldené a PIC az adatot, akkor küldené a gép is... Lehetséges ez? Nem találok megoldást, hogyan tudom megnézni éppen nem-e fogad a port adatot.
(#) tom75 válasza bbalazs_ hozzászólására (») Márc 4, 2013 /
 
igen meg van a két include file.
(#) tom75 válasza Hp41C hozzászólására (») Márc 4, 2013 /
 
8.89-es mlpab-om van amit te küldtél az hiba nélkül fordítom, én F10-el csináltam, csak nem úgy sikerült a változtatás mint ahogy én képzeltem nem jó a mérték egység azt szerettem volna változtatni.
Meg még olyan hiba van a progiban, hogy ESR értéket egyáltalán nem mér.
(#) tom75 válasza Hp41C hozzászólására (») Márc 4, 2013 /
 
Szia köszi a program átírást jó lett a program csak a mérték egységgel kell majd eljátszanom. Kondi mérés az tökéletes, de ellenállást nem mér, de szerintem ez már valami áramköri hiba lehet.
A hozzászólás módosítva: Márc 4, 2013
(#) miklosch hozzászólása Márc 4, 2013 /
 
HI-TECH PICC fordítóról áttértem MCC18-ra. Több forrásfájllal dolgozok. Például van egy header állományom, amiben a program változóit gyűjtöm. A HI-TECH-ben minden olyan állományba betettem ezt a headert, amiben szükség volt valamelyik változóra. Az a módszer sajnos nem működik az MCC18-ban, mert ha berakom több állományba, akkor azt mondja, hogy többször van definiálva a változó. Valaki meg tudná mondani, hogy hogyan lehet ebben is több forrásfájllal dolgozni úgy, hogy van közös header fájl is?

Szerk.: Csatoltam egy példát. Ha használni akarom az LCD_Driver.c-ben a valtozok.h-ban definiált változót (237. sor), sehogy nem jön össze.
A hozzászólás módosítva: Márc 4, 2013
(#) mps válasza miklosch hozzászólására (») Márc 4, 2013 /
 
Hali! Én is hasonlóan csinálom mindenhol. Elég ha amiben mondjuk a main van annak az elejére includolod be. Ezután jön a többi. Úgy képzeld el, olyan a hatás mintha azokat oda írtad volna ahol be van csatolva.
(#) hepi02 hozzászólása Márc 4, 2013 /
 
Sziasztok!

Van egy négyszögjel generátorom, aminek a kimenete alapból 5V-ra van húzva. Ennek a jelét szeretném számolni a pic timer1 moduljával counter módban. Hogyan tudnám ezt megtenni? Sajnos akárhogyan állítgatom a T1CON-t, nem számolja a jelet. Timer0-val viszont tökéletesen működik.

Az lenne a baj, hogy a TMR1 értéke csak magas szintre nő eggyel, de nekem sajnos alacsony szintű jelek jönnek?

Hogyan tudnám megoldani?
(#) mps válasza hepi02 hozzászólására (») Márc 4, 2013 /
 
Nehéz így válaszolni, hogy nem raksz be kódot.
Az éllel nem lehet olyan gond, hogy egyáltalán nem számol, csak nem akkor lép amikor kezdődik a jel hanem amikor vége van, hiszen ha valami fentről lemegy, ahhoz, hogy újra lemenjen fel is kell mennie. Tehát egy ciklus alatt lesz egy amikor magasról alacsonyra csökken, majd alacsonyról magasra vált.
Amúgy itt egy elég jó leírás(ha nem ismernéd még):Bővebben: Link
(#) miklosch válasza mps hozzászólására (») Márc 4, 2013 /
 
HI-TECH-ben ez működik is így, itt nem. Ha az LCD_Driver.h-t a main.c-be rakom csak be, akkor az LCD_Driver.c nem látja a hozzá tartozó .h-ban lévő dolgokat. Ha mindkettőbe berakom, az se jó neki.
(#) potyo válasza miklosch hozzászólására (») Márc 5, 2013 /
 
Esetleg megpróbálhatnád azt, hogy az LCD_Driver.h elejére és végére beteszed ezeket a sorokat:

  1. #ifndef LCD_DRIVER_H
  2. #define LCD_DRIVER_H
  3.  
  4. // mostani fájl tartalma ide
  5.  
  6. #endif

Ez elvileg kivédi a többszörös includolást, de nem vagyok benne biztos, hogy így is jó lesz. Nekem kicsit rossz programfelépítésre utal az, ahogy ezt szeretnéd csinálni. Ha az kell, hogy egy változó több forrásfájlból elérhető legyen, akkor az egyik fájlban megadod normál módon, a másik (többi) fájlban pedig létrehozod ugyanazon a néven, csak elé teszel egy extern szócskát. Ebből tudni fogja, hogy azt a változót valahol máshol találja.
(#) hepi02 válasza mps hozzászólására (») Márc 5, 2013 /
 
A linket köszi, már olvasom is. A külföldi oldalakat már feltúrtam, hátha mond ez is némi újat.

Az idevágó rész valami ilyesmi:

  1. #define _XTAL_FREQ 4000000      //4MHz
  2.  
  3. __CONFIG(XT & WDTDIS & PWRTDIS & BORDIS & LVPDIS & UNPROTECT & MCLREN);
  4. unsigned int FM1;
  5. void main()
  6. {
  7.         T1CON  = 0b00000011;
  8.         FM2    = 0;
  9.         while(1)
  10.         {
  11.                 FM2 = TMR1L;
  12.                 //FM2 tartalmának kiírása
  13.                 wait(5); //0,5mp
  14. }
(#) miklosch válasza potyo hozzászólására (») Márc 5, 2013 /
 
Köszönöm, a második megoldással működik. Viszont akkor továbbmegyek, hogy tudom használni több .c állományban az egy .h-ban mondjuk egy elnevezett kimenetet? Pl. ezt:
  1. #define RX2LED          PORTAbits.RA3
Vagy hogyan tudom meghívni egy .c-ben leírt függvényt több másik .c állományból?

Szerk.: A függvényhívás működik több állományban.
A hozzászólás módosítva: Márc 5, 2013
(#) potyo válasza miklosch hozzászólására (») Márc 5, 2013 /
 
Csinálsz egy másik .h fáljt, abba teszed az elnevezést, azt bedig beincludolod minden olyan forrásodba, ahol szükség van rá. A microchip demo programoknál erre való a HardwareProfile.h nevű fájl. Ebben semmi más nincs, csak az ilyesmik.
(#) tom75 válasza Hp41C hozzászólására (») Márc 5, 2013 /
 
Azt szeretném még kérdezni, hogy az a programban látod-e, hogy a "c" portokon 3,4,5 porton stabil 5 voltot kel, hogy kiadjon mivel szerintem itt valami vezérelt dolog kéne mivel egy 4066-os ic kapcsolgatná műveleti erősítőket.
még nem tudtam kipróbálni másik ic-vel de ma megteszem.
(#) proba válasza hepi02 hozzászólására (») Márc 5, 2013 /
 
Milyen frekvenciát akarsz vele számoltatni?
(#) kissi válasza Beles hozzászólására (») Márc 5, 2013 /
 
Mi fagy le? Nem a kommunikáció ( tegyél egy led be-kikapcsot minden bejövő adatnál és meglátod! ) ?!
Steve
(#) hepi02 válasza proba hozzászólására (») Márc 5, 2013 /
 
Ennek a szenzornak a jelét szeretném mérni:
Bővebben: Link
(#) Beles válasza kissi hozzászólására (») Márc 5, 2013 /
 
Megcsináltam úgy, hogy csak akkor küldjön a PIC adatot, ha én kérek tőle. Így működik!
(#) proba válasza hepi02 hozzászólására (») Márc 5, 2013 /
 
És abszolút nem számol ,vagy össze vissza ad valamit ?
Nem lehet hogy a kiolvasás végén törölni kellene a timmert, mert szerintem így nem ad kiértékelhető eredményt.Csak folyamatosan pörög körbe körbe,a kiolvasás pillanatától függ éppen mit mutat ,az átfolyt mennyiséghez majdhogynem semmi köze a kapott számnak.
(#) hepi02 válasza proba hozzászólására (») Márc 5, 2013 /
 
Sajnos egyáltalán nem mér. A program egyébként nem ez, csak kivágtam egy részt belőle és átfogalmaztam 1-2 dolgot, hogy kiragadva is értelmezhető legyen.

Úgy tudok valami mérésfélét kicsikarni belőle, ha a jeladót lecsatlakoztatom, a pic lábát lehúzom földre(3K6), majd a pic lábát egy egyszerű vezetékkel elkezdem felváltva a +5V és GND között kapcsolgatni. Ilyenkor sikerül 4-5-ig elszámolnia, de semmi több. Az FM2 értéke egyébként nem törlődik, hanem folyamatosan hozzáadódik, egy plusz jel lemaradt a kódból.

Kicsi lenne az ellenállás? Esetleg túl nagy?
(#) Johnny0004 válasza kissi hozzászólására (») Márc 5, 2013 /
 
Szia! Visszatértem az encoder megszakításra, most kondikkal jó lett. Viszont még mindig van egy kérdésem, amit egyszerűen nem értek. Ha ugye pollingos módszert használok, akkor mindig figyelnie kell a procinak a lábakat, és csak akkor írja ki az lcd-re az értékeket, ha odaért a program, viszont megszakításnál flag-ot adok meg, azt is csak a főprogramba tudom feldolgozni, tehát ezt is figyelnie kell mindig, és csak ha odaér, akkor írja ki lcd-re. Tehát azt sehogy nem tudom megoldani, hogy bármit is csinál a pic, bárhol is tart a program, ahogy megszakítást kap az encoderről azt azonnal ki is írja az lcd-re (mert ugye semmilyen lcd kiiratást nem enged a megszakítás procedure-ban)?
(#) kissi válasza Johnny0004 hozzászólására (») Márc 5, 2013 /
 
Szia!
A kulcs szerintem az "azonnal" szavon van: mit értesz ezen? Ha a főhurok 0,1s-ként lefut, akkor egy kiírás szerintem "azonnal" látható lesz! Mit csinálsz a főprogramban, ami annyira blokkolja, hogy a megszakításból kapott jelzést csak sokára tudja feldolgozni ( várakozni nem kell a főprogramban számoltatással, azt a megszakításban elintézed egy változó csökkentésével és ha "lefogyott" nullára, akkor megcsinálod a hozzátartozó feladatot! ) !
Steve
(#) Johnny0004 válasza kissi hozzászólására (») Márc 5, 2013 /
 
Köszi a választ. Ez igazából csak elméleti kérdés, nálam nincs ilyen probléma, csak ha olyan program lenne, vagy akkor olyan hosszú feladat nincs elvileg ahol ilyen probléma lehetne?
Ha viszont így van, akkor miért használnak inkább megszakítást az encoderhez, ha a pollingos módszerrel is ugyanolyan hamar odaér a program?
(#) hepi02 hozzászólása Márc 5, 2013 /
 
Oké, átfogalmazom a kérdésemet.

Itt a kód:
  1. #include <htc.h>
  2. #include "pic.h"
  3. #include "lcd.h"
  4.  
  5. #define _XTAL_FREQ 4000000      //4MHz
  6.  
  7. __CONFIG(XT & WDTDIS & PWRTDIS & BORDIS & LVPDIS & UNPROTECT & MCLREN);
  8. unsigned short i, DD0, DD1, DD2, DD3;
  9.                
  10. unsigned int FM2;                      
  11.  
  12. void wait(int i);
  13. char lookup(int numb);
  14.  
  15. void main()
  16. {
  17.         T1CON  = 0b00000011;                   
  18.         TRISB  = 0b00000000;                   
  19.         PORTB  = 0x00;                                 
  20.         CMCON  = 7 ;                                   
  21.         OPTION = 0b00111000;                   
  22.         lcd_init();                                            
  23.         lcd_clear();                                   
  24.         while(1)                                               
  25.         {                                                      
  26.                 TMR1L   = 0;                           
  27.                 wait(5);                                       
  28.                 FM2 = TMR1L;                           
  29.  
  30.  
  31.                 DD0 = FM2%10;                          
  32.                 FM2 = FM2/10;                          
  33.                 DD1 = FM2%10;                          
  34.                 FM2 = FM2/10;                          
  35.                 DD2 = FM2%10;                          
  36.                 DD3 = FM2/10;                          
  37.                 ch1 = lookup(DD3);                     
  38.                 ch2 = lookup(DD2);
  39.                 ch3 = lookup(DD1);
  40.                 ch4 = lookup(DD0);
  41.                 lcd_goto(0x40);                        
  42.         lcd_putch(ch1);                        
  43.         lcd_putch(ch2);
  44.         lcd_putch(ch3);
  45.                 lcd_putch(ch4);
  46.                 lcd_puts(" FM2");
  47.         }
  48. }
  49.  
  50. void wait(int i)
  51. {
  52.         for(int z=0; z<i; z++)
  53.                 __delay_ms(100);                       
  54.  
  55. }
  56.  
  57. char lookup(int numb)
  58. {
  59.     char cha;
  60.     switch (numb) {
  61.         case 0: cha = '0';break;
  62.         case 1: cha = '1';break;
  63.         case 2: cha = '2';break;
  64.         case 3: cha = '3';break;
  65.         case 4: cha = '4';break;
  66.         case 5: cha = '5';break;
  67.         case 6: cha = '6';break;
  68.         case 7: cha = '7';break;
  69.         case 8: cha = '8';break;
  70.         case 9: cha = '9';break;
  71.                 default: cha = '0';break;
  72.     }
  73.     return cha;
  74. }


A problémám az, hogy ha NE555-tel ráküldök az RB6(T1CKI) lábra egy négyszögjelet, akkor gyönyörűen megszámolja a felfutó éleket. Ha viszont rákötöm ezt: Bővebben: Link, akkor egyáltalán nem számolja a felfutó éleket. Elvileg egzakt négyszögjelet állít elő a szenzor. Mi lehet a hiba? Miért nem hajlandó számolni?
A hozzászólás módosítva: Márc 5, 2013
(#) mps válasza hepi02 hozzászólására (») Márc 5, 2013 /
 
Csak hirtelen néztem a szenzorra, azt az R* felhúzó ellenállást betetted?
(#) hepi02 válasza mps hozzászólására (») Márc 5, 2013 /
 
Igen. TMR0-val az RA4(T0CKI) lábon szépen számolja is az éleket, csak a TMR1 nem akarja.
(#) mps válasza hepi02 hozzászólására (») Márc 5, 2013 /
 
Melyik Pic-ről van szó?
(#) hepi02 válasza mps hozzászólására (») Márc 5, 2013 /
 
Jogos, ez lemaradt:
PIC16F628A
Következő: »»   377 / 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