Fórum témák
» Több friss téma |
Kösz a segítséget. Hogy érted, hogy nyissam ki maximálisan a tranzisztorokat? Miért jobb ez esetben a PNP?
Ha egy npn tranzisztorral pozitívot kapcsolsz, sosem nyit ki maximálisan. Ha negatívot kapcsoltatsz vele, akkor 0,6V-os bázisfeszültségnél teljes nyitásba megy.
Ugyanez igaz a pnp tranzisztorokra, csak fordított előjellel. Azért kell teljes nyitásba vinni, hogy a ledenkénti ellenállások legyenek az áramkorlátok, ne a tranzisztor.
Az NPN ebben a formában emitter követőként működik, mint feszültség szabályozás esetében.
Tehát bázis feszültség minus 0,65V.
Az alábbi feladattal kapcsolatban próbáltam futás közben változtatni a PVCFG<1:0> regiszterek értékét, de sajnos a mérés eredményéből adódóan arra következtetek, hogy nem változik meg a referencia feszültség.
Próbáltam az FVREN regisztert is kapcsolgatni, szintén eredmény nélkül. Lehetséges, hogy nincs mód futás közben az ADC referencia feszültségét változtatni? Idézet: „Sziasztok! Adott egy PIC18F45k22 típusú PIC, amivel több feszültséget is mérek. Lehetséges az, hogy különböző feszültségek mérésekor már-más referenciafeszültséget állítok be az AD-nek? Ha lehetséges, nem jelent-e gondot az, hogy egy éppen nem mért feszültség nagyobb a referencia feszültségnél? Köszönöm előre is a válaszokat.”
VREFCON0, VREFCON1, VREFCON2 regisztereket is be kell állítani. Nem az ACCESS bank -ban vannak...
Üdv!
Szerintem csak akkor lehet, ha minden egyes alkalommal az egész ADC-t újra inicializálod. Nem szokás a referenciafeszültséget állítgatni, inkább a bemeneti feszültségoszókat kell variálni. Esetleg több ADC bemenetet kell alkalmazni, különböző osztókkal.
Összedobtam egy dugdosós panelon a teszt áramkörömet a ledsorhoz. Egyelőre csak 4 ledet használva, lábanként 1-et. A mellékelt ábra szerint van bekötve. A számok a port lábait jelentik.
Mivel a 629-es nehézkesen kezelhető a mérete miatt, úgy döntöttem, hogy egy 877A-ra csinálom meg a programot próba képpen. Ám a program írása közben észrevettem valamit, amit nem értek. Itt a program:
A gondom az, hogy az s_delay ennél az értékénél jól működik, szépen végig fut a fény a 4 leden. Ha növelem az értéket, akkor "nem marad ideje" a ledek gyújtogatására, és 500-nál már csak 2 led villan fel. Valamit nem állítottam be?
A watchdog be van kapcsolva és nincs clrwdt() utasítás a programban.
Idézet: „#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)”
Egyik tippem a 4066 analog switch, de okozhat egy kicsike hibát az átviteli ellenállása. Másik tippem egy külső DAC-ot hajtani a pic-ről, és annak a kimenetét küldeni vissza referencia feszültségnek. És még biztos van néhány trükk.
Amit a pic éppen nem lát, az a pic-nek nem tud gond lenni
Látod pont a tranzisztorok mennyiségével nincs gond a kolléga kapcsolásában, ugyanis ha megfigyeled külön 8 vezetéken vezérli a másik két digites kijelző szegmenseit. Az már más kérdés, hogy az ellenállások hiányoznak, illetve közel fele ennyi lábról is mehetne az egész.
Jobban belegondolva igazad van, mert két külön portról megy, de annyira ésszerűtlen az egész...
UART kommunikáción munkálkodom ... Milyen stratégiával érdemes nekiállni?
Egy Nextion kijelzőről érkező adatokat szeretnék feldolgozni. A lényege, hogy az első byte meghatározza, hogy milyen adat érkezik, utána változó hosszúságú (akár 0 is lehet) adat érkezik (string, 32 bit integer stb.), van amelyik fix hosszúságú, van amelyik változó. Az utolsó 3 karakter 0xFF. Hogyan tudom elkerülni, hogy az esetleg egymás után érkező adatcsomagok ne "keveredjenek" össze?Ha pl szám érkezik akkor abba is előfordulhat az egymás után 3db 0xFF. Vagy honnan tudom, hogy beérkezett-e a teljes csomag? pl: 0X70 0X61 0X62 0X63 0XFF 0XFF 0XFF 0x07= stringet küld 0X61 0X62 0X63= "abc" 0XFF 0XFF 0XFF=csomag vége 0X71 0X66 0X00 0X00 0X00 0XFF 0XFF 0XFF 0x71= számot küld 0X66 0X00 0X00 0X00=102 0XFF 0XFF 0XFF=csomag vége
Köszönöm.
Igazából két lehetőséged van. Vagy hasonló csomaglezáró kódot használsz vagy ha tudod, hogy hány "darabból" áll egy csomag, akkor számolod, hogy mennyi jött be.
Nem tudom hogy milyen időközzel jönnek az adatok, de pl. a 3db 0xFF után indítasz egy timert, és ha x időn belül nem jön következő bájt, akkor az volt az utolsó, vagyis a lezárás.
Persze ez csak akkor járható, ha két csomag között van némi időköz.
A bejövő csomag (csomaglezáró kód) adott, azon nem tudok változtatni.
A bejövő adatokat érdemes megszakításból kiolvasni, és azon belül kiértékelni, vagy inkább állítsak be hardveres puffert a bejövő adatoknak, és a főprogramból, ha van a beérkezett adat, csak annyit olvassak ki a pufferből amennyire épp szükségem van? Ha még maradt akkor akkor újabb kiolvasás ...
Miért nem programozod úgy a kijelzőt, hogy egységes legyen az adatküldés? Ha használod az ASCII kódtáblát, nagyon nem lőhetsz mellé.
Elvileg lehet késleltetést betenni a bejövő adatok közé ... bár még nem próbáltam...
Ezt az egységes adatküldést hogy gondolod?
Ha egy számmező tartalmát küldöm vissza akkor az fix 8 karakter lesz, ha egy szövegmezőt akkor az 5-től felfelé akárhány karakter lehet, ha egy rendszerüzenet jön akkor az 4 vagy több karakter.
Biztos, hogy nem érdemes az egész kiértékelés megszakításban csinálni, mert túl hosszú lesz. Inkább úgy csinálnám, hogy megszakításban fogadom az adatokat és memóriába tölteném, aztán a főprogramban értékelném.
A konkrét feladat hiányában nehéz erre válaszolni, de megoldható pl. úgy is, hogy minden adatot átkonvertálsz ASCII kódra és minden adatküldést pl. FF, FF, FF kóddal zársz.
Köszönöm a válaszokat az AD referenciafeszültségének változtatásával kapcsolatban, sikerült megoldani: Elég a PVCFG<1:0>biteket állítani mérés előtt.
Hp41C: Milyen jelentősége van annak, hogy nem ACCESS BANK-ban vannak? eSDi & pajti2: Tudom, hogy nem szokás menet közben állítgatni, de a hardver már adott, nem tudok rajta változtatni, de ahol lehetséges, ott szeretnék belső referencia feszültséget használni a méréshez. Üdv! Attila
Miért ne lehetne váltani. Arra kell még figyelni, hogy a referenciának is van beállási ideje. Ezt vagy figyeled a megfelelő biten (FVRST), vagy kivárod az átlagos időt (25us), esetleg ezt is belekalkulálgatod az akvizíciós időbe.
Ha a regisztered nem az Access Bank-ban van előtte be kell állítani a megfelelő bankot. Idézet: „Milyen jelentősége van annak, hogy nem ACCESS BANK-ban vannak?” Általánosságokban az access bank-okról. A 16 és 32 bites pic-eken a ram terület egészében közvetlenül elérhető, mert egyetlen címterületed van, amiben mindent látsz. A 8 bites pic-eken a ram belsőleg külön perifériaként van kidolgozva, amiből egyszerre mindig csak egy banknyit látsz (32..256 byte, típusfüggő), és amiben a ram terület még periféria regiszterekkel is osztozkodik a területen (típusfüggő). Ha több ramod van összesen, mint ami egyetlen bank területén elfér, akkor a bankot lapozgatnod kell a többi memória (vagy periféria regiszter) eléréséhez. Az aktuális lap címét egy regiszter tárolja. A lapozás annyiból áll, hogy átírod a lapcímet. A fordító programod nem fogja azt figyelni, hogy futás időben olyan bankot aktiváltál-e, amiben benne van az elérni kívánt ram változó, vagy periféria regiszter, amihez éppen hozzáférnél írás / olvasással. Amikor valami regiszter csak az egyik bankban érhető el egy fix címen, a fordító azt a címet be fogja helyettesíteni a memória műveletbe, de a bankot aktiválni nem fogja. Az minden esetben a te felelősséged. Amikor használsz egy regisztert, ami csak adott bankban érhető el, előtte azt a bankot neked aktiválnod kell, különben a művelet "mellémegy". (Némelyik C fordító talán csinál olyat, hogy automatán a bankot is aktiválja, azt nem tudom, olyan környezetben én csak asm-et használok.) A típusok némelyikén a bankoknak közös területeik is vannak. Például némelyik periféria regiszter ugyan azon a címen van mindegyik bankban. Teljesen mindegy, melyik bankot választottad éppen ki, az a regiszter abban a bankban is ugyan azon a címen elérhető lesz. De az típus függő is lehet, meg regisztere is válogatja. Mindig ellenőrizd az adatlapon, hogy amit te használnál, az biztosan elérhető-e. A fentiek csak általános szemléleti információk arra az esetre, ha gyengébben menne az angol, és kell egy pici alapozás jobban megérteni az adatlapot. Konkrétumként mindig csak az adott pic adatlapja használható. Mindig minden pic esetében olvasd el, milyen hardver környezetben is fog működni a programod. Ha elhagyod, a nyakadba vetted annak lehetőségét, hogy mindenféle misztikus hibákba fogsz belebotlani.
Köszönöm a válaszod, a beállási idő figyelését beleteszem még a programba.
Azt elfelejtettem írni, hogy C-ben írom a programot, ezért ha jól gondolom, most nem kell foglalkoznom a bankváltással.
Az mitől van, hogy a Pickit 2-ről meghajtva elindul a program, de ha külső tápot adok neki, és lehúzom a PKt, akkor semmit nem csinál?
Most így néz ki a konfig:
Köszönöm, ez most nagyon hasznos volt
Debug fordítási mód helyett válaszd a Release módot.
[code=c]#pragma config LVP = ON[
helyett #pragma config LVP = OFF/code] HP41C kolléga tanácsára is figyelj !
Üdv! Van egy 12f675 PIC , 4 MHz,a GPIO.2 lábon szeretnén 25kHz-et előállítani basicben(PICsim..), de az alábbi kóddal nem megy feljebb a freki, mint 21-22kHz. Ez miért lehet?
Másik, ha a programban 8 MHz-re állítom a frekit, az időzítések a duplájára nőnek, pl. WaitUs 20-ból lesz 40. Ezt hol kell állítani, hogy ne így legyen. A belső 4MHz-es oszcillátorról megy most.
köszi előre is. |
Bejelentkezés
Hirdetés |