Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Amit te kinéztél órajel lábat az adatlapból, az nem a programozó interfészé.
Egyébként elkészültem ezzel, amit javasoltál, minden működik, már csak be kéne precízre állítani az időzítést.
Watch nélkül viszont elég problémás
Siker!
Köszönöm Uraim! Tudom, lusta vagyok, de ha valakinek van egy perce, megnézné nekem a PIC 16F690 programozási kiosztását?
Na ezt már ne! Ennyi idő alatt már Te is megtaláltad volna. Légy egy kicsikét önálló.
Már túl vagyok rajta.
Fel is van égetve, és megy is a cucc. Azért köszi a szives nincsmit...
Másodikra sikerült.
A szokásos i/o dolgot rontottam, (elsőre) de aztán ment. Nem volt nehéz!
Persze, Microchip-nek vannak kulonbozo fokozatu konzultansi rangjaik. Ha jol tudom eleg sokmindent le kell tenni egy Gold szintuhoz az asztalra.
Pl ilyen cetliket kaphatsz: Bővebben: Link
Hello!
Lenne egy kérdésem. Miért van az, hogy amikor az alábbi mikroC-s kódot lefuttatom a portokra kötött LED-ek egyszerre nem világítanak. Betöltöttem Proteusba a kódot egy olyan kapcsolásba, ahol minden kimenetként használható lábra egy LED-et kötök (kivéve RX/TX és az RA3) és az egyik LED felvillann, majd a delay után egy másik, és kikapcsolja az előző LED-et. pl: elöször a RA2, majd a RA4 , de úgy hogy kikapcsolja a RA2-t, majd a RA5, és kikapcsolja az előzőt és így tovább. Viszont ha PORTA=0xFF;PORTB=0xFF; PORTC=0xFF; -vel csinálom akkor mindegyik világít, de a Proteusban nagyon sok szürke láb lesz. (ez gondolom a lebegő lehet). Elképzelhető hogy a szimulátor nem tudja kezelni ezeket? A mikrokontroller egy PIC16F690-es. Előre is köszi a segítséget!
Hali!
Bocsánat, ha már volt téma, de sajna nincs időm visszaolvasgatni, a keresés pedig rengeteg témát dobott ki. Szóval fordulatszám mérőt szeretnék építeni robogómhoz, és az lenne a kérdés, hogy szerintetek milyen elvel lenne a legegyszerűbb megvalósítani? Annyira nem kell hogy pontos legyen. Max 9999 fordulatot tudjon kijelezni. A kijelző meghajtást már megépítettem. Már próbáltam ccp modullal megoldani, de 32768-as órajel túl a 16bites számlálóhoz. Ha nagyobb órajelet használok, akkor meg nem tudok pontosan átváltani. Lehet aza baj,már a fejemben túlbonyolítottam az egészet,és azért nem megy Most arra gondoltam simán portb megszakításkor a tmr0 értékét menteném mindíg,és abból számolnám ki,de ez meg nem tűnik pontosnak,mert a megszakítás és az érték elmentése köött sok idő telne el. Nem tudom mennyire lenne így pontos. Minden fajta segítséget előre is köszönök! Üdv!
Van a lábak és a LED-ek között ellenállás?
A PIC típusitól függően csak egy bizonyos áramerősséget képes leadni lábanként. Ha túl sok áramot vesznek fel a LED-ek akkor valószínűleg nagyon kevés vagy egy sem fog világítani.
Hello!
Üdv a klubban, én is pont ilyesmit bütykölök, csak én egy Sámsonra Nem egyértelmű számomra, hogy min akarod kijeleztetni az értékeket.Én 4db hétszegmensessel oldottam ezt meg. Kétféle módszerrel próbálkoztam eddig. Az egyik az abból állt, hogy külső jellel(a megszakítóról jövő jellel) léptettem a TMR1-et és fél másodpercenként kiolvastam az értékét. Ezt még asm-ben írtam. Ennek az baja, hogy 120 fordulatot tévedhet. Ezt nem próbáltam ki élesben, csak úgy, hogy sima 5V-os amplitúdójú négyszögjelet méricskéltem vele. Így működött rendesen. Aztán átgondoltam és inkább azt a módszert választottam, hogy két szikra közt eltelt időből számítom ki a fordulatszámot. Mivel a két 8 bites szám osztása már meghaladtam a képességeimet, ezért kénytelen voltam áttérni a C-re. A programról: Egy 16f628A-s CCP modulját használom. A programot Hi-Tech fordítóra írtam. A pic-et belső oszcillátorról járatom. Hogy nehogy hamar túlcsorduljon a TMR1, ezért 48 KHz az alap órajel és amikor a megszakításban a fordulatszámot kell kiszámolni felkapcsolok 4 MHz-s órajelre, a lebegőpontos számolás miatt. A megszakítást 3 dolog okozhatja. A legnagyobb prioritású az, ha szikra van. Úgy oldottam meg, hogy 2 fordulatonként számítja ki a fordulatot. Van egy indító jel és a következőnél számolok, majd megint várok egy indító jelig és a következőnél számolom a kettő közti eltelt időből a fordulatot.A másik megszakításforrást a TMR0 okozhatja, ami a multiplexelést végzi, meg olyan 0,4 másodpercenként frissíti a kijelezendő értéket. Azért nem minden 2 szikra után frissítem az értéket, mert szerintem abból nagy katyvasz lenne. A harmadik megszakítást a TMR1 túlcsordulása okozhatja, ekkor 0 rpm-et jelzek ki és ennyi. Az a gond, hogy ugyan működni működik a dolog, csak nem jól Értelmes dolgot jelez ki, de nagyon széles sávban ugrál a kijelzett érték (stabil fordulatnál írt már ki 720-tól egészen 3200-ig mindent), bár ezt a programot, amit csatoltam neked, még nem próbáltam ki, csak egy korábbi verzióját. Nem tudom, hogy az illesztő ad-e ki valamilyen zajt és azt sikerül a pic-nek mérnie vagy valahol tényleg a program a hibás...A másik baja, hogy még a 4MHs-s órajellel is olyan sokáig számol, hogy vibrál a kijelzett érték. Lehet, hogy nem kéne erőltetnem a lebegőpontos változókat....Mindenesetre szerintem annyira jó lesz neked a program, hogy tudsz belőle meríteni valami ötletet. A két programomon kívül csatoltam az illesztő kapcsolását is. Nem saját tákolmány, úgy nyúltam netről. A stabilizátor részt ne nézd, mert eredetileg a töltőtekercsről akartam táplálni, de az iszonyatosan zajos volt ilyen egyutas egyenirányítóval, úgyhogy megpróbálom majd DC-DC konverterrel 2 ceruzaelemről járatni. Hálás lennék, ha elküldenéd a te jel illesztő kapcsolásodat. Kíváncsi vagyok, hogy te ezt a részét hogyan oldottad meg.Lehet privátban kéne, mert nem igazán erről szól a topik. A C-s programomhoz még annyit, hogy nem vagyok a C mestere, szóval, ha valami feleslegeset látsz/láttok benne nyugodtan tegyétek szóvá. Remélem segítettem valamit. Sok sikert!
Húú, na hol is kezdjem. Én nem tudok sajna c-ben programozni. Úgyhogy assembly-ben írtam a programot. Sajnos nem vagyok otthon,mert elutaztam, leghamarabb kedden este tudom elküldeni. Meg majd akkor nézem meg a te csatolmányaidat is. Én is először a két szikra között eltelt idő mérésével akartam megoldani,ahogy te írtad második megoldásként. Erre írtam előző hozzászólásomban a ccp modult. De itt az osztás miatt elakadtam.
Egyébként én még ott nem járok, hogy hogyan fogom csatolni a motorhoz, két megoldásra gondoltam. Egyik,hogy a megszakítóról veszem a jelet, a másik,pedig hogy a nagyfesz kábelra kötök pár menetet,és az adja majd a jelet. De most elgondolkoztam, és beugrott,hogy a pic mikrokontrollerek alkalmazástechnikája című könyvemben van egy frekvencia mérő program,ami alig 10-20 sor, és frekvenciamérés utasítás számlálással történik. Azért nem ezt választottam,mert nem értem, hogy hogy működik ez a kis program. Szóval a frekvencia ha megvan,csak 60-al meg kell szorozni,és kész... Még ma megpróbálom ezt a programot leírni. Ha van msn-ed, akkor azon folytathatjuk a témát,adatlapomon rajta van a címem,illetve az az emailom is! Üdv!
Itt a frekimérő. Amit kihagytam az előző hozzászólásomból, hogy én is 4digites kijelzőre iratom ki az eredményt.
Nem, nincs ellenállás még csak szimulátorban próbálgatom, igazábol a végén mindegyik lábon egy tranzisztor fog kapcsolni LEDeket.
Ez valószínűleg a read modify write akció miatt van így. Másra nem tudok gondolni.
Sziasztok
Olyat szeretnék hogy az egyik timer órajele más legyen mint PIC órajele. konkréttaban: kéne egy óraquarc, meg egy másik, mondjuk a belső órajel gen. PIC18F14K22
Szia!
A Timer 1 -et pont erre tervezték... Egy 32.768 kHz -s órak kristályhoz való oszcillátor is be van építve...
Hmm.
Nem tudom az a progi nekem is csinált hasonló furcsaságokat. Az LCD kijelzőt Pl. sehogy sem sikerült üzembe helyeznem benne közben meg a panelon összerakott cucc már régóta hiba nélkül működött akkor.
Sziasztok!
A programban levő sorok
valószínűleg bsf PORTA,1 -re fordul le. Ez az utasítás beolvassa a PORTA értékét és azon hajtja végre a műveletet majd az eredményt írja vissza a PORTA regiszterbe. Ha a ledeknál nincs / vagy túl kicsi az ellenállás, akkor az épen meghajtott kivezetésen nem lesz elég magas a szint a visszaolvasáskor. Így erre a bitre 0 -t olvas... Megoldás: - Megfelelő ellenállás beépítése minden portlábhoz. A minimális feszültség a magas szint olvasásához a TTL bufferes bemenetnél (RA0, RA1, RA3, RA4, RA5, RB4, RB6) 2V, ST bufferes bemenetnél (RC0..7) 0.8*Vdd (5V Vdd esetén 4V). - A műveletet ne a portról visszaolvasott értékkel végezzük, hanem a port egy kópiáját tartsuk egy regiszterben, a regiszter értékét módosítsuk és az eredményt másoljuk a portra. Az elsőt ajánlanám, mert a túlterhelés miatt a pic disszipációja 14 led egyszerre történő bekapcsolásánál meghaladhatja a megengedettet. Ha a kimenetek tranzisztorokat hajtanak meg, akkor a bázisellenállásokat kell jól méretezni.
Idézet: Tulajdonképpen az előosztók is erre szolgálnak... De a Timer1 saját oszcillátora, amit előttem ajánlottak, annyiban is más, hogy a CPU oszcillátorától függetlenül, SLEEP módban is használható. Real time órát is lehet vele játszani. Bővebben: Link „Olyat szeretnék hogy az egyik timer órajele más legyen mint PIC órajele.”
Igazából a végleges összeépített változatban nem használom a portokat egy időben egyszerre, csak a szimulátorban próbálgattam, összeépítve kimértem a pic lábait és mindegyiken 5V volt kivéve rx/tx azon 1,8 körüli volt a fesz. Néhány kimenetre viszont egy BCD-DEC IC van kötve, akkor oda is kellenek ellenállások, és ha igen akkor mekkorák, hogy lehet ezt kiszámolni? (mármint a pic kimenetei és az IC bemenetei közé).
Esetleg a bitmaszkokon kívül kell még valamire odafigyelni a konfigolásnál amit esetleg nem állítottam be? (az osc1-et mikroc-ben programból ki tudtam kapcsolni, de az osc2-t azt hiszem csak kódból lehet, legalábbis mikroC project properties menüjében nem találtam ilyet)
Hali!
Még új vagyok a PIC-ek programozásában aránylag. Hi-tech C használatával dolgozok egy PIC16F887-esen, iskolai projekt. Az a kérdésem lenne, valaki használ Hi-tech-et? Leszedtem a delay header fájlt, és be is includeoltam. Tökéletesen működik, szervót vezérlek vele. Minden okés, egyetlen kivétellel. DelayUs(1500), 1,5 ms -ot késleltet, a szervo motor be is áll az irányába (nagyjából közép) De ha! Int x = 1500; és DelayUs(x) akkor már nem tetszik neki és tul megy, sőőt, akár mi x értéke ugyan azt csinálja. Hogy lehet Delay függvénynek változó értéket adni? konvertálni kell char-ba? Vagy mi a trükk? Kérlek segítsetek
Szia!
- BCD dekóder ic nem terheli a pic kimenetét, mint a LED, nem kell a kimenet és az ic közé ellenállás. - Rx vonalat jó felhúzni a pic tápjára (illetve a legelső ponton, ami a másik készülékhez kapcsolódik, olyan szintre, hogy a pic Rx lába magas szinten legyen). A vevő mindenféle hibás karaktereket vesz, ha ez a láb lebeg. A Tx kimenet, ott nem lehetne 1.8 V körüli feszültség, ha UART1_Init már lefutott, csak akkor ha a pic tápja 1.8 - 2V. - Az RA4 és az RA5 az INTOSCIO oszcillátor módban használható IO portként ("FOSC<2:0>: Oscillator Selection bits - 100 = INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN")
Szimulátor szerint közvetlenül a DelayUs() hívása előtt az x-ben benne van az 1500 ?
MPLAB ot használok, még nem használtam a szimulátort, a debugger menünél a az Select Tool - > MPLAB SIM az igaz? Mert épp azt futtatom, de hogy tudom megnézni a változók értékét?
View->Watch vagy valami ilyesmi és ott tudod hozzáadni a listához, meg jobbkattintással talán a Properties alatt tudsz váltani decimális, hexadecimális, bináris, ascii kijelzés között. Meg ha kettőt kattintasz az értékre, akkor át is tudod írni tesztelési célból. Lokális változók valószínűleg úgy jelennek meg, hogy előtte ott van a tartalmazó függvény neve, tehát pl. main_x néven.
Megvan köszi. Nos x értéke közvetlen a DelayUs(x) elött 1500. És mégis leteszteltem még 1x, teljesen más irányba fordul, mintha a DelayUs(1500) érték lenne.
Ahogy elnézem, a DelayUs(x) elött, x értéke 1500, viszont a DelayUs-t le sem futtatja hanem valami aldiv.c-t hív meg, amit hirtelen én sem tudok, hogy mi:S ott a counter elmegy 30-ig, majd vissza 30ról 0-ra és tovább lép a program. A végén meg a DelayMs(20)-t simán letolja.
Valószínűnek tartom, hogy a gond azzal van, hogy Te futási időben adsz neki értéket és nem fordítási időben. Tehát változóval hívva nem működik megfelelően.
|
Bejelentkezés
Hirdetés |