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   497 / 1210
(#) icserny válasza don_peter hozzászólására (») Márc 6, 2014 /
 
Idézet:
„Van erre egy leírás ezt már icserny-től kérdezem, hogy hogy állítsam be ezen memória területeket, hogy (mettől-meddig) hová írja be az én programomat?”
Nem tudom, hogy van-e leírás, de a MAL USB szekciójának mintaprogramjai így vannak megírva, én is azokból vettem a "tudományomat". De a PICCOLO projekt forrásállományaiból is kihámozható a lényeg.

1. A RESET és interrupt vektorokat 0x1000, 0x1008, 0x1018 címekre kell elhelyezni
2. A programot 0x102A címtől kell elhelyezni
3. Ezekhez idomított linker állományt kell használni (MAL: rm18f4550 - HID Bootload.lkr, PICCOLO: PIC18f4550.lkr)
4. Az univerzális PIC18f4550.lkr linker használata esetén a linkernek át kell adni egy /uHID_BOOTLOADER opciót. Ez az MPLAB-ban a projekt opcióknál állítható be, ahogy le van írva.

Idézet:
„Azt gondolom jól sejtem, hogy az USB-hez szükséges összes fájl és regiszter kötelező mivel azt használjuk.”
Nem, mert ha az alkalmazás nem használja az USB-t (pl. ledvillogtatás), akkor ezekre nincs szükség. Kiindulásnak jó pl. a ledswitch projekt (I/O portok fejezetből). Látható, hogy csak a piccolo_all.h, piccolo_config.h, a piccolo-4550.h és a PIC18f4550.lkr kell hozzá.
A hozzászólás módosítva: Márc 6, 2014

ledswitch.png
    
(#) icserny válasza icserny hozzászólására (») Márc 6, 2014 /
 
Kis kiegészítés:

Ebben a hozzászólásban mutattam meg azt, hogy az rm18f4550 - HID Bootload.lkr felkhasználásával hogyan kell megírni egy HID bootlaoderrel betölthető alkalmazást (C18-hoz, természetesen...), a PICOOLO projekt használata nélkül.
(#) don_peter válasza icserny hozzászólására (») Márc 6, 2014 /
 
Köszönöm az összefoglalót.
Át fogom nyálazni, de még mindig az analóg téma köt le
Rá fogok jönni csak idő kérdése.
(#) pcb12 hozzászólása Márc 6, 2014 /
 
Sziasztok!

Pic16f628-ra írt program változtatás nélkül beírható Pic16f690-es be?
Működni fog a program?
egy időzítőről van szó.

Köszönöm
(#) usane válasza pcb12 hozzászólására (») Márc 6, 2014 /
 
Lábkiosztásra nem stimmel. Ettől függetlenül működhet, de hogy változtatás nélül-e?
Hát kicsi az esélye. Programtól függ.
A hozzászólás módosítva: Márc 6, 2014
(#) Hp41C válasza pcb12 hozzászólására (») Márc 6, 2014 /
 
Nem... A 16F628 -ban a PORTB 8 bites, a 16F690 -ben a PORTB 4 bites, a PORTC 8 bites.
(#) kissi válasza Hp41C hozzászólására (») Márc 6, 2014 /
 
Ettől még működhetne egy időzítő, csak kicsi az esélye, ahogy usane kolléga mondta !
A hozzászólás módosítva: Márc 6, 2014
(#) don_peter hozzászólása Márc 7, 2014 /
 
Srácok lenne egy kérdésem.
Végre sikerült segítséggel az analóg jelet fogadnom és feldolgozni.
A debugerben tök jól jelenik meg az érték, de mikor ki akarom íratni LCD-re akkor nem abban a formában látom mint amit a debug mutat.
Tehát megkaptam a potméterből jött jelet 0 tól 1023-ig vagy is 10bit-be és ezt osztom el 5volttal majd az eredményt megszorzom a potméter aktuális állapotával ami eredményezi a bejövő feszültségem szintjét.
float v; //ez külön deklarálva is van
int a; //poti álapota ez is külön deklarálva van
v = (5/1023) x a // ez megadja a feszültségem (debugerben jó a változóban mutatott érték)
Kijelzőre ki akarom íratni és valami 16555-ős értéket kapok és ezt tudom le, fel állogatni a poti tekergetésével.
Az LCD drivert Piccolo projekt kereteiből vettem ki.
Kiíratása pedig így néz ki: printf("Fesz: %3.2u", v);
Próbáltam i, s, f, ...stb, de vagy ugyan azt a számot látom vagy zagyvaságokat ír ki.
Miért nem konvertálja ki normálisan a kijelzőre?
(#) Hp41C válasza kissi hozzászólására (») Márc 7, 2014 /
 
Ténzleg, kicsit lerövidítettem ay indoklást:
- Analóg mód: A 16F628 -on a CMCON (0x1F) regiszter írásával állítható, a 16F680 -en az ANSEL (0x11E) és ANSELH (0x11F), a 0x1F címen az ADCON0 van.
- Miután a 16F628 -ban a 0x11E és 0x11F -en nincs regiszter, a kivezetések analóg módban maradnának. Összesen a RA3(MCLR), RA5(OSC1), RB6 és RB7 maradna, ami bemenetként is használhaó lenne. Az analóg láb még használható kimenetnek.
- A 16F628 -on a RA7 és RA6 az oszcillátor, a 16F690 -en a RA4 és RA5.
A forrást kellene átírni a két adatlap összehasonlítása alapján.
(#) Dempsey hozzászólása Márc 7, 2014 /
 
Sziasztok!
Egy programmal kínlódok (PIC16f628A mikrovezérlőbe dolgozok), melynek lényege hogy egy gombbal beállítok egy értéket egy változóba, majd egy másikkal gombbal elindítok egy 3 fázisú motort a PIC kimenetével egy optocsatolón keresztül (mágneskapcsolót húz az opto). Egy induktiv közelítés érzékelővel leszámoltatom az előbb beállított értéket és a motornak le kell állnia, vagyis el kell hogy ejtsen a mágneskapcsoló. A mágneskapcsoló 24V-os a közelítés érzékelő is 24V-os. A 24V-os tápból egy 7805 csinál 5V-ot a PIC-nek. A közelítés érzékelő az RB0 lábra ad bemenetet #INT_EXT használatával. Minden tökéletesen működik motor nélkül, tehát a mágneskapcsoló meghúz, majd ha a beállított értéket leszámoltatom az érzékelővel, akkor elejt. Igen ám de ha a motort ráteszem a mágneskapcsolóra akkor START-ra meghúz a mágneskapcsoló viszont hiába számoltatom le az érzékelővel a változót nem esik ki soha a mágneskapcsoló. Amúgy ha izzót tettem motor helyett akkor is ez a helyzet. Tehát vegyük úgy hogy terhelés alatt nem ejt el soha a mágneskapcsoló. Ha motor nincs rátéve akkor tökéletesen teszi a dolgát a program. Látott e már valaki ilyet? Arra is rájöttem ha a közelítés érzékelőt nem interruptba használom csak simán mint egy gombot, akkor simán működik minden, de ezt nem lehet megengedni, mert felfutó élre van szükség mindenképp. A terhelés hogyan befolyásolhatja az interruptot? Úgy is próbáltam hogy bekapcsoltam mellette a motor és úgy probálta húzatni a mágneskapcsolót üresen simán tette a dolgát, tehát nem a motor csinál zavart a rendszerbe vagy ilyesmi.
(#) usane válasza Dempsey hozzászólására (») Márc 7, 2014 /
 
Kicsit konkretizálni kellene. például mit számol az érzékelő? Ha fordulatot akkor az izzó esetén miért kellene, hogy működjön? Egy kapcsolás vagy séme is segítene. Az, hogy nem a motor a zavarforrás nem biztos. A PIC kényes állatfajta. Én is szívtam már szűrés miatt.
(#) Dempsey válasza usane hozzászólására (») Márc 7, 2014 /
 
Az érzékelő nincs feltéve még a helyére csak kézzel közelítek hozzá fémet. Amúgy fordulatot számol. Kb 7-8 fordulatnál többre nincs szükség. Majd késöbb küldök rajzot is róla.
(#) icserny válasza don_peter hozzászólására (») Márc 7, 2014 /
 
Idézet:
„float v; //ez külön deklarálva is van”
C18-ban tudtommal nincs float támogatás! Mellesleg van mintapéldám feszültségmérésre, miért nem azt nézed meg? Bővebben: Link
(#) Hp41C válasza icserny hozzászólására (») Márc 7, 2014 /
 
A C18 -ban van float (32 bit) típus (ld. 51288F.pdf 2.1.2. Floating-point Types). Sajnos a double is csak 32 bites.
(#) icserny válasza Hp41C hozzászólására (») Márc 7, 2014 /
 
Bocs, ezek szerint rosszul emlékszem. Akkor mi nincs a C18-ban? A printf() %f formátum kezelésének implementálása? Annak idején valamiért saját kiíró rutint kellett írnom, csak már magam sem emlékszem a részletekre.
(#) don_peter válasza icserny hozzászólására (») Márc 7, 2014 /
 
Mert magát a számolást megcsináltam mér és ki is íratom, de a formailag nem megfelelő, hozzáteszem debugban tökéletes.
Ha ezen driver segítségével nem lehet kiíratni akkor kell keresek egy másikat sajnos pedig tetszik az LCD vezérlés.
Valamiért nem akarja az igazságot.
(#) icserny válasza don_peter hozzászólására (») Márc 7, 2014 /
 
Ha a feszültséget mV-ban számolod ki (5 helyett 5000-rel kell szorozni), akkor az eredmény long típusú változóban előjeles egészként tárolható/kezelhető, s az outdec() függvénnyel tetszőleges tizedesjeggyel kiíratható.

Idézet:
„Ha ezen driver segítségével nem lehet kiíratni...”
Nem értem az összefüggést.
(#) don_peter válasza icserny hozzászólására (») Márc 7, 2014 /
 
Main-on kívűl:
  1. volatile unsigned int a;
  2. volatile unsigned float v;
  3. volatile unsigned float mv = 5000; //5v
  4. volatile unsigned float o = 1023; //poti maxra tekerve

Main-on és wile-n belül:
  1. a = ReadADC();
  2.           v = ((mv / o) * a)/1000;
  3.      printf("Poti: %04d", a); //mert ha kisebb a szám 1000-nél nem törli az utolsó karaktert
  4.         lcd_write(0xC0,0,1,1);  
  5.       printf("Fesz: %3.2f", v); //elvileg kerekítene 2 tizedesre
  6.         lcd_write(0x94,0,1,1);

Az outdec() függvény nekem nincs benne vagy legalább is nem találja.
Az LCD drivert amit írtál teljesen külön raktam és átírtam a portokat.

ui: melyik fájlban találhatom meg az outdec() függvényt?
A hozzászólás módosítva: Márc 7, 2014
(#) Dempsey válasza usane hozzászólására (») Márc 7, 2014 /
 
Csatoltam a rajzot nagy vonalakban erről van szó. Van még vagy két gomb rajta de azt nem jelöltem teljesen lényegtelen. Csatolom a progit is.
  1. #include <16F628A.h>
  2. #fuses INTRC,NOWDT,NOPROTECT,BROWNOUT,NOPUT,NOLVP
  3. #use delay(clock=4000000)
  4. //////////////////////////////////////////////////////////////
  5. // GLOBÁLIS VÁLTOZÓK
  6. unsigned int i=0,k=0;
  7. boolean j;
  8. ///////////////////////////////////////////////////////////////
  9. // BERO ÉRZÉKELÉS MEGSZAKÍTÁS RUTINNAL
  10. #INT_EXT
  11. void bero_isr(){
  12. if ((!input(pin_b0))&&(j==1)){
  13. //delay_ms(500);
  14. i=i-1;
  15. }
  16. }
  17. ////////////////////////////////////////////////////////////////
  18. // FORDULATOK SZÁMÁNAK BEÁLLÍTÁSA
  19. void gomb (){
  20. if(!input(pin_b1)){
  21. delay_ms(500);
  22. i=i+1;
  23. k=k+1;
  24. }
  25. }
  26. ////////////////////////////////////////////////////////////////
  27. // MOTOR START
  28. void start (){
  29. if (!input(pin_b3)&&(i!=0)){
  30. delay_ms(150);
  31. j=true;
  32. output_high(pin_b5);
  33. }
  34. }
  35. ///////////////////////////////////////////////////////////////
  36. // MOTOR LEÁLLÍTÁSA
  37. void motor (){
  38. if(i==0&&j==1){
  39. output_low(pin_b5);
  40. delay_us(20);
  41. j=0;
  42. }
  43. }
  44. ////////////////////////////////////////////////////////////////
  45. // ELŐZŐLEG BEÁLLÍTOTT FORDULATOK SZÁMÁT LEHET MEGISMÉTELNI VELE
  46. void ismetlo(){
  47. if (k>0&&i==0&&(!input(pin_b4))){
  48. i=k;
  49. }
  50. }
  51. /////////////////////////////////////////////////////////////////
  52. //KITÖRLI AZ ISMÉTLÉST ÉS ÚJ FORDULATSZÁMOT LEHET BEÍRNI
  53. void torles() {
  54. if (!input(pin_b2)){
  55. k=0;
  56. }
  57. }
  58.  
  59. /////////////////////////////////////////////////////////////////
  60. // FŐPROGRAM
  61. void main (){
  62. enable_interrupts(int_ext);
  63. ext_int_edge(H_TO_L);
  64. enable_interrupts(global);
  65.  
  66. for(;;)
  67. {
  68. gomb();
  69. start();
  70. motor();
  71. ismetlo();
  72. torles();
  73. }
  74. }
(#) vicsys válasza Dempsey hozzászólására (») Márc 7, 2014 /
 
Idézet:
„tehát nem a motor csinál zavart a rendszerbe vagy ilyesmi.”

De. Az csinálja. Hidd csak el.
(#) kissi válasza Hp41C hozzászólására (») Márc 7, 2014 /
 
Egy időzítőt írt, annak lehet egy bemenete/ egy kimenete, ami szerencsés esetben akár működhet is pl. RB6, RB7 , de valóban kicsi az esély rá, mint írtuk !
(#) Dempsey válasza vicsys hozzászólására (») Márc 7, 2014 /
 
Hogyan védekezzek ellene? 100nF a tápról még hiányzik, de szerintem nem fog megoldani semmit. Próbáltam 47nF ot (az volt kéznél) az érzékelő jele és a GND közé de nem javított rajta semmit. Amikor úgy alakítottam át a programot hogy a beállított érték és az érzékelő által elszámolt érték megegyezik, akkor induljon a motor simán ment. Viszont mikor úgy volt beállítva hogy START-ra elindítottam a motort és ha megegyeztek a változók akkor ki kellett volna hogy essen a mágneskapcsoló tehát a terhelést kellett volna megszakítani akkor bukik az egész. Sőt mondok jobbat azt is próbáltam hogy a mágneskapcsolón terhelésnek egy másik 24V-os mágneskapcsoló behúzótekercse volt és már akkor sem működött, tehát sem a 3 fázis vagy a motor nem volt a körben mégis rossz volt.
A hozzászólás módosítva: Márc 7, 2014
(#) dani9228 hozzászólása Márc 7, 2014 /
 
Üdv! Tudnátok segíteni az easy pic v7 paneljának a beállításában. Az a gondom vele, hogy miután feltöltöm a programot, nem csinál semmit a nyomógomb megnyomására. Esetleg valami jumper beállítás, vagy a microProg-ba kell valamit átállítani?
Köszi!!
(#) vicsys válasza Dempsey hozzászólására (») Márc 7, 2014 /
 
99%, hogy visszarúg a tápra és beesik egy nagy tüske, ami felborítja az egészet. LC tag a tápon?
(#) Dempsey válasza vicsys hozzászólására (») Márc 7, 2014 /
 
A tápegység egy ilyen tipusú gyári táp, ezután már egy 7805 van annak a lábain a bemeneti oldalon egy 100nF os kondi a kimenetin egy 47µF os.
(#) vicsys válasza Dempsey hozzászólására (») Márc 7, 2014 /
 
Nem úgy értem... Nem próbáltad ki, hogy sorosan 100uH...1mH és utána egy 470...1000µF +100nF?
(#) Dempsey válasza vicsys hozzászólására (») Márc 7, 2014 /
 
Nem ezt még nem próbáltam.
(#) Dempsey válasza vicsys hozzászólására (») Márc 7, 2014 /
 
Azt még elfelejtettem mondani hogy az egész üzemben földeletlen csillagpontú hálózat van.
(#) icserny válasza dani9228 hozzászólására (») Márc 7, 2014 /
 
Idézet:
„Tudnátok segíteni az easy pic v7 paneljának a beállításában?”

Ennyi információ birtokában nem tartom valószínűnek.
(#) NyariG hozzászólása Márc 7, 2014 /
 
Ezt valaki áttudná nekem fordítgatni hex-re?
(az sem lenne baj ha átnézné hogy működik e)
  1. // Program to interface 16x2 LCD with PIC18F4550 Microcontroller using 4-bit mode
  2.  
  3. // Configuration bits
  4. /* _CPUDIV_OSC1_PLL2_1L,  // Divide clock by 2
  5.    _FOSC_HS_1H,           // Select High Speed (HS) oscillator
  6.    _WDT_OFF_2H,           // Watchdog Timer off
  7.    MCLRE_ON_3H            // Master Clear on
  8. */
  9.  
  10. //LCD Control pins
  11. #define rs LATA.F0
  12. #define rw LATA.F1
  13. #define en LATA.F2
  14.  
  15. //LCD Data pins
  16. #define lcdport LATB
  17.  
  18. void lcd_ini();
  19. void dis_cmd(unsigned char);
  20. void dis_data(unsigned char);
  21. void lcdcmd(unsigned char);
  22. void lcddata(unsigned char);
  23.  
  24. void main(void)
  25. {
  26.         unsigned char data0[]="EngineersGarage";
  27.         unsigned int i=0;
  28.         TRISB=0;                        // Configure Port B as output port
  29.         LATB=0;
  30.         lcd_ini();                      // LCD initialization
  31.         while(data0[i]!='\0')
  32.         {
  33.                 dis_data(data0[i]);
  34.                 Delay_ms(200);
  35.                 i++;
  36.         }
  37. }
  38. void lcd_ini()                     
  39. {
  40.         dis_cmd(0x02);          // To initialize LCD in 4-bit mode.
  41.         dis_cmd(0x28);          // To initialize LCD in 2 lines, 5x7 dots and 4bit mode.
  42.         dis_cmd(0x0C);
  43.         dis_cmd(0x06);
  44.         dis_cmd(0x80);
  45. }
  46.  
  47. void dis_cmd(unsigned char cmd_value)
  48. {
  49.         unsigned char cmd_value1;
  50.         cmd_value1 = (cmd_value & 0xF0);        // Mask lower nibble because RB4-RB7 pins are being used
  51.         lcdcmd(cmd_value1);                     // Send to LCD
  52.         cmd_value1 = ((cmd_value<<4) & 0xF0);   // Shift 4-bit and mask
  53.         lcdcmd(cmd_value1);                     // Send to LCD
  54. }
  55.  
  56.  
  57. void dis_data(unsigned char data_value)
  58. {
  59.         unsigned char data_value1;
  60.         data_value1=(data_value&0xF0);
  61.         lcddata(data_value1);
  62.         data_value1=((data_value<<4)&0xF0);
  63.         lcddata(data_value1);
  64. }
  65.  
  66. void lcdcmd(unsigned char cmdout)
  67. {
  68.         lcdport=cmdout;         //Send command to lcdport=PORTB
  69.         rs=0;                                          
  70.         rw=0;
  71.         en=1;
  72.         Delay_ms(10);
  73.         en=0;
  74. }
  75.  
  76. void lcddata(unsigned char dataout)
  77. {
  78.         lcdport=dataout;        //Send data to lcdport=PORTB
  79.         rs=1;
  80.         rw=0;
  81.         en=1;
  82.         Delay_ms(10);
  83.         en=0;
  84. }


Innen származik
Következő: »»   497 / 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