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   838 / 1210
(#) Kapagerenda válasza sonajkniz hozzászólására (») Aug 18, 2016 /
 
Kösz a segítséget. Hogy érted, hogy nyissam ki maximálisan a tranzisztorokat? Miért jobb ez esetben a PNP?
(#) sonajkniz válasza Kapagerenda hozzászólására (») Aug 18, 2016 / 1
 
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.
(#) Elektro.on válasza Kapagerenda hozzászólására (») Aug 18, 2016 / 1
 
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.
(#) ativagyok hozzászólása Aug 18, 2016 /
 
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.”
(#) Hp41C válasza ativagyok hozzászólására (») Aug 18, 2016 / 1
 
VREFCON0, VREFCON1, VREFCON2 regisztereket is be kell állítani. Nem az ACCESS bank -ban vannak...
(#) eSDi válasza ativagyok hozzászólására (») Aug 18, 2016 / 1
 
Ü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.
(#) Poostmaster hozzászólása Aug 18, 2016 /
 
Ö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:
  1. // CONFIG
  2. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
  3. #pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
  4. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  5. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  6. #pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
  7. #pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  8. #pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  9. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11.  
  12. #define _XTAL_FREQ 20000000
  13.  
  14.  
  15. void s_delay(unsigned int iPiheno);
  16.  
  17. void main() {
  18.     TRISD = 0;
  19.     PORTD = 0;
  20.     PORTD = 0b00000001;
  21.     s_delay(300);
  22.     PORTD = 0b00000010;
  23.     s_delay(300);
  24.     PORTD = 0b00000100;
  25.     s_delay(300);
  26.     PORTD = 0b00001000;
  27.     s_delay(300);
  28. }
  29. void s_delay(unsigned int iPiheno){
  30.             for (unsigned int y = 0; y < iPiheno; y++){
  31.         __delay_ms(1);
  32.         };
  33.     };


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?
(#) Hp41C válasza Poostmaster hozzászólására (») Aug 18, 2016 /
 
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)”
(#) pajti2 válasza ativagyok hozzászólására (») Aug 18, 2016 / 1
 
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
(#) almaf1231 válasza Pali79 hozzászólására (») Aug 19, 2016 /
 
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.
(#) Pali79 válasza almaf1231 hozzászólására (») Aug 19, 2016 /
 
Jobban belegondolva igazad van, mert két külön portról megy, de annyira ésszerűtlen az egész...
(#) Lamprologus hozzászólása Aug 19, 2016 /
 
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
(#) Poostmaster válasza Hp41C hozzászólására (») Aug 19, 2016 /
 
Köszönöm.
(#) Pali79 válasza Lamprologus hozzászólására (») Aug 19, 2016 /
 
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.
(#) zenetom válasza Lamprologus hozzászólására (») Aug 19, 2016 /
 
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.
(#) Lamprologus válasza Pali79 hozzászólására (») Aug 19, 2016 /
 
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 ...
(#) Bakman válasza Lamprologus hozzászólására (») Aug 19, 2016 /
 
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é.
(#) Lamprologus válasza zenetom hozzászólására (») Aug 19, 2016 /
 
Elvileg lehet késleltetést betenni a bejövő adatok közé ... bár még nem próbáltam...
(#) Lamprologus válasza Bakman hozzászólására (») Aug 19, 2016 /
 
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.
(#) Pali79 válasza Lamprologus hozzászólására (») Aug 19, 2016 /
 
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.
(#) Bakman válasza Lamprologus hozzászólására (») Aug 19, 2016 /
 
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.
(#) ativagyok hozzászólása Aug 19, 2016 /
 
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
(#) ktamas66 válasza ativagyok hozzászólására (») Aug 19, 2016 / 1
 
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.
(#) pajti2 válasza ativagyok hozzászólására (») Aug 19, 2016 / 1
 
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.
(#) ativagyok válasza ktamas66 hozzászólására (») Aug 19, 2016 /
 
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.
(#) Poostmaster válasza Hp41C hozzászólására (») Aug 19, 2016 /
 
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:
  1. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
  2. #pragma config WDTE = OFF        // Watchdog Timer Enable bit (WDT enabled)
  3. #pragma config PWRTE = ON      // 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)
(#) ativagyok válasza pajti2 hozzászólására (») Aug 19, 2016 /
 
Köszönöm, ez most nagyon hasznos volt
(#) Hp41C válasza Poostmaster hozzászólására (») Aug 19, 2016 /
 
Debug fordítási mód helyett válaszd a Release módot.
(#) kissi válasza Poostmaster hozzászólására (») Aug 19, 2016 /
 
[code=c]#pragma config LVP = ON[
helyett
#pragma config LVP = OFF/code]

HP41C kolléga tanácsára is figyelj !
(#) gabilow hozzászólása Aug 20, 2016 /
 
Ü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.
  1. kezd:
  2. High GPIO.2
  3. WaitUs 20
  4. Low GPIO.2
  5. WaitUs 20
  6. Goto kezd

köszi előre is.
Következő: »»   838 / 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