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   1200 / 1210
(#) Peter65 válasza Pali79 hozzászólására (») Jan 2, 2024 /
 
Szia!
Ha elég lehet a fordulatszám harmadolás, akkor a hivatkozotthoz hasonló triakkos kapcsolással is lehet "frekvenciaváltót" készíteni. Már több témában volt róla szó, pl.: az aszinkron motoros elektromos kapuk motorjának is ilyen módon csökkentik harmadára a fordulatszámát. Elvileg lehet más fordulatszámokat is elérni, de azok esetében nagyobb lesz a kimeneti felharmonikus tartalom. Ha ez érdekes lehet, akkor az egyfázisú ciklonkonverterek világában kellene elmerülnöd.
(#) treshold válasza Hp41C hozzászólására (») Jan 2, 2024 /
 
Köszi.
Én a PICkitminus -t használom és egyenlőre úgy tűnik együttműködik az MPLAB X V6.15-el. De még tesztelem.
(#) Laja1 hozzászólása Jan 6, 2024 /
 
Sziasztok!
Egy ellenállás hőérzékelővel működő hőmérőt szeretnék építeni, ehhez PIC16F877A mikrovezérlőt használok. Eddig még csak olyan vezérlőket használtam, amiben volt belső óra. Ebben nincs. Ehhez vettem egy 20 MHz-es kvarckristályt, amit az OSC1 és OSC2 lábakra tettem. A kvarc és az OSC2 közé egy 470 ohmos ellenállást. A kvarc mindkét végére egy-egy 33 pF-os kondit, amiket földre kötöttem. Pont úgy, ahogy az adatlapjában szerepel. Ld. melléklet.
DE nem működik a PIC. Ezek után letöröltem a programot és egy egyszerű kapcsoló--LED programot írtam rá és az sem fut. Tehát itt a külső kvarcban keresném a hibát. A konfig biteknél a HS-t választottam.
Még arra gyanakszom, hogy lehet, hogy a kondenzátoroknak több hőt adtam, mivel csak SMD kialakításút kaptam, így azzal megküzdöttem. De sajnos nem tudom kimérni és a kvarcot se, mert nincs oszcillátorom.
Tudtok valami okosságot javasolni? Az ellenállás és a kondi értékek jók lehetnek?

Köszönöm!
A hozzászólás módosítva: Jan 6, 2024

kvarz.docx
    
(#) Bakman válasza Laja1 hozzászólására (») Jan 6, 2024 /
 
MCLR (1-es) láb felhúzva tápfeszültségre? Konfigurációban LVP kikapcsolva (ha nem használod), Watchdog kikapcsolva (ha nem használod)? Soros ellenállás nélkül is próbáld ki. Azok az esetek ritkábbak, amikor kell.

szerk.:
Nyílván a te dolgod, de vannak sokkal újabb, olcsóbb és jobb kontrollerek, mint ez az őskövület.
A hozzászólás módosítva: Jan 6, 2024
(#) Laja1 válasza Bakman hozzászólására (») Jan 6, 2024 /
 
Sajnos minden úgy van ahogy írod.
A jövőbeni munkák miatt, melyik kontrollert javaslod?
(#) Bakman válasza Laja1 hozzászólására (») Jan 6, 2024 /
 
Van másik, biztosan működő kontrollered? Mutasd meg az egyszerűbb programod, mert mire végigkérdezzük, mit hogyan állítottál be, szkállat ereszt mindenki.

Perpillanat a Q csalág a legújabb, sok hasznos beltartalommal. 40 lábú pl. PIC18F47Q43, 28 lábú pl. PIC18F27Q43. Családtagok közt van olyan, amelyik ismeri az USB/CAN kommunikációt.

Megnéztem egy magyar boltot.
PIC16F877A: 2500.- Ft (nettó)
PIC18F47Q43: 1060.- Ft (nettó)

A kettőt nem is nagyon lehet összehasonlítani. Utóbbi kisujjában van mindaz, ami az előzőben megvan.

Vagy PIC16F18877 (970.- Ft nettó).
(#) Laja1 válasza Bakman hozzászólására (») Jan 6, 2024 /
 
Ez volna a próbaprogram:
  1. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
  2. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  3. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  4. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  5. #pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
  6. #pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  7. #pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  8. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  9.  
  10. #include <xc.h>
  11. #include <pic.h>
  12.  
  13.  
  14.  
  15. #define uzemmod2  PORTBbits.RB5  // 0-100 C
  16.  
  17. #define RD4  PORTDbits.RD4
  18.  
  19. //__CONFIG( FOSC_HS & WDTE_OFF & PWRTE_OFF & CP_OFF & BOREN_ON & LVP_OFF & CPD_OFF & DEBUG_OFF);
  20. #define _XTAL_FREQ 20000000
  21.  
  22.  
  23.  
  24.  
  25.  
  26. int i, n, k,u, m, o, csak;
  27. int long j;
  28. int t=0, flag=0;
  29. unsigned int t2cnt,  sz;
  30.  
  31.  void  __interrupt() megszak (void)
  32.  {
  33.         if(PIR1bits.TMR2IF)
  34.         {
  35.             t2cnt++;
  36.             if(t2cnt==30000){t2cnt=0;flag=1;}// lej?rt 1 min
  37.            
  38.                
  39.           PIR1bits.TMR2IF=0;
  40.          }
  41.  }
  42.  
  43. void main()
  44. {
  45.    
  46.     // OPTION_REG = 0x55; // Set TMR0 configuration and enable PORTB pullups    
  47.      INTCON = 0b11000000; // ' Enable global interrupts, Disables all peripheral interrupts, disable timer0 interrupt        
  48.       //CMCON = 0x07 ;  // anal?g kompar?torok kikapcsolva, RA0-1 digit?lis port!
  49.      
  50.       // timer2 be?ll?t?sa
  51.       PR2=249;                  //timer2 250?rajel ut?n ujrakezdi a sz?mol?st
  52.       T2CON= 0b01001001 ;       //4 el?oszt?  modul on 10 ut?oszt?
  53.       PIE1bits.TMR2IE=1;        // tmr2 irq enable
  54.      
  55.    
  56.     CMCON=0b11000010;
  57.   //  CVRCON=0xC0;
  58.    
  59.     TRISB=0b11111111;
  60.     TRISC=TRISD=0;
  61.     TRISA0=TRISA1=TRISA2=TRISA3=1;
  62.    
  63.    
  64.  
  65.     while (1)
  66.     {        
  67.         // if (uzemmod1==1) u=1;
  68.          if (uzemmod2==1)
  69.          {
  70.           RD4=1;
  71.          T2CONbits.TMR2ON=1;
  72.          }  
  73.          
  74.           if(flag)
  75.           {RD4=0;
  76.          
  77.           }
  78.          
  79.    
  80.          
  81.      
  82.       }
  83.  
  84.  
  85.  
  86.  
  87.  
  88.   }
(#) benjami válasza Laja1 hozzászólására (») Jan 6, 2024 /
 
Első körben kapcsold ki az LVP-t és a BOREN-t. A kvarcra sok a 33pF, nagyjából 10-15pF az oda való 20MHz esetén.
(#) Laja1 válasza Bakman hozzászólására (») Jan 6, 2024 / 1
 
Megnéztem ezt az új Q családot. Újra kell tanulni az egészet, elszomorodtam. Maradok az ősréginél, amíg kapható!
(#) Laja1 válasza benjami hozzászólására (») Jan 6, 2024 /
 
Az LVP-t végül kikapcsoltam, mert használtam digitális bemenetként az RB3 lábat.
Az adatlapja azt írja, hogy 20 MHz-nél 15-33 pF megfelelő. Ezért választottam 33-t. Gondolod, hogy ez okozhat ilyen hibát, hogy semmit sem csinál a kontroller?
(#) Bakman válasza Laja1 hozzászólására (») Jan 6, 2024 /
 
Mennie kellene akkora kondenzátorral is. Oszcilloszkóppal lehet ellenőrizni, hogy megy-e a kvarc egyáltalán.

Ugyan ebben a programban nem érdekes, de az összes analóg láb analóg üzemmódban maradt (ADCON1 regiszter).

Teszt alatt az RD4 kimenet átvált H szintre? A Timer 2 megszakításban 1 perc szerepel a megjegyzésben, de az valójában 10 perc lesz (30 000 / 50 Hz).
(#) Laja1 válasza Bakman hozzászólására (») Jan 6, 2024 /
 
Nem vált szintet az RD4.
Az időt úgy számoltam, hogy a 20.000.000 Hz-t osztottam 4-gyel (egy művelet) aztán előosztó és utóosztó 4 és 10. Ennek vettem a reciprokat. Ezt 250-szer veszem, ez 2 ezred másodperc. 500-szor ennyi az 1 másodperc és azt 60-al szorozva ( tehát összesen 30.000-szer véve) 1 perc. Lehet hogy bonyolult, de szerintem logikus.

De ez legyen a legnagyobb problémám!
Sajnos ez nem segít a dolgon.
(#) Hp41C válasza Laja1 hozzászólására (») Jan 6, 2024 /
 
Release módban fordítottad?
(#) Laja1 válasza Hp41C hozzászólására (») Jan 6, 2024 /
 
Ezt nem tudom, hogy mit jelent.

De most először config2. módban tömörítettem az MPLAB X IDE felületen belül, majd ezután csináltam hex fájlt. Ez nem tudom okoz-e problémát. (Bár a próbaprogramot nem kellett tömörítenem és az se fut...)
(#) Pali79 válasza Bakman hozzászólására (») Jan 6, 2024 /
 
Találtam ezt a projektet.
Csak a működése kicsit magyarázatra szorul nekem. Sajnos a forráskód nem hozzáférhető. A pwm frekvencia vajon miért 4,88kHz? A színuszhoz közelítő jelalak, hogyan érhető el?
(#) Bakman válasza Pali79 hozzászólására (») Jan 6, 2024 /
 
Nem tudom, miért 4.88 kHz, valószínűleg így jön ki a matek egyszerűen. Egy fix PWM jel mindig állandó kitöltésű. Ha a kitöltést változtatod egy szinuszhullám függvényében (modulálod), akkor az "átlag" megközelíti a szinuszhullám alakját. Így működnek a frekvenciaváltók. Ezzel a kapcsolgatással érhető el a legkisebb veszteség készüléken belül, ezért használják ezt a módszert.

pwm-sin.png
    
(#) Bakman válasza Laja1 hozzászólására (») Jan 6, 2024 /
 
A "config2" jelenthet bármit, ez csak az aktív konfiguráció neve. Próbáltad a "megszokott" módon beállítani az MPLAB programot (talán config1 vagy default néven fut)? Egyébként igen, okozhat problémát.
(#) majkimester válasza Pali79 hozzászólására (») Jan 6, 2024 / 1
 
Ezt a kísérleti áramkört én követtem el. A PWM frekvencia azért ennyi, mert 20Mhz a külső órajel, ezt négyel osztva megkapjuk a belső órajelet, amit 1024-el osztva kijön a 4.88kHz. Az 1024 órajel van a PWM egy periódusának kiszámolására és kiküldésére. (Ennél persze kevesebb olyan 750 belső órajel kell a valóságban.)

Az áramkörben lévő PIC a két szimmetrikus PWM jelet teljesen software-ből generálja, manapság biztos találni olyan kontrollert, ami ezt megteszi hardverből, meg eleve gyorsabbat is könnyű találni, így feljebb lehetne menni frekvenciában a nem hallható tartomány fölé.

Meg lehet venni ILYEN modult (EGS002), és programozni sem kell és az áramkör nagy része is megvan.
A hozzászólás módosítva: Jan 6, 2024
(#) Pali79 válasza majkimester hozzászólására (») Jan 7, 2024 /
 
Megnéztem ezt a modult. Ha jól értem ebben a kimeneti frekvencia fix 50 vagy 60 Hz. Nekem pont a változtatható frekvencia lenne a lényeg, tehát ez nekem nem lesz jó. Jól értem?
(#) halfbit válasza Laja1 hozzászólására (») Jan 7, 2024 /
 
Igazából a kristály adatlapját is érdemes megnézni, (ha ismert a gyártója és pontos típusa) mert a gyártója tudja, hogy milyen kapacitásokkal fog a legstabilabban és a névleges frekin rezegni. Ha a PIC adatlapja közli az oszcillátor lábak kapacitását, akkor azt természetesen kivonni belőle. Ha nem közli, akkor marad a hasraütés.

Nem PIC-cel, hanem más kontrollerrel jártam már úgy, hogy szobahőmérsékleten rendben ment a szerkezet, de pár tíz fokot melegedve leállt a kristály oszcillátor, mert a kontroller adatlapján ajánlott kapac kevés volt a kristálynak a stabil működéshez.
(#) Laja1 válasza Bakman hozzászólására (») Jan 7, 2024 /
 
Az LVP-t és a BOREN-t kikapcsoltam. Default módra állítottam vissza, de semmi nem változott. A kis kondik beforrasztásánál sokat bénáztam, mert csak SMD kialakításút kaptam. Akkor már be volt forrasztva a kvarc is. Nem lehet, hogy vagy a kondi vagy a kvarc sok hőt kapott és tönkre ment? Ezt hogy tudnám csekkolni? (Tudom oszcilloszkóppal, de sajnos nincsen...)
(#) Bakman válasza Laja1 hozzászólására (») Jan 7, 2024 /
 
Idézet:
„Nem lehet, hogy vagy a kondi vagy a kvarc sok hőt kapott és tönkre ment?”
Lehetséges. Ha multiméterrel nem mérsz zárlatot, attól még szakadt lehet.
(#) majkimester válasza Pali79 hozzászólására (») Jan 7, 2024 /
 
Idézet:
„Megnéztem ezt a modult. Ha jól értem ebben a kimeneti frekvencia fix 50 vagy 60 Hz.”

A modul így van megcsinálva, de a raja lévő EG8010 tudja a 0..100Hz vagy 0..400Hz tartományt is csak a 19-es lábat a GND helyett a tápra kell húzni és a 16-os lábra kell beküldeni a kívánt frekvenciával arányos jelet.
(#) KoblogPerGyok válasza Laja1 hozzászólására (») Jan 9, 2024 /
 
Szia!

Ez biztosan jó?
T2CON= 0b01001001 ;

A jobb olaláról haladj a bal felé, mert ez a regiszter csak 7 állítható bittel redelkezik, a legmagasabb helyiértéken 0-nak kell lenie, de épp kikapcsolod a timer2-t!

A datasheet 61.oldalán van.
Datasheet

Már ha jó adatlapot nézek.
Szóval jobboldalról nézve az első két bit Prescale
utána a Timer2 on/off bit, ami nálad nulla
utána 4 bit Post scale

Ez mindösszesen 7 bit. Elcsúsztál szerintem egy bittel!
De tévedhetek is. Én ezért szoktam a megfelel biteket külön a nevével állítgatni. Tudom hosszabb és az MPLAB-nak is ismernie kell, de jobb néha szerintem. De csak gyorsan ránéztem, lehet nem ez a gondod.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Jan 9, 2024 /
 
Ok, benéztem, bocs, már nemengedte törölni.

Látom, hogy a while-ban éppen ezt a bitet állítod 1-re. Bocs mégegyszer, elnéztem!
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Jan 9, 2024 /
 
Ez pontosan hogyan működik?

  1. if (uzemmod2==1)
  2.          {
  3.           RD4=1;
  4.          T2CONbits.TMR2ON=1;
  5.          }


Az uzemmód változód 1 értékkel van. Elvileg elindul a timer2. Utána pillanatok alatt megint erre a kódra fut a vezérlés. Ha az uzemmód2 változód megint 1 maradt, akkor ha újra bekapcsolod a timer2-t, az nem okoz gondot? dsPIC-nél ilyenek azért okoztak nálam galibákat. Csak azért kérdezem, mert a szoftverhibát könnyebb javítani, mint a hardvert, hátha szerencsés vagy és ilyen a gond csak...
Szóval a T2CONbits.TMR2ON=1; nem vonja maga után a timer resetet is? Mert ha igen, akkor soha nem éri el a beállított értéket, ezért az interrupt függvény sem fut le soha.
Esetleg egy segédváltozót Volatile-ként defniálva, és azt betenni az if-ekbe is, ha nem fut a timer, akkor indítsa el. Az interrupt függvényben meg ez a változó 0-ra, ha lefutott a counter.

No meg még egy gond is van.
Az interruptban lévő változók NEM Volatile-ok!!

t2cnt NEM Volatile, azaz össze vissza változik. Ezzel kezd, ez nagy baj. Ha utána sem megy, akkor a plusz változóval csak akkor indít, ha nem fut a timer2. Ez a plusz változó is Volatile. Ha ekkor sem megy, akkor a hardveres hiba.

dsPIC-nél ezekre nagyon kellett figyelni, szerintem itt is fontosak, főleg a Volatile!

no meg persze a flag-et is állítod interruptban, annak is volatile-nak kell lennie!
A hozzászólás módosítva: Jan 9, 2024
(#) benjami válasza KoblogPerGyok hozzászólására (») Jan 9, 2024 / 1
 
Attól, hogy egy változót megszakításban használsz még nem szükséges volatile -nak definiálni. Csak akkor kell, ha a változót a megszakítás függvényen kívül is felhasználod. Magyarul: ha több független programszálban is használva van az a változó. Jelen esetben t2cnt nem kell, hogy volatile legyen, mert csak a megszakításban van felhasználva, a flag-nek viszont annak kellene lennie.
(#) KoblogPerGyok válasza benjami hozzászólására (») Jan 9, 2024 /
 
És a flag?
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Jan 9, 2024 /
 
Továbbá sokkal egszerűbb kideríteni, hogy a külső oszcillátor megy-e, ha a beépített delay-el a while-ban villogtat egy LED-et, azaz eldönti megy-e egyáltalán, illetve ha láthatóan nem 1s, akkor a beállításokkal van gond.
A másik, hogy sokszor a Timer2 külső oszcillátorról is mehet a belső órajeltl függetlenül, nem a belső sínről, amit most a külső oszcillátor hajt meg. A két dolog lehet független egymástól, ennek is utána kellene járni, hogy melyik van beállítva. De ezt a PIC-et fejből nem ismerem, simán lehet jó is.
Elsőre szoftveresen próbálkoznék mindenképp, utána ha nincs szerencsém, akkor hardver hiba.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Jan 9, 2024 /
 
Látom írod is a flag-et, azt nem vettem észre, bocs!

De ennek ellenére szerintem, ha a flag is az, akkor is éremes meg gondolni, hogy ha nem megy így sem, akkor nem indítom a timert folyton, mert ami indítja változó simán nem vált, lehet reseteli. Szerintem egy sima led vilogtatás kellene megfelelő ellenállással és akkor a leosztásoknak és a kvarc frekijének ismeretével egy sima másodpercet is mutató órával nagy vonalakban elleőrizhető is lenne. A timert-t elindítanám a main-ban, az interruptban meg negálnám a LED lábát. Persze ekkor sokszorosan le kell osztani az órajelet. 20MHz/(256*256) lehet ide nem lesz elég sajnos. De legalább villogna

Másik meg, hogy nem indítok semmit, a delay-t a while-ba ahol negálnám a LED lábát és kész. Ha az oszcillátor nem megy, akkor ott kibukik a hiba rögtön.
A hozzászólás módosítva: Jan 9, 2024
Következő: »»   1200 / 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