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   328 / 1210
(#) bbalazs_ válasza potyo hozzászólására (») Nov 14, 2012 /
 
Koszonom a felvilagositast. Akkor valoszinuleg a beepitett FETek ennyit birnak.
(#) Tamas90 válasza potyo hozzászólására (») Nov 14, 2012 /
 
Szia!

És ha úgy konfigurálom a PIC lábait, hogy bemenetek legyenek, akkor azok nagy bemeneti ellenállással rendelkeznek? Vagy ha mondjuk a szóban forgó IC-k (MAX232, 74HC14) kimenete átvált 5V-ra, akkor az tönkre tudja tenni a PIC bemenetét? Ilyen esetben minden képpen kell a bemenetnél is áramkorlátozó ellenállás? Hogy hogy mindenki annélkül használja?
(#) djadji hozzászólása Nov 15, 2012 /
 
Hello!
Van esetleg olyan táblázat, ami alapján lehet PICet keresni a benne levő tulajdonságok, képességek alapján?
Arra gondolok, hogy nekem pl szükségem van egy ADC-re, két komparátorra és 2 PWM kimenetre, valamint 8 kimenet lábra. Ezeket alapján milyen PICek jöhetnek szóba.
Van ilyen táblázat valahol? (a felsorolás csak példa, nem ilyen PIC kell)
Vagy ezt csak úgy lehet, hogy elkezdem böngészni az adatlapokat és vagy találok, vagy nem..?
(#) vilmosd válasza djadji hozzászólására (») Nov 15, 2012 /
 
(#) bbb hozzászólása Nov 15, 2012 /
 
Sziasztok!

Előre bocsátom, hogy még csak barátkozok a PIC témával, de rögtön egy klassz falba sikerült ütköznöm. A problémám a következő. PIC12F629-es mikrovezérlőnél szeretném a belső oszcit használni, amit lehetőleg kalibrálnék is. Ehhez a 0x03FF címen lévő utasítást meg kellene hívnom. Azonban pont ez az utasítás valahogy kitörlődött. (MPLAB 8.88-at használtam programozáshoz PICKit2-vel.) Ennek örömére nekiláttam keresgélni megoldásokat és megtaláltam, hogy a PICKit2 programban van automata kalibrálásra lehetőség. Le is fut szépen a dolog, közli minden szuper, azonban amikor megnézem, akkor a várt 34xx helyett 3FFF (törölt) érték szerepel a programmemória 0x03FF (1023-as) címén.
Megpróbáltam kézzel átírni a programban, hogy direkt adok neki mondjuk egy 3440-es értéket (ami lehet, hogy nem lesz pontos, de legalább ott lesz a most hiányzó retlw utasítás), de amikor rányomok a programozás módra, akkor ez az érték nem íródik be. Bármelyik másik ponton (tulajdonképen csak az előtte lévő területen, meg véletlenszerűen pár helyen) próbálom, akkor rendesen bekerül a beírt érték, de ezen az egy címen visszaugrik a törölt pontra (azaz a 3FFF értékre).

Valaki találkozott már ilyennel? Mit lehet ezzel kezdeni? Ilyenkor vége az adott darabnak? Külső oszcival persze megy rendesen, meg ha nem hívom le a kalibrációs rutint, akkor is fut a programom belső oszcival, de nem ez a megoldás...
(#) icserny válasza bbb hozzászólására (») Nov 15, 2012 / 1
 
A kalibrációs adatot bárhol tárolhatod (papíron is, EEPROM-ban is). A lényeg úgyis az, hogy a programod mit ír be az OSCCAL regiszterbe. Ehhez nem muszáj a 0x03FF címre ugrálni.
(#) bbb válasza icserny hozzászólására (») Nov 15, 2012 /
 
Igen, tudom, hogy bármit berakhatok oda, de! Amíg ide nem normális érték kerül, addig a PICKit2 program folyamatosan ugat az OSCCAL helyén lévő 3FFF miatt (ettől még többnyire beégeti a programot). De néha közli, hogy az OSCCAL rossz, és programozás sikertelen. Ilyenkor kap egy törlést és helyreugrik. Viszont annak ellenére, hogy kihagyhatom magát a kalibrációt is, jó lenne tudni, hogy vajon miért van, hogy a gyári helyen nem tudom megváltoztatni az értéket.
(#) djadji válasza vilmosd hozzászólására (») Nov 15, 2012 /
 
Köszönöm ez egy jó link.
Ebben pont nem írja a PWM-et. Nekem olyan PIC kellene, ami 2 PWM csatornával rendelkezik, és egy analóg bemenettel. (egy motor és egy fűtőszál szabályozás lenne, az analóg pedig egy hőérzékelő jel értelmezéséhez kellene). Esetleg (ez már csak opcionális) két analóg kimenet 2 ledBar szabályozásához.
Tudtok ilyen PICet mondani? NYílván olyan kellene ami olcsó. Vagy jobban járok két 555-s PWM kapcsolással?
(#) nedudgi válasza djadji hozzászólására (») Nov 15, 2012 /
 
Dehogynem írja. Görgetni kell egy kicsit az oldalt, akkor látszik.
(#) gaben82 hozzászólása Nov 15, 2012 /
 
Sziasztok.

Szeretnék egy kis segítséget kérni 16F628A mikrokontroller programozás terén. Sajnos nem vagyok járatos az elektronikában, de utánépítettem gabilow kapcsolását (LINK) ami egy led matrixos kijelző. A programját szeretném módosítani ami BASIC-ben íródott, mégpedig olyan módon, hogy egy nyomógomb segítségével mondjuk egy másik szöveget írjon ki a kijelzőre.
De igazából nekem már az is nagy segítség lenne, ha megérteném hogy hogyan lehetne gombok segítségével feltételeket adni.

Olvasgattam egy két helyen de nem sok sikerrel jártam. Azt például már el tudtam érni, hogy ha az RA0-as portra kötöttem egy kapcsolót egy felhúzó ellenállással és létrehoztam a programban rá egy feltétel akkor valamilyen szinten reagált rá, de csak úgy hogyha folyamatosan nyomtam a gombot. Gondolom ez egy analóg port, és nem is biztos hogy ezt kell használni.
Szóval ebben kérnék egy kis segítséget, hogy mégis merre induljak el.
Mellékelem a programot is.
Köszönöm.

Matrix.bas
    
(#) djadji válasza gaben82 hozzászólására (») Nov 16, 2012 /
 
Én is 628A-val próbálkozom. Lehet hogy ez szentségtörés sokak szemében, de én flowcode-dal intézem a dolgokat, és ha kell C-ben belepiszkálok. Nekem bejött. Próbáld ki, ha kell segítek (azt a keveset amit tudok)n basicet nem hasznaltam PIC-hez, flowcode-ban meg lehet oldani.
Ha gombot Rb0-ra rakod, ott megszakításként is tudod kezelni.
(#) djadji válasza nedudgi hozzászólására (») Nov 16, 2012 /
 
Megtaláltam köszönöm!
Ez most lehet fura lesz, de mi kell legyen egy PICben, hogy az analóg jelet fogjon? Pl bemenö feszültség alapján végezzen müveleteket? Pl ahány volt kerül a lábára, annak háromszorosa számút villogtasson egy ledet. Vagyis, hogy tudja mérni a bemenet feszültségét? (Azt hiszem az AVR tud ilyet...)
(#) nedudgi válasza djadji hozzászólására (») Nov 16, 2012 /
 
Analóg jelek mérésére kell az ADC(=Analog-to-Digital Converter) A mért értékkel aztán azt csinálsz a programban, amit akarsz.
(#) vilmosd válasza djadji hozzászólására (») Nov 16, 2012 /
 
A PIC tipusok tobbsege rendelkezik Analog Digital atalakitoval. A tobbseg 10 bites, de van 8 es 12 bites is. Altalaban 1 AD es egy multiplexer van beepitve, aminelk a segitsegevel tobb csatornat is lehet merni. A lenyege az AD atalakitonak, hogy a referenciafeszultseget elosztja a felbontassal, pl 10 bitesnel 1024 reszre, majd a bemenofeszultseget elosztja ezsel az egyseggel. A vegeredmeby AD= Ube/(Uref(1024)). Szamszeruen pl ha a Uref=5.12 V, a d osztas 5 mV. Tehat ha pl Ube=2.75 V eseten az AD erteke 550 lesz. Azutam ezt az erteket ugy dolgozod fel ahogy akarod. Peldaul ledsort vezerelsz, kijelzore kuldod, szamitasokat vegzel velea, i tak dalse.
(#) djadji válasza vilmosd hozzászólására (») Nov 16, 2012 /
 
Köszönöm mindenkinek, rájöttem én is hogy előbb járt a szám mint az eszem.
Most azon gondolkodom, hogy ezt meg lehet oldani komparátorral és belső referencia feszültséggel is.
Mégpedig: egy ciklusban a bejövő analóg jelet összehasonlítom a V-ref feszültséggel, amit folyamatosan növelek. Amikor a komparátor azt mondja, hogy a belső a nagyobb, mint a bejövő, akkor meg is van a bejövő feszültsége
Ha jól gondolom azok a PICek amik ilyet tudna, azok is ezt csinálják.
Jól gondolom? Csinált már valaki ilyesmit?
(#) vidra8 válasza djadji hozzászólására (») Nov 16, 2012 /
 
Mi az a flowcode? Nem tudom, de jobb szeretném ezt a programon belül intézni. Jobb lenne ha C-ben írodott volna a progi, de ha már BASIC-ben van akkor abban szeretném megoldani. De mégis melyik portját használjam erre a célra?
(#) vilmosd válasza djadji hozzászólására (») Nov 16, 2012 /
 
Ez a komparatoros AD jatek is megoldhato, de sokkal nyugosebb mint a beepitett AD. Az AD hasznalatahoz csak be kell rugni az AD-t (init), megmondani melyik csatornat kerjuk, majd GO. A vegen a ADRESH, ADRESL regiszterekben ott a vegeredmeny 10 bites bontasban. Nem kell a vezerlo hurkokkal vergodni, mert mar a HW tartalmazza ezeket a dolgokat. Persze mazochistaknak hasznalhato ez a megoldas is, csak nem tudsz 10 bites felbontast csinalni. A masik oldala, hogy a mai PIC-ek altalaban tartalmaznak tobb AD csatornat, es olcsobbak egy 16F628-nal.
(#) glaci hozzászólása Nov 16, 2012 /
 
Írtam egy próbaprogramot egy pic18f4520-ra. Futófény a C porton. Ha ugyanezt a programot a B porton akarom futtatni, a B porton nem fut.
Itt a kód az egyik portra
  1. program kazan1;
  2. //---------------------------- Változók deklarálása ----------------------
  3.  
  4. Var Loop : Byte;
  5.  
  6. //---------------------------- Pic_Init --------------------------------------
  7. Procedure Pic_Init;
  8. Begin
  9.   TrisC:=0;
  10.   LatC:=0;
  11.   Loop:=0;
  12. End;
  13. //---------------------------- LED villogtatás -------------------------------
  14.  
  15. Procedure Led_Blink;
  16. Begin
  17.    LatC:=$03;
  18.    For Loop:=0 to 5 do
  19.       Begin
  20.          Delay_ms(100);
  21.          Asm
  22.             rlncf PortC,F;
  23.          End;
  24.       End;
  25.    For Loop:=0 to 5 do
  26.       Begin
  27.          Delay_ms(100);
  28.          Asm
  29.             rrncf PortC,F;
  30.          End;
  31.       End;
  32. End;
  33.  
  34. //---------------------------- Főprogram --------------------------------------
  35.  
  36. Begin
  37.   { Main program }
  38.      Pic_init;
  39.    While True Do
  40.    Begin
  41.      Led_Blink;
  42.    End;
  43. End.


és itt a kód a másik portra
  1. program kazan1;
  2. //---------------------------- Változók deklarálása ----------------------
  3.  
  4. Var Loop : Byte;
  5.  
  6. //---------------------------- Pic_Init --------------------------------------
  7. Procedure Pic_Init;
  8. Begin
  9.   TrisB:=0;
  10.   LatB:=0;
  11.   Loop:=0;
  12. End;
  13. //---------------------------- LED villogtatás -------------------------------
  14.  
  15. Procedure Led_Blink;
  16. Begin
  17.    LatB:=$03;
  18.    For Loop:=0 to 5 do
  19.       Begin
  20.          Delay_ms(100);
  21.          Asm
  22.             rlncf PortB,F;
  23.          End;
  24.       End;
  25.    For Loop:=0 to 5 do
  26.       Begin
  27.          Delay_ms(100);
  28.          Asm
  29.             rrncf PortB,F;
  30.          End;
  31.       End;
  32. End;
  33.  
  34. //---------------------------- Főprogram --------------------------------------
  35.  
  36. Begin
  37.   { Main program }
  38.      Pic_init;
  39.    While True Do
  40.    Begin
  41.      Led_Blink;
  42.    End;
  43. End.


itt a portb két utolsó bitje felvillan majd lefut a led_blink időzítése, újra fel villan és így tovább,
de a többi helyekre nem jut el parancs.
Segítsetek!
A hozzászólás módosítva: Nov 16, 2012
(#) djadji válasza vidra8 hozzászólására (») Nov 16, 2012 /
 
Keress rá, de itt is van róla fórum. Úgy programozol, mintha folyamatábrát készítenél, amit a gép fordít le Cre, aztán HEXbe..
Mindegy melyik portját használod (majdnem) de a B0 portot javaslom. HA bekapcsolod a megszakítást hozzá, akkor bármikor megnyomod, lefut az, amit odaírsz.
Sajna Basicba én pöcifocit programoztam +4re utoljára, szóval abban nem tudok segíteni,.
Javaslom tedd fel a Flowcode-ot, és 10 perc múlva az villog, amit csak akarsz.
(#) glaci hozzászólása Nov 16, 2012 /
 
Megoldódott!
A led_blink procedurában, a rlncf PortB,F; helyére rlncf LatB,F; kell írni és a rrncf PortB,F; helyére rrncf LatB,F; kell írni. Azt nem értem, hogy C portnál a portC működik és a B portnál a portB nem működik.
Ha valaki megtudná magyarázni az jó lenne.
(#) icserny válasza glaci hozzászólására (») Nov 16, 2012 /
 
Valószínűleg nem állítottad a B port bitjeit digitális módba (ásd: adatlap, I/O portok, 10.2 example). Egyébkényt az ilyen műveleteknél valóban a LATB regisztert célszerű használni, az RMW probléma miatt (read-modifíy-write típusú műveleteknél a PORT regiszterek olvasása megtréfálhatja az embert).
(#) promax hozzászólása Nov 16, 2012 /
 
Szoftveres FIFO -t szeretnék csinálni USART portra.
Magát a programot meg tudom írni, de az elvet, ahogy a megszakításokat kell vezérelni nem értem, pedig rengetegszer került már bele a fórumtémába.
Tehát van két FIFO. Egyik a TX hez, másik az RX hez.
Vétel megszakításosan lekezelve. Megszakítás rutinban az esetleges hibásan vett karaktert lekezeljük, és ha rendben beírjuk a FIFO ba, léptetjük a karakter számálót, és visszatérünk. (tehát a vevő megszakítás rutin tölti az RX FIFO -t) Ha eddig jól értettem a fentiek szerint folyik a tárolás vett jel tárolása.
Az adást a FIFO -ból nem értem. Amit eddig kihámoztam a leírásokból, hogy adáskor a főprogram írja az adandó adatokat a TX FIFO ba. Beíráskor engedélyezni kell az adási
megszakítást. Ekkor még nem történik semmi, mert adás csak a TXREG töltését követi (mikor töltjük bele?). Erre reagál(na) az TXIF bit High szinttel, mikor a TSR regiszterbe lépett az adat, és a TXREG ismét üressé válik és jelzi tölthető.
A fentiek alapján nagyon nem értem a FIFO működését.
Valaki elmondaná hogy mikor - hol kell a megszakításokat engedni/leállítani, hol kell a FIFO -t tölteni (megszakításban vagy a főprogramban)?



A hozzászólás módosítva: Nov 16, 2012
(#) vidra8 válasza djadji hozzászólására (») Nov 16, 2012 /
 
Köszi kipróbálom majd.
(#) Hp41C válasza promax hozzászólására (») Nov 16, 2012 /
 
Szia!
Idézet:
„Ekkor még nem történik semmi, mert adás csak a TXREG töltését követi (mikor töltjük bele?)”

Mivel már jó ideje nem volt adás, az adó elkészült (TXIF = 1), azonnal megszakítás történik az engedélyezés után ha a globális engedélyezések (GIEL / GIEH ill. GIE és PEIE) lehetővé teszik.
Idézet:
„Erre reagál(na) az TXIF bit High szinttel, mikor a TSR regiszterbe lépett az adat, és a TXREG ismét üressé válik és jelzi tölthető.”

Fordítva: A TXREG írására reagál (némi késleltetéssel) a kontroller és a TXIF -et 0 -ra állítja. Ha az adás elkészül, akkor a TXIF megint 1 -re áll.
Idézet:
„Valaki elmondaná hogy mikor - hol kell a megszakításokat engedni/leállítani, hol kell a FIFO -t tölteni (megszakításban vagy a főprogramban)?”

Az uart beállításánál előbb a sebességet aztán az adás és vétel módját kell beállítani, végül engedélyezni kell a vételt. Ezután engedélyezni kell a vételi megszakítást, az adásit pedig tiltani kell. Ha van "adni való", be kell írni az adási fifo -ba és engedélyezni kell az adási megszakítást. Az adási megszakítás kiveszi a következő adatot, beírja a TXREG -be (ezzel egyben törli is a TXIF -et), ha nincs több "adni való", letiltja az adási megszakítást.
(#) glaci válasza icserny hozzászólására (») Nov 16, 2012 /
 
Igen ez valóban elmaradt, az adcon1 nem lett beállítva, bár ennek ellenére a latb-s léptetéssel működik.
Köszi a választ
(#) Hp41C válasza glaci hozzászólására (») Nov 16, 2012 /
 
Működik, mert a digitális kimeneti meghajtók vezérlik az analóg módba állított lábakat, de az analóg lábakról (PORTx) 0 -t olvas be a kontroller. A LATx írása egyben vezérli a kimeneti meghajtókat, olvasása a legutoljára beleírt vezérlést adja vissza.
(#) icserny válasza glaci hozzászólására (») Nov 16, 2012 /
 
Idézet:
„az adcon1 nem lett beállítva, bár ennek ellenére a latb-s léptetéssel működik”
Az ADCON1 beállításának elmulasztása a PORTB olvasását zavarja meg. A LATB írását/olvasását ez nyilvánvalóan nem befolyásolja.
(#) promax válasza Hp41C hozzászólására (») Nov 16, 2012 /
 
Idézet:
„Fordítva: A TXREG írására reagál (némi késleltetéssel) a kontroller és a TXIF -et 0 -ra állítja. Ha az adás elkészül, akkor a TXIF megint 1 -re áll.

A mondat első fele igaz csak szerintem, mert akkor változik '1' re TXIF, ha TXREG ből átíródik a hardveres FIFO TSR regiszterébe. És ez az a pont, ahol TRMT (TSR full) jelzőbit nulla lesz és az marad nulla addig, míg az adás véget nem ér. Ráadásul a doksi szerint a Stop bit -et nem várja meg.
De nem ez a kérdésem lényege.
Nyilván a sebesség és az alapbeállítások megtörténnek.
Ha van adni való a főprogram beírja az adási FIFO ba az adatokat, majd ott gyűlik valamilyen egymás után következő munkaregiszterekben.
Azt írod:
Idézet:
„és engedélyezni kell az adási megszakítást”
.
Mikor engedélyezzem? Már az első adat után, vagy előtte. Majdnem mindegy egyenlőre úgysem történik semmi.
Idézet:
„Az adási megszakítás kiveszi a következő adatot”

Na ez hogyan történik? Mitől lesz nekem adási megszakításom? Az éppen attól lenne, ha beírnám a TXREG be. De nem ezt mondod, hanem a megszakítás vesz ki....
Szóval ezt a részt nem értem.


(#) icserny válasza promax hozzászólására (») Nov 16, 2012 /
 
Idézet:
„Mikor engedélyezzem?”
A karakterkiíró függvénynek (usart_putc(), vagy ilyesmi) kell gondoskodnia róla, hogy az adás elinduljon, amikor újabb karaktert pakol a bufferbe. Jobb helyeken ehhez csak engedélyeznii kell a TX megszakítást.

A megszakításban pedig meg kell nézni, hogy nem üres-e a TX buffer. Ha nem üres, akkor a soron következő karakter mehet a TXREG-be, ha pedig üres, akkor le kell tiltani a TX megszakítást.

A PICula projektemben van ilyen ring bufferes UART RX/TX kidolgozva (a letölthető szoftver segédletben a common/picula_uart.c állományban).

U. i.: a használat módja ezen az oldalon van leírva.

A TX/RX megszakytás egy kicist faramuci módon van megírva. Ez a flexibilis felhasználás ára: ugyanis a bufferelt I/O pollingos módban is használható, csak az USARTDeviceTasks() függvényt kell rendszeresen hívogatni ...
A hozzászólás módosítva: Nov 16, 2012
(#) promax válasza icserny hozzászólására (») Nov 16, 2012 /
 
Igen, tudok róla, hogy létezik a ring bufferes UART RX/TX megoldás a PICula projectben, de sajnos annyira nem tudok C ül, hogy abból megértsem.
Még mindig nem értem, pedig lassan illő lenne:
Idézet:
„amikor újabb karaktert pakol a bufferbe. Jobb helyeken ehhez csak engedélyeznii kell a TX megszakítást”

A pufferben gyűlhet az adat egészen a mértéig, de hiába engedélyezek TX megszakítást attól még nem történik semmi. Ahhoz hogy legyen írnom kell a TXREG et.
Ha írom, például a FIFO utolsó tagjával (amit elsőnek tettem bele) kimegy az adat a soros vonalon, megszakítás is lesz. Hogy mikor az fent kis vitát generált, de lényegében mikor újraírhatóvá válik a TXREG.
A megszakítás rutinban mi legyen? Vegye tovább a FIFO következő tagját, ha van, és küldje?
Idézet:
„A megszakításban pedig meg kell nézni, hogy nem üres-e a TX buffer. Ha nem üres, akkor a soron következő karakter mehet a TXREG-be, ha pedig üres, akkor le kell tiltani a TX megszakítást.

A fentiek szerint jól gondolom ezt a részletet: a megszakítás rutinba mindig töltök fel TXREG et, és kiküldök.
Így kiürül a TX FIFO, nyilván ezidő alatt nem is töltödik.
De a vételi FIFO sem, mert annak az INT je kizárva van ezidő alatt. ha jól gondolom.
Tehát input oldalon be nem vételezett karakterre is lehet számítani.
Egy kicsit közelebbről megvilágítanátok mindezt?
A hozzászólás módosítva: Nov 16, 2012
Következő: »»   328 / 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