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   739 / 1210
(#) sonajkniz válasza Lamprologus hozzászólására (») Jan 9, 2016 /
 
Csak úgy frissítgetni elég felesleges!
Ha assemlyben tolod, elég csak a szükséges karaktereket cserélgetni.
Amúgy ez eléggé programfüggő.
Ha például törlöd a kijelzőt és újraírod, minden alkalommal bevillan. Ha csak a címeket állítod az elejére, és a teljes mezőt írod, akkor nem.
(#) Pali79 válasza Lamprologus hozzászólására (») Jan 9, 2016 /
 
Egyet értek János barátommal. Ha csak a kijelző bizonyos részét kell változtatni, akkor jobb ha csak azt cseréled amit kell. Pl én régebben csináltam egy sebesség mérőt. Az alap kijelzés az inicializálás után: "Sebesség: km/h" A mérés után a kijelző címét beállítom a kettőspont utáni részre és csak azt a három karaktert írom mindig újra.
(#) nyekk hozzászólása Jan 9, 2016 /
 
Sziasztok!
Egy kéréssel fordulnák hozzátok ,adott egy MikroC ben íródott Volt ,Amper ,Frekvencia mérő ennek szeretném a méréshatárát kitolni 0- 30V 0- 3A ig .Sajnos még nem tartok ott a programozásban ,hogy átlássam mit kéne átírni,esetleg ha valaki megtenné ,hogy belenéz ,és leírná mit változtassak,azt megköszönném! Jelen állapotában ha a bemenetet szabályzom 0-5V ig akkor a kijelzőn 5V-nál 15Volt jelenik meg,valamint 1,6A ,ezt kéne úgy megoldanom ,hogy bemeneti 5 V nál 30 V jelezzen ki ,ha lehetséges.
  1. /*
  2. Project: Power Supply and Volt, Current, and Frequency meter
  3. External clock @ 20 MHz, MCLR Disabled, PWRT Enabled, WDT OFF
  4. Copyright @ Rajendra Bhatt
  5. March 9, 2011
  6. */
  7. // Define LCD module connections.
  8.  sbit LCD_RS at RC7_bit;
  9.  sbit LCD_EN at RC6_bit;
  10.  sbit LCD_D4 at RB4_bit;
  11.  sbit LCD_D5 at RB5_bit;
  12.  sbit LCD_D6 at RB6_bit;
  13.  sbit LCD_D7 at RB7_bit;
  14.  sbit LCD_RS_Direction at TRISC7_bit;
  15.  sbit LCD_EN_Direction at TRISC6_bit;
  16.  sbit LCD_D4_Direction at TRISB4_bit;
  17.  sbit LCD_D5_Direction at TRISB5_bit;
  18.  sbit LCD_D6_Direction at TRISB6_bit;
  19.  sbit LCD_D7_Direction at TRISB7_bit;
  20. // End LCD module connection definition
  21.  
  22.  sbit Gate_Enable at RC1_bit;
  23. // Define Messages
  24.  char message3[] = "V=";
  25.  char message4[] = "I=";
  26.  char message5[] = "Freq=         Hz";
  27. // End Message
  28.  
  29. unsigned int ADC_Value, DisplayVolt, DisplayCurr, AdjustVolt;
  30. char *volt = "00.0";
  31. char *amp = "0.000";
  32. //unsigned int Num;
  33. char *freq = "00000.00";
  34. long counter, Num, lowfreq;
  35. unsigned short CountDone, upscale, prescaler;
  36.  
  37. void Display_Freq(long freq2write) {
  38.  
  39.  freq[0] = (freq2write/10000000) + 48;    // Extract tens digit
  40.  freq[1] =  (freq2write/1000000)%10 + 48; // Extract ones digit
  41.  freq[2] =  (freq2write/100000)%10 + 48;
  42.  freq[3] =  (freq2write/10000)%10 + 48;
  43.  freq[4] =  (freq2write/1000)%10 + 48;
  44.  freq[6] =  (freq2write/100)%10 + 48;
  45.  freq[7] =  (freq2write/10)%10 + 48;
  46.  // Display Frequency on LCD
  47.  Lcd_Out(2, 6, freq);
  48. }
  49.  
  50. long count_pulse(){
  51.   long ff = 0;
  52.   Gate_Enable = 0;
  53.   CountDone = 0;
  54.   Num = 0;
  55.   TMR1L = 0xDC;        //TMR1 start time = 3036 for 100 ms
  56.   TMR1H = 0x0B;
  57.   TMR0 = 0;
  58.   T1CON.TMR1ON = 1;
  59.   do {
  60.  
  61.   }while(!CountDone);
  62.   Gate_Enable = 1;
  63.   T1CON.TMR1ON = 0;   // Disable Timer1
  64.   ff = 256*Num + TMR0;
  65.   ff = ff*10*prescaler;
  66.   return ff;
  67.  
  68. }
  69.  
  70. // Interrupt service routine
  71. void interrupt() {
  72.   if(INTCON.T0IF){
  73.    Num ++;               // Interrupt causes Num to be incremented by 1
  74.    INTCON.T0IF = 0;      // Bit T0IF is cleared so that the interrupt could reoccur
  75.   }
  76.   if (PIR1.TMR1IF){     //Let me use this even if no other interrupts are enabled
  77.    CountDone = 1;
  78.    PIR1.TMR1IF = 0;              //reset timer1 flag
  79.   }
  80. }
  81.  
  82. void main() {
  83.  ANSEL = 0b00010001; //All I/O pins are configured as digital
  84.  ANSELH = 0b00000000;
  85.  TRISC = 0b00000001; // PORTC All Outputs
  86.  TRISA = 0b00000101;
  87.  TRISB = 0b00000000; // PORTB All Outputs
  88.  CM1CON0 = 0;
  89.  CM2CON0 = 0;
  90.  Gate_Enable = 1;
  91.  // TMR1 settings
  92.  T1CON.TMR1CS = 0;          // Fosc / 4
  93.  T1CON.T1CKPS1 = 1;         // Setting prescale value to 1:8
  94.  T1CON.T1CKPS0 = 1;
  95.  PIE1.TMR1IE = 1;
  96.  INTCON.PEIE = 1;
  97.  INTCON.T0IE = 1;
  98.  INTCON.GIE = 1;
  99.  Lcd_Init();
  100.  Lcd_Cmd(_LCD_CLEAR);             // CLEAR display
  101.  Lcd_Cmd(_LCD_CURSOR_OFF);        // Cursor off
  102.  Lcd_Out(1,1,Message3);
  103.  Lcd_Chr(1,7,'V');
  104.  Lcd_Out(1,9,Message4);
  105.  Lcd_Chr(1,16,'A');
  106.  Lcd_Out(2,1,message5);
  107.  do {
  108.   // Read Current
  109.   ADCON0 = 0b00010000;
  110.   ADC_Value = ADC_Read(4);
  111.   DisplayCurr = ADC_Value * 17;
  112.   amp[0] = DisplayCurr/10000 + 48;
  113.   amp[2] = (DisplayCurr/1000)%10 + 48;
  114.   amp[3] = (DisplayCurr/100)%10 + 48;
  115.   amp[4] = (DisplayCurr/10)%10 + 48;
  116.   Lcd_Out(1,11,amp);
  117.  
  118.   // Read Voltage
  119.   ADCON0 = 0b00000000;
  120.   ADC_Value = ADC_Read(0);
  121.   DisplayVolt = ADC_Value * 2;
  122.   AdjustVolt = DisplayCurr/1000;
  123.   AdjustVolt = 29*AdjustVolt ; // 29 corresponds to 0.286 Ohm
  124.   DisplayVolt = DisplayVolt - AdjustVolt;
  125.   volt[0] = DisplayVolt/1000 + 48;
  126.   volt[1] = (DisplayVolt/100)%10 + 48;
  127.   volt[3] = (DisplayVolt/10)%10 + 48;
  128.   Lcd_Out(1,3,volt);
  129.  
  130.   // Calculate Frequency
  131.   // First begin with prescaler 1:64
  132.   OPTION_REG = 0b00110101; // Prescaler (1:64), TOCS =1
  133.   prescaler = 64;
  134.  
  135.   Counter = count_pulse();
  136.  
  137.   if (Counter > 99990) {
  138.   Display_Freq(Counter);
  139.   Lcd_Chr(2,14,'K');
  140.   //lowfreq = Counter*1000;
  141.   //Lcd_Out(2,1,message5);
  142.   //Display_Freq(lowfreq);
  143.   }
  144.   if (Counter <= 99990) {
  145.   OPTION_REG = 0b00111000; // Prescaler (1:1), TOCS =1
  146.   prescaler = 1;
  147.   Counter = count_pulse();
  148.   Counter = 1000*Counter;
  149.   Display_Freq(Counter);
  150.   Lcd_Chr(2,14,' ');
  151.   }
  152.   Delay_ms(300);
  153.   // Ends Frequency display
  154.  
  155.  } while(1);
  156. }
(#) kissi válasza nyekk hozzászólására (») Jan 9, 2016 /
 
Szia!

Szerintem a 121.sorban a
Idézet:
„DisplayVolt = ADC_Value * 2;”
írd át
Idézet:
„DisplayVolt = ADC_Value * 4”
-re !
(#) nyekk válasza kissi hozzászólására (») Jan 9, 2016 /
 
Megpróbálom ,kösz!
(#) nyekk válasza kissi hozzászólására (») Jan 9, 2016 /
 
Szeretném megérteni mi is történik, az analóg átalakított bemenő értéket szorzom 4 el ? Jól gondolom?
(#) nyekk válasza kissi hozzászólására (») Jan 9, 2016 /
 
Működik a dolog,kösz mégegyszer!
(#) kissi válasza nyekk hozzászólására (») Jan 10, 2016 /
 
Igen. Azt mondtad, hogy most 5 V hatására 15-öt ír ki és azt szeretnéd, hogy 30-at írjon...mivel az eredeti képletben egy 2-es szorzó volt, így azt módosítottam 2-szer annyira, azaz 4-re !
(#) nagym6 válasza nyekk hozzászólására (») Jan 10, 2016 /
 
A mellékelt rajzon az LCD 7-8-9-10 lábát is testre kell kötni, még ha így működik, akkor is.
(#) Pali79 válasza nagym6 hozzászólására (») Jan 10, 2016 /
 
Miért is? Én sem kötöm be sose, még nem volt vele gondom.
(#) Johnny0004 válasza sonajkniz hozzászólására (») Jan 10, 2016 /
 
Szia! Ne felejtsük el egyszerű PORT megfigyeléssel is olvasható a jeladó, nem csak megszakítással.
(#) nagym6 válasza Pali79 hozzászólására (») Jan 10, 2016 /
 
Lebegve maradt bemenet, nem "egészséges", még ha kikapcsolt ez a négy, akkor is. Eléggé vannak eltérések egyes gyártmányok bemenete között, egyiknél nem gond, másik már problémás emiatt. Tönkremehet ha levegőböl valamit vesz, trafó szórt tere, kézzel érintve, stb..
(#) sonajkniz válasza Johnny0004 hozzászólására (») Jan 10, 2016 /
 
Való igaz.
Csakhogy akkor a programod főfoglalkozásban figyeli az encodert. Ráadásul jelentősen hosszabb lessz a rutin. Leírva is, és lefutásra is. Valamint meglehetősen sokszor rámegy a program feleslegesen, vagy épp ellenkezőleg, lemarad egy jelről.
(#) kameleon2 válasza Marko Ramiusz hozzászólására (») Jan 10, 2016 /
 
Csak azért kérdeztem, mert ez saját termék valamennyire. Arduino kompatibilis csatlakozókkal is hozzáférhető és nem Allen-Bradley árban Jó lett volna tudni egyáltalán hallott-e valaki erről és szoftverről. Sok feladatra ez is bőven elég lenne - és abszolút villanyszerelő-barát a szoftver is.?
(#) mark.budai hozzászólása Jan 10, 2016 /
 
Sziasztok! Muszáj megint kérdeznem, mert már teljesen kiakadtam.
PIC18F2423, belső oszcillátorral szeretném használni. De az adatlapjában nem találom, hogy hogyan kell beállítani. OSCCON-ra keresve egyetlen találat van, az is egy szöveg közepében, semmiféle táblázat nincs róla. Az internal oscillator kifejezésre már minden lehetséges formában rákerestem, de még mindig nem találtam.
Hogy tudom beállítani ennek a belső oszcillátorát? Nem is kell konkrét válasz, leginkább az érdekelne, hogy hol találom az adatlapban?
(#) Bakman válasza mark.budai hozzászólására (») Jan 10, 2016 /
 
PIC18F2420 adatlapjában lesz. A 2423 csak az ADC-ben különbözik a 2420-tól, így annak adatlapjában csak a különbségek vannak leírva.
(#) mark.budai válasza Bakman hozzászólására (») Jan 10, 2016 /
 
Á, már értem, miért ilyen rövid ez az adatlap, és miért van teli az ADC leírásával.
Köszönöm!
(#) Lamprologus hozzászólása Jan 10, 2016 /
 
Mekkora kvarcot lehet tenni egy PIC-re?

Idáig még mindig belső oscillátorról hajtottam őket.

A 18F4550 adatlapját nézegetve merült fel bennem a kérdés.
A kapacitást csak 4, 8, 20MHz-s kvarcra adja meg... máshol viszont többféle kvarc szerepel.
10MHz nincs sehol, nekem viszont van itthon a fiókomba. Azt ráköthetem-e? Leírásból én arra következtewtek hogy igen, de pl. az USB kapcsolatot nem tudom használni, mert az ahhoz szükséges frekit nem tudom "kikeverni" belőle.
(#) Pali79 válasza Lamprologus hozzászólására (») Jan 10, 2016 /
 
Az adatlap legelején van a max. leírva. a PI18F4550-nél ez 48 Mhz. Eddig az értékig gyakorlatilag bármilyen lehet.
(#) cross51 válasza Pali79 hozzászólására (») Jan 10, 2016 /
 
A 48MHz a maximális üzemi frekvencia (nem biztos, de) az oszcillátor erősítője nem biztos, hogy 48MHz-ig működik szerintem csak 20MHz-es kristályt lehet rá rakni, de erről nem találtam információt és ez a kis "ütközés" nálam PIC16-nál volt.
(#) Pali79 válasza cross51 hozzászólására (») Jan 10, 2016 /
 
Nem néztem át az adatlapot tüzetesen. Elképzelhető, hogy PLL használatával lehet 48-at elérni.
(#) Hp41C válasza Lamprologus hozzászólására (») Jan 10, 2016 /
 
Olvasd el az adatlap 2.0 fejezetét:
Kétféle müdon lehet ellátni órajellel ezt a kontrollert az elsődleges oszcillátorról:
-A PLL -ne keresztül: Az elsődleges oszcillátor órajelét leosztják (1, 2, 3, 4, 5, 6, 10, 12) 4MHz -re, ezt a PLL felszorozza 96 MHz -re. Innen 2-vel, 3 -mal, 4-gyel, 6 -tal osztva juttatható a CPU -ra.
-Direktben: Az elsődleges oszcillátor órajelét ill. annak 2-vel, 3 -mal, 4-gyel leosztott jelét vihetjük a CPU -ra.

Ahhoz, hogy az USB működhessen "Low-speed" módhoz 6 ill. 24 MHz, "Full-speed" módhoz 48MHz frekvenciájú árajelet kell adni az USB modulnak.

Továbbá az "External CLKI Frequency" maximális értéke "EC, ECIO Oscillator mode" -ban 48MHz, "HS Oscillator mode" -ban 4MHz, "HSPLL Oscillator mode" -ban 24MHz.

10MHz -es kvarccal az előosztó nem tud 4MHz -t előállítani, így csak a direkt mód lenne használható. Sajnos HS mód maximuma 4 MHz. EC vagy ECIO módban (külső oszcillátorról) a CPU mehet 10 MHz -ről, de az USB -nek sehogy sem lehet előállítani 6 ill. 24 MHz -et vagy 48 MHzt -et.
(#) Pako94 hozzászólása Jan 11, 2016 /
 
Sziasztok!
Megpróbáltam átolvasni a fórumot, próbáltam drivert cserélni, sajnos nem oldódott meg az alábbi probléma:

Egy PICAXE18M2+ került a kezembe, amin annak idején próbálgattam az egyszerű mikroproci használatot. A játéknak az vetett véget pár éve, hogy a laptopon nincs soros port, csak usb. Sebaj, vettem egy PL2303HX típusú USB-TTL konvertert ( TX,RX,GND,+5V). A PICAXE Editor 6 programmal nem sikerült kapcsolódnom, szerencsére van benne kábeltesztelő részprogram is. Nos, a TX-RX összekötéssel a küldött adat visszaérkezett a számítógépre, jöhet a következő lépés. Ekkor a program a TX lábat 5V-ra húzza a GND-hez képest, azonban ez nem történt meg, 0-0,3V marad változatlanul. Az usb 5 voltos kivezetése a +5V GND között mérhető.

Kérdésem, mi lehet a hiba? Az átalakító nem alkalmas?
Köszönöm a segítséget!
(#) Hp41C válasza Pako94 hozzászólására (») Jan 11, 2016 / 1
 
A program korából az valószínűsíthető, hogy közvetlenül kezelte a 16C450 - 16C550 -et. Ezek a megoldások nem működnek USB - COM adapterekkel.
(#) Pako94 válasza Hp41C hozzászólására (») Jan 11, 2016 /
 
Köszönöm válaszod!
Gondoltam, hátha én rontottam el valamit, ugyanis a PICAXE is forgalmaz USB letöltőkábelt, csak abban egy FT232RQ chip dolgozik, nem PL2303...
(#) icserny válasza Pako94 hozzászólására (») Jan 12, 2016 / 1
 
Van itt egy cikk (PDF), ami PICAXE letöltőkábel építéséről szól. Ha jól hámozom ki a lényegét, az RX, TX jeleket invertálni kell.
(#) Pako94 válasza icserny hozzászólására (») Jan 13, 2016 /
 
Köszönöm szépen, tökéletesen működik!
(#) dani9228 hozzászólása Jan 15, 2016 /
 
Hello. Az lenne a kérdésem, hogy hogyan tudnák mikroC pro-ban egy olyan PIC-hez programot írni, ami nincs benne a könyvtárában? EasyPIC v.7-em van, és az tudná magát a PIC et programozni. A típusa 16F505. Nézegettem az MPLAB-ot is, csak annyi a problémám vele, hogy az égető proginak hex- file kell.
Köszi.
(#) Hp41C válasza dani9228 hozzászólására (») Jan 15, 2016 /
 
Az MpLab assembler -ével vagy az XC8 fordítójával lefordítod a programodat hex állománnyá és a MicroProg -gal a hex állományt programozod be.
(#) dani9228 válasza Hp41C hozzászólására (») Jan 15, 2016 /
 
Köszi. Esetleg olyant nem tudsz amiben C-ben tudok programozni, majd abból HEX állományt csinálni? Vagy az XC8-ban tudok.
A hozzászólás módosítva: Jan 15, 2016
Következő: »»   739 / 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