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   1141 / 1203
(#) foxi63 válasza Peet19 hozzászólására (») Dec 11, 2020 / 1
 
Szia!
Azért nem működik a megszakítás, mert ez a sor:

"INTCONbits.IPEN = 1; // Megszakítás prioritás engedélyezve"
bekapcsolja a kétszintű megszakítást, viszont sehol sem látom, hogy hol rendeled a timer2 megszakítását a magas , vagy az alacsony priorítású megszakításhoz.
Ha nem piszkálod az INTCONbits.IPEN bitet, akkor csak "normál" megszakítású üzemmód van,ekkor simán működik ....
(#) Peet19 válasza Tasznka hozzászólására (») Dec 11, 2020 /
 
Értem, köszi, ismét tanultam egy jó dolgot ezentúl így csinálom. Hex-ben azért írok ritkábban, mert előbb látom a binárist és azt kellene átváltanom hex-re. Decimálisról nem is beszélve.
Elolvastam az adatlapon amit mondasz, megértettem most már mindent. Köszi mégegyszer.
(#) lastewer hozzászólása Dec 11, 2020 /
 
Sziasztok,

Lehet mérni ellenállást egy PIC-el?

Azt szeretném, hogy X db helyre beteszek X db ellenállást, ezt mind rákötöm PIC-re és az megmondja nekem, ha pl, levágtam X db ellenállást az adott áramkörről.

pl. van 5 db ellenállásom, 220ohm, 1k, 2k, 2.2k, 3k.

Ezek mind 1-1 szál vezetéken vannak rajta. Ha az egyik ellenállást levágják, akkor szeretném tudni melyiket.

Lehet ilyet?
(#) bbalazs_ válasza lastewer hozzászólására (») Dec 11, 2020 / 1
 
Lehet.
A/D bemenetre teszel egy feszültségosztót, tehát van egy fix ellenállásod mondjuk alul, felülre rakod az összeset. Ha egyet elvágnak, megváltozik a felső rész ellenállása és így a rajtuk eső feszültség.
Úgy kell megválasztani az alsó értékét, hogy a legszélsőségesebben változzon a fesz.

Vagy úgy is meg lehet egyszerűbben csinálni, hogy 5db külön bemenetre teszed az ellenállásokat, ismert alsó értékekkel. De ilyenkor tudnod kell, melyik ellenállás hova volt kötve.
(#) Bakman válasza lastewer hozzászólására (») Dec 11, 2020 /
 
Idézet:
„Ezek mind 1-1 szál vezetéken vannak rajta.”
Ezt részletezd alaposan de ha lehet, inkább rajzold le. Messze nem egyértelmű, mit is szeretnél.
(#) Peet19 hozzászólása Dec 11, 2020 /
 
Sziasztok!

Kaptam egy hétvégi házit amit egy kicsit furcsálok. Ha van valakinek kedve átnézni és ha rábólint akkor neki állok. Ha nem akkor nem, mert szerintem egy kicsit furcsán számolgat a tanár.

hf2.txt
    
(#) Peet19 hozzászólása Dec 11, 2020 /
 
Azt elfelejtetem mondani, hogy ez Mikrovezérlők alkalmazástechnikája, és C programozás.
(#) benjami válasza lastewer hozzászólására (») Dec 11, 2020 /
 
Közvetlenül ellenállást azt nem. Feszültséget ellenben lehet a benne levő A/D átalakítóval. Csak azt a feladatot kell megoldanod, hogy az ellenállást feszültséggé alakítsd. Ehhez javaslom, hogy tanulmányozd át egy multiméter kapcsolási rajzát, mert az sem tud direkt ellenállást mérni, hanem az is először feszültséggé alakítja.
(#) Peet19 hozzászólása Dec 15, 2020 /
 
Sziasztok!

Van egy kis problémám a Timer0 időzítésével. Akármit csinálok a számolt érték kb. 4x -ese jelenik meg a kimeneten.
Már mindenfélét próbáltam állítgatni, de semmi változás. Vagy a számlálót nem jól állítottam be, vagy az oszcillátort.
Mi lehet a probléma?
Előre is köszi a segítséget!

  1. #include <xc.h>
  2. #include <pic18f27k40.h>
  3. #include "config_bits.h"
  4.  
  5. /********** Globális változók ***********/
  6. volatile char tmr0_flag = 0;
  7. int           tmr0_cnt  = 0;
  8.  
  9. /**************** Deklarációk ***************/
  10. void init_base(void);
  11. void init_interrupt(void);
  12. void init_tmr0(void);
  13.  
  14. void __interrupt(high_priority) Isr(void);
  15.  
  16. void main(void) {
  17.    
  18.     /****** Inicializálás ******/
  19.     init_base();
  20.     init_interrupt();
  21.     init_tmr0();
  22.    
  23.     /************* Főprogram *************/
  24.     while(1){
  25.        
  26.         // Ha Timer0 megszakítás érkezett
  27.         if(tmr0_flag){
  28.             TMR0L     = 5;      // Számláló kezdőérték beállítása 250-re
  29.             TMR0H     = 255;    
  30.             tmr0_flag = 0;
  31.             tmr0_cnt++;
  32.             if(tmr0_cnt == 500){ // ha eltelt 500ms
  33.                 LATCbits.LATC2 = ~PORTCbits.RC2;
  34.                 tmr0_cnt = 0;
  35.             }
  36.         }
  37.        
  38.     }
  39.  
  40.     return;
  41. }
  42.  
  43. /*************** Alapbeállítások ***************/
  44. void init_base(void){
  45.    
  46.     // 16MHz -re állítom a belső oszcillátort
  47.     OSCFRQ  = 0b0101;     // 16MHz HFINTOSC
  48.     OSCTUNE = 0;          // A kalibrált frekvencián működik
  49.     OSCENbits.HFOEN = 1;  // A kalibrált OSCFRQ szerint működik
  50.     OSCCON1bits.NDIV = 0b0010;
  51.    
  52.    
  53.     // Analog funkciók letiltva. Digitálisra állítva az összes láb
  54.     ANSELA = 0;
  55.     ANSELB = 0;
  56.     ANSELC = 0;
  57.    
  58.     // Minden láb kimenet
  59.     TRISA = 0;
  60.     TRISB = 0;
  61.     TRISC = 0;
  62.    
  63.     // Minden láb jelszintje alacsony szintű
  64.     LATA = 0;
  65.     LATB = 0;
  66.     LATC = 0;
  67.    
  68. }
  69.  
  70. /*************** Megszakítás ***************/
  71. void init_interrupt(void){
  72.    
  73.     INTCONbits.GIE_GIEH  = 1;  // Globális megszakítás engedélyezve
  74.     INTCONbits.PEIE_GIEL = 1;  // Perifériás megszakítás engedélyezve    
  75.     PIE0bits.TMR0IE      = 1;  // Timer0 interrupt engedélyezve
  76.    
  77. }
  78.  
  79. /*************** Timer0 ***************/
  80. void init_tmr0(void){
  81.    
  82.     T0CON0bits.T0EN    = 0;         // A beállítások előtt letiltom a Timer0 modult
  83.     T0CON0bits.T016BIT = 1;         // 16 bitesre állítom a számlálót
  84.     TMR0L              = 5;         // Számláló kezdőérték beállítása 250-re
  85.     TMR0H              = 255;    
  86.     T0CON1bits.T0CS    = 0b010;     // Órajel forrás kiválasztása Fosc/4
  87.     T0CON1bits.T0CKPS  = 0b0100;    // 1:16 az előosztási arány
  88.    
  89.     T0CON0bits.T0EN    = 1;         // Modul bekapcsolása
  90.      // 1ms -onként okoz megszakítást ha 16MHz-es a belső oszcillátor
  91. }
  92.  
  93. /*************** Megszakításkor lefutó függvény ***************/
  94. void Isr(void){
  95.    
  96.     if(PIR0bits.TMR0IF){          // Ha Timer0 okoz megszakítást (eltelt 1ms)
  97.         PIR0bits.TMR0IF = 0;      // A megszakítást jelző bitet visszaállítom 0 -ra  
  98.         tmr0_flag       = 1;      // Jelzem a főprogramnak hogy TMR0 megszakítás érkezett
  99.     }
  100.    
  101. }
(#) eSDi válasza Peet19 hozzászólására (») Dec 16, 2020 / 1
 
Hali!

A beállítások jónak tűnnek. Így próbáld.

  1. while(1){
  2.      if(tmr0_cnt == 500){ // ha eltelt 500ms
  3.             LATCbits.LATC2 = ~PORTCbits.RC2;
  4.             tmr0_cnt = 0;
  5.        }
  6. }


  1. void Isr(void){
  2.     if(PIR0bits.TMR0IF){          // Ha Timer0 okoz megszakítást (eltelt 1ms)
  3.         TMR0H     = 255;
  4.         TMR0L     = 5;      // Számláló kezdőérték beállítása 250-re
  5.         tmr0_cnt++;
  6.         PIR0bits.TMR0IF = 0;      // A megszakítást jelző bitet visszaállítom 0 -ra
  7.     }
  8. }


Nem jó a fő programnak átadni, hogy milyen megszakítás történt és ott végezni minden feladatot (ha sok az egyéb feladata, nem fogja időben végrehajtani). A megszakításban elvégzendő dolgokat ott helyben kell végrehajtani, mielőtt törlöd az IF bitet. A fő programnak meg a saját dolgával kell törődnie. A TMR0H-t előbb kell beírni, mert az pufferelt és a TMR0L beírásakor az is átmásolódik a Timer-be.
(#) Peet19 válasza eSDi hozzászólására (») Dec 17, 2020 /
 
Értem, köszönöm. Este leszek otthon gépnél akkor kipróbálom és jelzem hogy mi lett az eredmény.
Én pont úgy tanultam, hogy a megszakításkor lefutó függvényben minél rövidebben kell megfogalmazni a megszakítás további teendőit, és inkább a while -ban kell feldolgozni és a további utasításokat végrehajtatni.
De hiszek neked, így csinálom ahogy írtad, köszi.
(#) Peet19 válasza eSDi hozzászólására (») Dec 17, 2020 /
 
Még egy kérdés eszembe jutott. Amit írtál az ISR()-r, az mennyi idő alatt hajtódik végre?
Hogy kell ezt kiszámolni?
Én úgy gondolom, (nem biztos hogy jól tanultam), de ha 16MHz az órajel akkor az utasításciklus 16MHz/4 = 4MHz. Ez 250ns/periódus ha jól számolok. Vagyis akkor 1 utasítás 250ns ideig tart.
Ami a ciklus törzsében van 4 sor az 4 utasításnak fele meg (akkor 4 * 250ns = 1us)?
Vagy egy utasításciklus a kiértékelés (mondjuk megkeresi a TMR0H regisztert) és az értékadás is egy plusz utasításciklus? Ha igen akkor egy sor ( TMR0H = 255; ) egy vagy két utasításciklus alatt hajtódik végre?
Gondolom maga az if() feltétel kiértékelése is 1 utasításciklus alatt megy végbe (250ns), akkor az egész függvény 1.25us ideig tart mire a while()-ra kerül a program végrehajtása?
Amikor az Isr() lefut ez alatt az idő alatt a while() megáll? Várakozik?
Bocs ha túl sokat kérdezek de ezeket nagyon fontos megtanulnom
(#) Peet19 válasza eSDi hozzászólására (») Dec 17, 2020 /
 
Még valamit nem értek, Bocsi
Idézlek:
Idézet:
„A TMR0H-t előbb kell beírni, mert az pufferelt és a TMR0L beírásakor az is átmásolódik a Timer-be.”

A TMR0H:TMR0L az maga a számláló ha jól tudom (16biten). Hogy kell értelmezni ezt a puffer dolgot?
Gondolom az egy átmeneti tároló egy foglalt memóriaterület, de akkor nem mindegy a sorrend? Úgyis csak akkor záródik le az áttöltés ha minden bit a helyére került.
(#) bbalazs_ válasza Peet19 hozzászólására (») Dec 17, 2020 /
 
Ez c. Nincs exact megfelelés. Ha ciklusidőt akarsz, assembly-t kell használni.
Vagy bitet bebillenteni és szkóppal nézni.
(#) Hp41C válasza Peet19 hozzászólására (») Dec 17, 2020 /
 
  1. void Isr(void){

E sorhoz több utasítás is fordul. Menteni kell a W és a STATUS regiszterek értékét. Minimálisan 3 utasítás kell hozzá, de a fordító beállításai több munkát is adhatnak.
  1. if(PIR0bits.TMR0IF){

A bit vizsgálata valóban 1 utasítás, de a feltétel nem teljesülésekor ugrani kell, így 2 utasításnyi időt kell számolni.
  1. TMR0H     = 255;

Tudni kellene a fhasznált kontroller típusát. PIC18 esetén 1, PIC12-PIC16 esetén 2 utasítás.
  1. TMR0L     = 5;

2 utasítás.
  1. tmr0_cnt++;

Minimum 1 utasítás, de függ attól, hogy hova foglaltuk a változót - bankváltás.
  1. PIR0bits.TMR0IF = 0;

Minimum 1 utasítás, de függ attól, hogy hova foglaltuk a változót - bankváltás.
  1. }

A visszatéréskor a mentett értékeket vissza kell állítani a STAUS és a W regiszterekbe, ill. amit még előírt a fordító. Minimum 4 utasítás és még egy a retfie.

Az MpLab -ban van lehetőség programrészletek futási idejét "megmérni". Ki kell választani a Simulator -t nyomkövetőnek, újra kell fordítania kódot. A rutin elejére kell állítani a programszámlálót. Be kell állítani az órajel frekvenciáját és el kell helyezni egy töréspontot a rutin végére. A Stopwatch ablakot megnyitva láthatjuk a végrehajtott utasítások számát és idejét is.
A hozzászólás módosítva: Dec 17, 2020
(#) Peet19 válasza Hp41C hozzászólására (») Dec 17, 2020 /
 
Értem, köszi, a fordító idejére nem is gondoltam. A cél a későbbiekben mindenképp Assembly de C-ben programozok ezért gondoltam C-ben kezdeni a PIC programozást hogy mihamarabb legyen sikerélményem.
A "mentorom" is (aki szintén fórum tag) az Assembly-t javasolja de őszintén megvallva egy kicsit félek tőle. Nagyjából 8 éve programozok, (nem ide való nyelveken) ebből még nincs 1 éve C-ben. Belenéztem az Assemblybe is tavaly nyáron és túl soknak találtam, ezért inkább a C-.t választottam. Így csak a 18F sorozattal szimpatizálok egyenlőre. Ettől függetlenül nagyon tetszik az Assembly, úgyhogy biztos hogy meg fogom tanulni csak egy kis időt kérek még rá.
Az MPLAB debbuggerjét még nem nagyon vágom, úgyhogy rajta vagyok, csak sajna nagyon kevés a segítség.
A suliban megcsináltam amit írtál, Stopwatch, breakpoint ..stb csak már elfelejtetem
De rajta vagyok, ígérem!
Jaa, a PIC amiről szó van az a PIC18F27K40

bbalázs: ez neked is szólt.
A hozzászólás módosítva: Dec 17, 2020
(#) eSDi válasza Peet19 hozzászólására (») Dec 18, 2020 /
 
Hali!

Úgy látom a legtöbb kérdésre már választ kaptál.

Ennél a PIC-nél a Timer0 16bit-es módjánál a TMR0H egy átmeneti puffer, a TMR0L olvasásakor kerül bele az aktuális érték (azt hiszem debug-kor nem is látod számlálni a TMR0H-t), illetve a TMR0L beírásakor kerül át a valódi regiszterbe a TMR0H-ból. Így biztosítják a pontos érték kiolvasását/beírását.
Ez a puffer a timerhez tartozik, nem foglal több memóriát. Lásd adatlap.

Nekem van olyan programom, ahol fix 20ms a ciklusidő. Ezt egy timer hozza létre megszakítással. Minden művelet ebben a 20ms-ben történik (kicsit PLC szerűen), nem tudom mennyi idő alatt, sosem mértem meg. Itt semmit nem adok át a fő programnak. A fő program csak az őrkutya buksiját simogatja állandóan.

Megszakításban a hosszú időzítéseket kell kerülni, mert akkor a fő programodat úgy fogod látni, mintha akadna/lefagyna.
(#) bbalazs_ válasza Peet19 hozzászólására (») Dec 18, 2020 /
 
Köszi, én nyugodtan alszom akkor is, ha nincs válasz
Szerintem feladathoz válassz eszközt. Amikor nem időkritikus részek vannak, nyugodtan használj magasabb szintű nyelvet. Ha viszont időzíteni kell komolyabban, akkor megfontolandó az assembly.
Én nagyon vad assemblys vagyok (18f-et és PIC24-est is, PC-t is abban programozok), de már vannak kikacsintásaim a C felé, más mikrovezérlők esetén.
(#) Peet19 válasza eSDi hozzászólására (») Dec 19, 2020 /
 
Hello!
Így már minden érhető, köszi. Próbáltam mindig arra törekedni hogy a megszakításkor lefutó függvényen belül éppen csak annyi történjen ami nagyon muszáj, és inkább a while-ban dolgozom fel tovább a tennivalókat.
Még egy gyors kérdés eszembe jutott:
Ahogy Hp41C írta, összeadtam és ha jól számolok akkor minimum 13 utasításciklus kell ahhoz hogy a megszakításkor lefusson az Isr() függvény.
Most egy 8MHz-es kristállyal próbálkozom, Így 8MHz/4=2MHz akkor 1/2000000=500ns lesz a periódusidő vagyis az egy utasításciklus ideje. Ha ezt megszorzom 13-al ami az Isr()-hez kell akkor 6.5us szükséges ahhoz hogy megszakításkor lefusson a függvény és utána újra induljon minden. Ezután a while()-ban lévő dolgok lefutási ideje is nagyjából ugyanennyi lehet (sacc). Ez így 13us ideig tart ami 1/13us=76.9kHz, vagyis ekkora a maximum freki amit elő lehet állítani a PIC-el?
(#) Peet19 válasza bbalazs_ hozzászólására (») Dec 19, 2020 /
 
Szeretném én is majd egyszer ilyen szinten megtanulni, bár PC-re már tényleg elég durva
(#) eSDi válasza Peet19 hozzászólására (») Dec 19, 2020 /
 
Szerintem ne bonyolódj bele ebbe a számolgatásba. C-nél nem igazán tudod, hogy mit hoz össze a fordító a háttérben, így pontosan kiszámolni nem sok esélyed van.
Ha pontosan akarsz mérni/előállítani egy jelet, akkor Assembly. Vagy az újabb PIC-ekben van sok minden jó dolog, ami erre használható (Kapuzható és összefűzhető számlálók, CLC, DSM, SMT, stb), így akár hardverből össze lehet hozni a kritikus részeket.
(#) Peet19 válasza eSDi hozzászólására (») Dec 19, 2020 /
 
Rendben, köszi.
(#) korozsi hozzászólása Dec 21, 2020 /
 
Sziasztok.
Most irok ide elöször, de segitsegeteket kernem.
Utanepitek egy inverteres hegesztö gepet es mint a kepen is latszik PIC IC.-vel vannak a höerzekelök illetve a digitalis ampermerö keszitve.
Tudna-e valaki ebben segiteni, hogy hogyan kell elkesziteni, esetleg valakinek van-e ilyen rajza vagy hogy hol talalok ilyen rajzot.
A fenykepen jol latszik, hogy PIC16F877A van benne.
Megjegyeznem, hogy aki epitette az invertert nem tette közze a panel tervet, meg semmit.

Minden megoldas, ötlet, bar mi ami a megoldashoz közelebb visz erdekel.
Persze esetleg valami program ami vezerli az egeszet.

A valaszokat elöre is köszönöm.

Üdv.: Gabor
A hozzászólás módosítva: Dec 21, 2020
(#) Bakman válasza korozsi hozzászólására (») Dec 21, 2020 /
 
Hogyan akarod utánépíteni, ha semmilyen dokumentáció nincs róla?

Inkább itt nézz szét: Bővebben: Link.
(#) kaqkk válasza korozsi hozzászólására (») Dec 21, 2020 /
 
Ha szerencséd van a készítő nem tolta rá a picre a kódvédelmet , akkor kiolvasható (és lementhető) a pic tartalma,pickit2-pickit3 pic égetővel .
(#) foxi63 válasza korozsi hozzászólására (») Dec 21, 2020 /
 
Ha esetleg a programozás sem menne. megoldható 1db
LM339 IC és 1DB ICL7107 -es ic-vel is nem kell feltétlen PIC-et programozni.
Ahőmérsékletet a komparátorok ellenőrzik, a kijelzést meg felügyeli a másik.
A hegesztő vezérlésébe eleve nem szól bele a PIC
üdv.:Foxi
A hozzászólás módosítva: Dec 21, 2020
(#) Bakman válasza korozsi hozzászólására (») Dec 21, 2020 /
 
Nem ismerem a rendszert de nagy valószínűséggel a PIC csak mérő/ellenőrző egység, a vezérlésben nem játszik szerepet. Esetleg kapcsolgatja a ventilátorokat. Könnyen lehet, hogy anélkül is működik bőven. A hegesztőáram szabályzását nem olyan egyszerű (talán nem is lehet) megoldani ilyen kaliberű mikrokontrollerrel.

Kicsit körbenéztem, 25 000 Ft-ért már lehet kapni hegesztőgépeket. Nem biztos, hogy megéri otthon ilyennel foglalkozni. Amennyiben az építés öröme hiányzik, akkor nem szóltam.
(#) korozsi válasza foxi63 hozzászólására (») Dec 21, 2020 /
 
Köszönöm a reagalasokat.

A geppel kapcsolatban minden dokumentacio meg van, csak a PIC.-es es a kijelzö panelrol nincs semmi. A PiIC mint Bakman valaszolt, csak merö es ellenörzö funkiot tölt be, semmi egyebet. Ha nincs benne attol a gep meg müködik. Viszont nekem tetszik az az egesz.

25000Ft az meg milyen hegesztö gep, valami jo kinai amibe szinte annyi minden van benne amivel eppen müködik, az egy...... nem akarom titulalni.

A kod kiolvasas sem lehetseges, mert ki tudja mi van azzal aki keszitette a gepet, hisz mar 11 honapja nincs fent a forumon.

Egyenlöre foxi63 latom a leg jarhatobb utnak. Hogyan gondoltad, valami ötlet,rajz stb.

Üdv.: Gabor
A hozzászólás módosítva: Dec 21, 2020
(#) sonajkniz válasza korozsi hozzászólására (») Dec 21, 2020 /
 
Lehet tudni pontosan, hogy mit mér, mi alapján?
Mert ha pl. kap egy 0-5V-ig terjedő jelet az árambeállításnak megfelelően, arra könnyen összedobható egy kijelzés.
(#) korozsi válasza sonajkniz hozzászólására (») Dec 21, 2020 /
 
Igen lehet tudni mit mer, elöször is hömersekletet harom szenzoron keresztül. A masik az aram erösseget,a potmeter elforgatasaval a kijelzön csökken illetve nönek a szamok az az max allasban kb 140 minimum allasban kb 20 ampert mutat.
Következő: »»   1141 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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