Fórum témák
» Több friss téma |
Koszonom a felvilagositast. Akkor valoszinuleg a beepitett FETek ennyit birnak.
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?
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..?
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...
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.
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.
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?
Dehogynem írja. Görgetni kell egy kicsit az oldalt, akkor látszik.
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.
É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.
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...)
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.
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.
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?
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?
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.
Í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
és itt a kód a másik portra
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
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.
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.
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).
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
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.
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
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.
Idézet: 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. „az adcon1 nem lett beállítva, bár ennek ellenére a latb-s léptetéssel működik” 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. Idézet: 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. „Mikor engedélyezzem?” 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
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
|
Bejelentkezés
Hirdetés |