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   1194 / 1206
(#) Elektro.on válasza don_peter hozzászólására (») Szept 11, 2023 / 1
 
Ha van szabad lábad a PIC en és a szoftveres mókolás mehet, Én megpróbálnék egy olyat, hogy egy külső 1kHZ ellenőrzött órajelet adnék neki. Szoftveresen pedig ehhez kalibrálhatná magát.

Bocs! Most látom, hogy elkéstem ezzel az ötlettel.
A hozzászólás módosítva: Szept 11, 2023
(#) don_peter válasza asch hozzászólására (») Szept 11, 2023 /
 
Sajnos a PWM jelet az eszközöm adja ki fixen és a másik fél amplimodulál. Tehát összességében csak rángatja a feszültséget. Analóg porton pedig figyelem a feszültséget és ebből számolom ki, hogy mit pofázik vissza a másik fél. Potit én is "rossznak" találom, főleg a páratartalom miatt is, bár lehet kapni egész jó precíziós trimereket is.
Jobb lenne egy automatikus offsetelés. Agyalok rajta még.
(#) don_peter válasza KoblogPerGyok hozzászólására (») Szept 11, 2023 /
 
Az hogy folytonos relatív. Idővel szerintem csökken, de mondhatni lineárisan.
Sajnos nincs szabad portom, mind telítve van, talán ha valamit kiiktatok, akkor talán. (pl. az egyik LED-et)

Ez a digitális jel még működhet, egy másik kütyü beépítésével. Adna egy fix jelet, azt mérni és mivel tudjuk mit kellene mérnie a különbözetből lehetne kiszámítani a kompenzációt. Ez jó ötlet. A kivitelezés már egyel körülményesebb, de ha szoftvert kell cserélni, az sem lenne kevésbé körülményes szóval...
(#) don_peter válasza Elektro.on hozzászólására (») Szept 11, 2023 /
 
De jó ötlet, igen picit megelőztek, de ettől még teljesen korrekt..
(#) Hp41C válasza don_peter hozzászólására (») Szept 13, 2023 / 1
 
Ha az a láb, amit felszabadítasz véletlenül azt OSX1 láb, akkor EC módban külő órajelről is járhatna a PIC. Az OSC2 továbbra is lehet I/O.
(#) don_peter válasza Hp41C hozzászólására (») Szept 17, 2023 /
 
Igen pont ez a láb az.. Egy LED-et vezérlek róla, csak egy sima üzemjelző LED van a lábon, erre gondoltam, hogy fel lehetne használni. Köszi az ötletet.
(#) fotomen32 hozzászólása Okt 4, 2023 /
 
Üdv mindenkinek.
Még kezdő vagyok a témában.Van egy PICKIT2 programozóm és szeretnék egy led karórát építeni.Az lenne az első kérdésem hogy van e olyan pic amiben már benne van az RTC hogy ne keljen külön csipet használni hozzá,elképzelésem szerint 12 kimenet, 2 bemenet 2 táp, 2 kvarc lenne szükség vagyis egy 18 lábú elég is lenne.Mit ajánlanátok a feladatra?
(#) sonajkniz válasza fotomen32 hozzászólására (») Okt 4, 2023 / 1
 
Mit kell kijeleznie az órának?
Ha csak az időt, akkor a legtöbb PIC ezt külön RTC nélkül is könnyedén megoldja ezt a feladatot egy 32,768KHz-s kvarccal. A külön RTC-nek az az igazi haszna, hogy a PIC altatható folyamatosan, csak akkor ébred, ha meg akarod nézni az időt.
Ezáltal az áramkör jóval kevesebbet fogyaszt. Ha ez annyira nem szempont, akkor a PIC18F14K22-est ajánlanám. Mindössze 20 lábú, és elég stabil.
Azt nem tudom, miben akarod programozni, de ha assemblyben, akkor pláne jó választás, mert nem kell a bankváltásokkal bajlódni.
(#) fotomen32 válasza sonajkniz hozzászólására (») Okt 4, 2023 /
 
Igen csak óra perc kijelzés lenne és az is csak addig amíg a gombot megnyomom.
A fogyasztás az fontos lenne mert ha megoldható akkor egy cr2032 elemet szeretnék használni ami 3v bár lehet ez már kevés lesz a pic nek.
(#) sonajkniz válasza fotomen32 hozzászólására (») Okt 4, 2023 / 1
 
Ez a PIC 1,8-5,5V-ig dolgozik.
A PIC fogyasztása nagyban csökkenthető, ha alapvetően alszik, és csak 2 másodpercenként ébred timer1 által vezérelve. Ilyenkor pár villámgyors számítás, és megy vissza szunyálni, hacsak nem érzékel gombnyomást. Ha igen, kapcsolja a ledeket. A gomb elengedése után törölni kell az összes kimenetet, (még kisebb belső fogyasztás érhető el, ha altatás előtt a kimeneteket átkapcsoljuk bemenetté) majd mehet újra aludni. Persze így se számíts többéves működésre, de 6-8 hónapig azért elmegy egy 2032-essel.
(#) fotomen32 válasza sonajkniz hozzászólására (») Okt 4, 2023 /
 
Köszönöm ez biztató.
(#) sonajkniz válasza fotomen32 hozzászólására (») Okt 4, 2023 / 1
 
Ez az óra ugyancsak 2032-es elemmel csaknem 1 évet működött, bár a végén már csak sötétben lehetett látni.
(#) asch válasza sonajkniz hozzászólására (») Okt 4, 2023 / 1
 
Szerintem maga a CPU altatható külső RTC nélkül is, csak az oszcillátor kell hogy működjön, meg a timer. A timer overflow (pontosan két másodpercenként), és a gombokra rakott pin change interrupt ébresztheti a CPU-t.
fotomen32-nek: Egy ATMEGA328p-t egyszer méregettem, hogy mennyit fogyaszt alvó módokban. A legfontosabb, hogy egyik láb se maradjon lebegve! Ha lebeg a láb, akkor esetleg belül változást tud indítani, és akkor fogyaszt a csip. Nem kell feltétlen külső le/felhúzó ellenállás, de a belsőt be kell álllítani a nem használt lábakra. Alapból ezek a csipek úgy működnek, hogy állapotváltozás nélkül a tranzisztorokon nem folyik áram, és nincs fogyasztásuk. A kivétel az oszcillátor és a számláló lesz, ennek menni kell. Ha a külső RTC oszcillátora hatékonyabb, mint maga a PIC, akkor lehet csak javítani azzal a hatékonyságot.

Az ADC nagy zabáló, az mindenképpen legyen lekapcsolva! Illetve minden láb legyen megfelelően bekötve és beállítva úgy, hogy statikus legyen a működés! Az ATMEGÁs mérésemnél először például elkövettem azt a hibát, hogy a VREF lábra nem kötöttem semmit és lebegni hagytam: többszörös lett a mért áram, mint az adatlapi! Ezzel azt akarom mondani, hogy akármilyen csipet is használsz, az adatlap szerint kell huzalozni ahhoz, hogy elérd a specifikáció szerinti fogyasztást.

A sonajkniz által javasolt csip adatlapjából: "Extreme Low-Power Management PIC18LF1XK22 with XLP Technology
• Sleep mode: 34 nA
• Watchdog Timer: 460 nA
• Timer1 Oscillator: 650 nA @ 32 kHz"
Tehát eszerint a 684nA fogyasztást el lehet érni alvás közben, a példa is pont a kvarcórák tipikus 32kHz oszcillátorával számol. Ezt az értéket összehasonlíthatod azzal, hogy a külső RTC mit ígér, illetve ebből tudod becsülni, hogy mennyi időt fog bírni elemről.
A hozzászólás módosítva: Okt 4, 2023
(#) Bakman válasza asch hozzászólására (») Okt 4, 2023 / 1
 
Egy oldal szerint (Bővebben: Link) a DS3231 több, mint 8 évig elmegy egy CR2032-es elemről. Ha a kontroller egyik szabad lába adja neki a tápfeszültséget amikor kell a dátum/idő, akkor egy elemmel évekig elvan a rendszer, cserébe meg lehet spórólni a számolásokat (perc, óra, nap hónap, év, szököév stb. pörgetést) és az 1-2 másodpercenkénti ébresztést.

Ugyanarról az elemről mehet az RTC és a kontroller is.
(#) asch válasza Bakman hozzászólására (») Okt 4, 2023 / 1
 
DS3231 adatlap szerint (Hestore-on néztem meg) a "Timekeeping Battery Current" 0,84 uA, ami nagyságrendileg ugyanaz, mint amit a PIC ígér, sőt még kicsit több is. A low power PIC-ek és ATMEGÁk is úgy vannak megtervezve, hogy alkalmasak gombelemes működtetésű órának önmagukban.
(#) Bakman válasza asch hozzászólására (») Okt 4, 2023 / 1
 
Világos, csak a DS3231 önmagában is elvan. Nem kell ébresztgetni, a kontroller addig aludhat, amíg nem kell az idő.

De gyaníthatóan ez egy hosszabb projekt lesz a kérdezőnek, szerintem egy LED villogtatással kell majd indítani.
(#) don_peter hozzászólása Okt 17, 2023 /
 
Srácok, van egy kis logikai bukfencem, amelyen agyalok erősen, hogy miképpen érdemes és lehet jól megvalósítani.
Adott egy dsPIC33-as MCU, amelyen a hálózat 3 fázisát optón keresztül figyelem.
Change Notificationt használom. Felfutó és lefutó éleknél jön egy jel, majd az alapból felhúzott bemenetek a megszakítás hatására, vagy is az optó jelzésére nullára állnak. (függően attól melyik bement kap jelet a háromból) Szeretném detektálni, hogy melyik bemeneten jött megszakítás és, hogy az felfutó vagy lefutó élre történt.

Hogy tudom ezt szépen megoldani?
Megszakításban akarom közvetlen kezelni. Köszi előre is.
(#) Bakman válasza don_peter hozzászólására (») Okt 17, 2023 /
 
Ezt keresed: Bővebben: Link (Interrupt-on-Change)? Fel- és lefutó élnél is kapsz megszakítást (ha mindkét irányt engedélyezed), a port állapotát kell kiolvasni ahhoz hogy megtudd, fel- vagy lefutó él futott-e be.
(#) don_peter válasza Bakman hozzászólására (») Okt 17, 2023 /
 
Sajnos a választott PIC azon lábai amit használok, csak Change notification-t tudnak. Minden változásra jeleznek. Nincs külön flag register. A bebillenést követően vizsgálom a portot és az előző elmentett állapotot megnézem és a kettő közti változásból következtetek a megszakítást kiváltó eseményre. Nos ezen logika mentén gondolkodom és haladok.
(#) Lamprologus válasza don_peter hozzászólására (») Okt 17, 2023 /
 
Nem értem!
Minek kéne flag register? Minek kell az előző állapot?

Jön a megszakítás, megnézed hogy magas, vagy alacsony szint van-e. Ha magas felfotó él volt, ha alacsony lefutó!
A hozzászólás módosítva: Okt 17, 2023
(#) asch válasza Lamprologus hozzászólására (») Okt 17, 2023 / 1
 
Három fázist kezel, ezért kell az előző állapot, hogy ki tudja találni, hogy melyiken történt a változás.
Én úgy csinálnám, hogy az input port egyetlen bájtját tárolnám el a megszakításban (illetve az interrupt inicializálása előtt közvetlenük, hogy már az első interrupt is helyesen működjön). A kurrens és az előző port érték XOR-ja megmondja, hogy melyiken volt változás. A 3 bitre 3 if, hogy melyik van beállítva, melyik változott. Az if-en belül pedig a kurrens érték megadja, hogy fel, vagy le él történt-e. Ennyi tesztelgetés és elágazás még simán bele kell hogy férjen az interruptba.

Amire érdemes figyelni pin change interrupt használata esetén:

* ha prell-nek esélye van, akkor amikor megkaptuk az interruptot, akkor le kell tiltani arra a pin-re egy időre. Erre időzítőt lehet használni például. 50Hz-t akarunk mérni, úgyhogy mikrokontroller mércével jó hosszan is le lehet tiltani. Enélkül egyrészt az élkereső logika többször lenne triggerelve (ezt persze szűrhetnénk), de még nagyobb baj, hogy a CPU-t kiéheztetheti az IRQ folyamatos újrahívása.
* egy IRQ-ban egyszer olvassuk ki a bemenetet, és ezt a tárolt értéket tároljuk el előzőnek az IRQ végén! Ha kétszer olvassuk ki, akkor ha a két kiolvasás között történik átmenet, akkor eltévedhet a program. Ha csak egyszer olvasod ki valahol az IRQ elején, akkor ha belegondolsz, akkor nem tud hibázni a program (amennyiben a jel nem gyorsabb, mint az IRQ végrehajtás ideje).

Ha mérni akarod, hogy mikor történt a változás, akkor az óra leolvasása legyen a legelső művelet az IRQ-ban, így lesz a legpontosabb a leolvasás. Input capture-rel lehet ennél is pontosabb a mérés.
Ki lehet számolni a végrehajtási időkből és az IRQ-ba lépés idejéből, hogy mennyi lesz a reakcióidő és a hiba, azt tippelném, hogy a legtöbb alkalmazáshoz kellően pontos lesz.
(#) don_peter válasza Lamprologus hozzászólására (») Okt 18, 2023 /
 
Azért nem érted mert nem olvastad el a bejegyzéseimet. 3 fázist egyszerre, de külön bemeneten kell nézni. 3 megszakítás érkezik és ki kell deríteni melyik fázis okozta és, hogy fel vagy lefutóra..

ok közben olvasom, hogy asch megválaszolta..
A hozzászólás módosítva: Okt 18, 2023
(#) don_peter válasza asch hozzászólására (») Okt 18, 2023 /
 
Köszi, pont így csinálom én is. Az időt egyelőre nem mérem, de a többi stimmel.
(#) don_peter válasza asch hozzászólására (») Okt 18, 2023 /
 
Idézet:
„A 3 bitre 3 if, hogy melyik van beállítva, melyik változott”

Ezt a logikát te hogy oldanád meg? Köszi előre is.
(#) Bakman válasza don_peter hozzászólására (») Okt 18, 2023 /
 
Rajzolj idővonalat a három fázis időbeni futásával, ahhoz párosítsd az optocsatolók kimenetén lévő jeleket és látni fogod a mintát. Nem írtad, melyik pillanatban kapcsolnak az optók, van-e átfedés két optó aktív kimenete közt, illetve a szinuszhullám mindkét félperiódusára kapcsolnak-e vagy csak az egyikre.
(#) don_peter válasza don_peter hozzászólására (») Okt 18, 2023 /
 
Közben úgy oldottam meg, hogy egy feltétellel vizsgálom, hogy van e változás illetve hogy melyiknél aztán, azt egy belső if-el, hogy le, vagy felfutó.
Csak most meg más hiba van, aztán azt keresem.
(#) asch válasza don_peter hozzászólására (») Okt 18, 2023 / 1
 
Pszeudó kóddal így csinálnám: (Csak turista vagyok a PIC fórumon, mert más vezérlőket programozok, de ez mindegyiken ugyanígy működik. A bemeneti port nevét AVR-ből kölcsönöztem, le kell cserélni arra ahogy a PIC-en hívják.)
  1. // Azon PIN-ek bitjei, amikre a megfelelő bement van kötve. A konkrét áramkörhöz kell igazítani. A kód azt feltételezi, hogy mind a három fázist ugyanazon porton érjük el.
  2. #define MASK_PHASE1 1
  3. #define MASK_PHASE2 2
  4. #define MASK_PHASE3 4
  5. // A port előző beolvasott állapota
  6. static uint8_t prevPina;
  7. setup()
  8. {
  9.   // Kezdeti állapot beolvasása, így egyetlen fals átmenetet sem fogunk érzékelni az IRQ-ban
  10.   prevPina=PINA;
  11.   pinChangeInterruptBeállítása();  
  12. }
  13.  
  14. void pinChangeIRQHandler()
  15. {
  16.   uint32_t idobelyeg=readTimestampFromIRQ(); // Ha szükséges az időbélyeg kiolvasása, akkor azzal érdemes kezdeni
  17.   clearPinChangeIRQFlag(); // Az IRQ flag törlése, ha az adott processzor megkívánja - fontos, hogy a port kurrens értékének kiolvasása előtt történjen, így semmiképpen sem veszíthetünk el változás eseményt
  18.   uint8_t pina=PINA;  // Port mintavételezése egyszer történjen elkerülendő hogy két kiovasás között változzon
  19.   if(((pina^prevPina)&MASK_PHASE1)!=0)
  20.   {
  21.     // 1. fázis változott
  22.     if((pina&MASK_PHASE1) !=0)
  23.     {
  24.       // Felfelé él
  25.     }else
  26.     {
  27.       // Lefelé él
  28.     }
  29.   }
  30.   if(((pina^prevPina)&MASK_PHASE2)!=0)
  31.   {
  32.     // 2. fázis változott
  33.     if((pina&MASK_PHASE2) !=0)
  34.     {
  35.       // Felfelé él
  36.     }else
  37.     {
  38.       // Lefelé él
  39.     }
  40.   }
  41.   if(((pina^prevPina)&MASK_PHASE3)!=0)
  42.   {
  43.     // 3. fázis változott
  44.     if((pina&MASK_PHASE3) !=0)
  45.     {
  46.       // Felfelé él
  47.     }else
  48.     {
  49.       // Lefelé él
  50.     }
  51.   }
  52.   prevPina=pina;
  53. }
(#) KoblogPerGyok válasza don_peter hozzászólására (») Okt 18, 2023 /
 
Nekem is dsPIC33FJ-m van, nekem van felfutó és lefutó éldetektálás. No mindegy is, de amit eddig értek:

A dsPIC-nek 1 db int0 external interrupt pinje van, hajól emlékszem. Azon jön be a change esemény, de 3 input lábad van pl. a portB-n. Mondjuk az alsó 3 biten.

Jól gondolom?
(#) don_peter válasza KoblogPerGyok hozzászólására (») Okt 18, 2023 /
 
RB15 = 1. fázis
RB14 = 2. fázis
RB13 = 3. fázis

Erre élesítettem be CN-t. Mindenre jelez és majd kikövetkeztetem, hogy az felfutó vagy lefutó.
(#) sonajkniz válasza don_peter hozzászólására (») Okt 18, 2023 / 2
 
Szia!

Én két enkóder 4 jelének értékelésére írtam egy rutint tavaly.
Szerintem te pont ilyesmit szeretnél, úgyhogy átírtam a 3 fázisra.
  1. ;---------------------------------------------------------------------------
  2.     MOVF    PORTA,W             ;Változás jelzésére beolvasom a bemenetekhez
  3.     MOVWF   BEMENETEK           ;tartozó portot.
  4.     MOVLW   B'00001110'         ;Maszkolással eltávolítom a nem kellő biteket
  5.     ANDWF   BEMENETEK,F         ;(Csak szépség miatt. Igazából nincs rá szükség)
  6.     MOVF    BEMENETEK_TAROLT,W  ;Ezután összevetem a tárolt verzióval, mi vál-
  7.     XORWF   BEMENETEK,W         ;tozott. Ezt letárolom, majd letárolom az
  8.     MOVWF   MI_VALTOZOTT        ;aktuális állapotot.
  9.     MOVF    BEMENETEK,W
  10.     MOVWF   BEMENETEK_TAROLT
  11.     ;---------------------------------------------------------------------------
  12.     BTFSC   MI_VALTOZOTT,1      ;Megnézem, hogy, R vagy S fázis változott-e.
  13.     GOTO    R_VALTOZOTT         ;Ha egyik sem, értelemszerűen a T. Ezért ezt
  14.     BTFSC   MI_VALTOZOTT,2      ;már nem is vizsgálom.
  15.     GOTO    S_VALTOZOTT
  16.     ;---------------------------------------------------------------------------
  17. T_VALTOZOTT
  18.     BTFSS   BEMENETEK,3         ;Itt pedig már csak azt nézem, hogy fel, vagy
  19.     GOTO    T_LEFUTO            ;lefutó él volt-e.
  20.     GOTO    T_FELFUTO
  21. S_VALTOZOTT
  22.     BTFSS   BEMENETEK,2
  23.     GOTO    S_LEFUTO
  24.     GOTO    S_FELFUTO
  25. R_VALTOZOTT
  26.     BTFSS   BEMENETEK,1
  27.     GOTO    R_LEFUTO
  28.     GOTO    R_FELFUTO
Következő: »»   1194 / 1206
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