Fórum témák
» Több friss téma |
Pedig az X-nek vannak nyűgjei.
Mindenesetre a hiba okai azok lehetnek amiket nedudgi fórumtárs is felsorolt. Alapból rácsatlakozik a PIC-re csak programozákor veszti el, vagy alapból is azonosítási hibát ír ki? Dashboardon látszik a PIC?
Sziasztok,
Segítene valaki a következő probléma megoldásában? Ha PORTA 0-ra és 1-re egy-egy LED-et kötök egy-egy 330ohm ellenálláson keresztül. A led-ek másik lába GND-re van kötve. Akkor:
Miért alszik ki a másik led, ha az egyiket bekapcsolom???? Kösz, L. A hozzászólás módosítva: Jún 10, 2014
Pontosan mit értesz azon, hogy kapcsolod a ledet? Ez a kód szerintem csak bekapcsolja mindkettőt és úgy marad.
Hülye vagyok.
Rájöttem a hibára. Az MPLAB-ban más device volt kiválasztva.
Forrásszöveg beillesztéséhez a kód gomb ajánlott.
A bsf utasítás beolvassa a portot, beállítja a bitet, és visszaírja a portra az új tartalmat. Így előfordulhat, hogy bizony kialszik a LED.
Na igen! PONT EZ AZ! Csak bekapcsoltam, de amint egy BSF kiment a másik led kikapcsolt, és csak az az egy maradt bekapcsolva. Pedig egyáltalán nem kapcsoltam ki, mint az látható. Csak be! Na de megvan a hiba. PIC12F675 volt beállítva a device-nak. Mikor azt rendesen beállítottam, a hiba megszűnt. (Mondjuk nem értem, de lényeg, hogy most rendben van.)
Ezt valami szimulátoron nézed? Mert egyébként nem sokat látni ebből.
Szia!
A kontrolleren nem állítottad vissza a Bank kiválasztást a PORT regiszterekre. 16F690 -en az ANSEL és ANSELH a 2. Bank -ban van, a PORTA is elérhető ebben a Bank -ban. Tehát a hiba nem jelentkezik. 12F673 -on az ANSEL a 1. Bank -ban van, de ebben a Bank -ban a TRISIO regiszter érhető el. Ha az 1. Bank kiválasztása mellett végrehajtod a bsf PORTA,0 utasítást, akkor tulajdonképen a bsf TRISIO,0 -t hajtja végre... Ráadásul a 12F675 -nek sen PORTA sem ANSELH regisztere nincs, nem is fordulhatott le a program rá... A hozzászólás módosítva: Jún 10, 2014
Á, nem.
Korábban írtam egy programot 12f675-re. Akkor az MPLAB-ban a device-t átállítottam erre a típusú PIC-re. Az egy másik kicsike program volt, és teljesen jó is lett, remekül működik. Most viszont egy 16f690-et programoztam volna, de elfelejtettem visszaállítani az MPLAB-ban a DEVICE-t. Amint ezt megtettem, már minden rendben működött. A program azért fordult le a hibás DEVICE mellett is, mert a 16f690 definícióit tartalmazó include fájl az be volt emelve. Abban benne van a PORTA, az ANSELH, stb. Valahogy azt gondolom, hogy a téves DEVICE beállítás miatt a MPLAB más kódot állított elő, mint a 16f690-hez kellett volna. 12f675-re fordított 16f690 helyett. Hogy ez miért okozott ilyen hibát, azt egyáltalán nem tudom, de mégis ez történt.
Sziasztok!
Pár napja kérdeztem ezzel kapcsolaban és bár azóta ezen töröm a fejem, probléma továbbra is adott: egy pic18f14k50-es ketyerén szeretném belőni a külső megszakítást (int0). Ez az RC0 lábhoz van rendelve. Írtam egy apró kódot, ami azt csinálná, hogy ha '1'-et adok RC0-ra, akkor ő meg '1'-et ad RC4-re. Persze nem tesz semmi ilyesmit. Próbáltam a kódban látható módon, közvetlenül az INTCON írásával és nem ilyen direkt módon is, a C18 library beépített fgv-eivel, hasonló eredménnyel. Ha a timer0 megszakítását használom, akkor ott szépen végrehajtódik a megszakítás, szóval nem értem mi lehet a baj. (konfig bitjeim nincsenek a kódan, mert az mplabban lehet kódon kívül állítani öket, de természetesen állítva vannak, a megszakításon kívül minden (pwm, timer, timeres megszakítás, stb működik.)) Remélem tudtok segíteni, mert már teljesen tanácstalan vagyok. Előre is köszönöm a válaszokat! Kódot mellékelek:
A hozzászólás módosítva: Jún 11, 2014
Az XC8-hoz nem értek. C18-ra a honlapomon a PICCOLO projektben találsz mintapéldát.
Az inicializálásban nálam ezek vannak:
A megszakításban pedig törölni kell a megszakításjelző bitet:
Szia!
Nem állítottad be a globális megszakítás engedélyezését, addig nincs is megszakítás. Az ANSEL regiszter valószínűleg csak kiválasztja melyik bit legyen az AD bemenete, a valós tiltást valamelyik ADCON regiszter végzi. Idézet: Valóban, kell egy engedélyezés is:„Nem állítottad be a globális megszakítás engedélyezését, addig nincs is megszakítás.”
Az előző hozzászólásomban viszont direkt le van tiltva a megszakítási rendszer, mert abban csak az alvásból történő felébresztésre használom az INT0 bemenetet. Idézet: Nem, az ANSEL bitjei az analóg/digitális mód választására valók. Az ADCON1 regiszterrel az előző generációs mikrovezérlőknél lehetett beállítani, hogy hány analóg bemenet legyen, de azoknál nincs ANSEL regiszter, s az engedélyezés csak kötött sorrendben (AN0-tól kezdve) mehetett. A PIC18F14K50 mikrovezérlő esetén viszont az ANSEL, illetve az ANSELH regiszterek megfelelő bitjének beállításával, bitenként függetlenül történhet (tehát bármelyik analóg bemenetként is funkcionáló lábat beállíthatjuk digitális üzemmódba, a többi kivezetés üzemmódjától függetlenül) az analóg/digitális mód beállítása. „Az ANSEL regiszter valószínűleg csak kiválasztja melyik bit legyen az AD bemenete”
Üdv!
Létezik olyan fordító+program páros, amivel a 12F, és a 16F-es MCU-k jól programozhatók C-ben? Válaszokat előre is köszönöm! Idézet: „Létezik olyan fordító+program páros, amivel a 12F, és a 16F-es MCU-k jól programozhatók C-ben?” Ha nem írtad volna, hogy "jól", akkor könnyebb lenne a válaszadás... Az XC8 elvileg erre való (sőt, a fentiek mellett PIC18-at is programozhatsz vele).
Igen, a PICCOLO-t olvastam és sok hasznosat sikerült tanulnom belőle, amit ezúton is köszönök!
Sikerült azóta megcsinálni a megszakítást és mivel mérgemben mindent újraírtam, ezért nem is igazán tudom, hogy mi volt a hiba . A következő lépésben azonban egy újabb problémába futottam: definiálok egy globális változót: volatile long int high = 0; és ezt szeretném módosítani a megszakítás fgv-én belül, viszont úgy tűnik, hogy erre nem hajlandó. Látja a fgv a változót, mert lefordul és lefut a program, de valamiért nem módosítja. Ennek mi lehet az oka?
Sziasztok! Próbáltam Hp41C tanácsára szorzást csinálni egy 16F628A-val. Az alábbi kódot próbáltam:
Ez alapján A gond az, hogy egyszer beprogramozom a pic-be, akkor nem csinál semmit, de nem is működik a kontroller. A PICKIT2 programja felismeri, de bármit próbálok vele csinálni mindig sárgára vált és kiírja, hogy No device. Lehet ezekkel valamit kezdeni? Már két pic-el jártam így.
A MCLR letiltva, belső oszcilátor, PWRTE letiltva, a PGD és/vagy PGC lábat kimenetnek állítva rögtön a program elején. Próbáld a Vpp first programming entry módszert. Esetleg a kimenetté állítás elé tegyél néhány ms várakozást, vagy a MCLR funkciót nem tilstd el.
Köszi! A Vpp first programming entry módszer bejött! A config beállításokkal tisztában vagyok, de ezekkel használtam már különböző tanulóprogramok kipróbálására és eddig nem volt gond vele.
Köszönöm a segítséget!
Sziasztok!
Van egy kódom, ami a következőt hivatott tenni: az egyik lábára a pic kap egy távirányító vevőjéből érkező jelet, aminek minden változására létrejön egy megszakítás és attól függően, hogy éppen magas, vagy alacsony azon a lábon a jel, amikor létrejön az interrupt, a timer aktuális értékét kimenti egy low, vagy high változóba. Ezzel az a célom, hogy majd a low és high arányából következtethessek a jel kitöltöttségére. Emellé még beírtam a megszakításba egy ellenőrző részt is, ahol is, ha felfutó élre ütött be a megszakítás (RB4 éppen magas), akkor egy másik lábat magasra állítok, ha pedig leszállóra, akkor alacsonyra. Így egy az egyben lemásolom a bejövő jelet. Ezt ellenőrzésként tettem be, azért, hogy lássam, hogy minden jól működik-e. Hát igen, jól. Azt leszámítva, hogy a pwm változóm értéke konstans 0, ami azt jelenti, hogy a high változóm 0. Mindig. Ez azért nem világos számomra, mert, ha csak a high változót vizsgálom, akkor nem 0 lesz, hanem 80 körüli érték általában. (kitöltöttségtől függően +-10) Nem értem, hogy miért a high=0 értéket használja folyamatosan a programom. Remélem érthető voltam, 8 órája fel sem álltam a cucc mellől, kicsit fáradt vagyok Előre is köszi a segítséget! Íme a kód (a config bitek nem kódból, hanem az mplab beépített fonkciójából vannak állítva):
Az egész típusú változókkal egy kicsit óvatosabban kell számolni!
Az osztásod eredménye mindig 1-nél kisebb szám, azaz nulla lesz, azt már szorozhatod... Javaslat: előbb szorozd meg 100-zal, utána végezd el az osztást! A hozzászólás módosítva: Jún 13, 2014
Szia !
Ez így egész számokkal dolgozik és a kiszámított egész értéket konvertálja lebegőpontossá mielőtt "pwm"-be tárolja. Valami ehhez hasonló történik a háttérben:
A konkrét esetben így utasíthatod a fordítót arra, hogy a számolást is lebegőpontos adatokkal végezze el:
És jwaldha válaszához is:
Köszönöm szépen, C++ban ez kicsit azt hiszem okosabban megy már és bár sejtettem, hogy valami ilyesmi dolgozik háttérben, nem jöttem rá, hogy mi is pontosan. Most viszont tökéletesen működik, köszönöm mégegyszer
Sziasztok!
Azt szeretném kérdezni, hogy elvileg lehetséges lenne pic-et programozni egy USB-UART átalakítóval, vagy csak pickit 2/jdm stb-vel? Előre is köszönöm a segítséget!
Üdv!
Általában az ilyen átalakítók nem megfelelőek, mert nem tartják be pontosan az időzítéseket. Ha jól működőt akarsz, akkor PICkit2 vagy 3, PICkit2 klón, esetleg kezdésnek az Oshonsoft.com oldalon található égetőt tudom ajánlani. A JDM-et semmiképpen sem ajánlom. A hozzászólás módosítva: Jún 13, 2014
Nem lehetséges.
A PIC-et meghatározott lábakon kell programozni, adott programozó feszültséggel, és időzítéssel. Maximum olyan megoldást tudok elképzelni, hogy ha UART-os bootloader van a PIC-be előre beégetve, de nem tudom ez mennyire kivitelezhető. És mi van ha nincs UART a PIC-en? A hozzászólás módosítva: Jún 13, 2014
Sziasztok!
Segítséget szeretnék kérni, hogy hogyan tudok PIC-kel winchestert vezérelni(írni, olvasni, esetleg formázni). A fájlrendszereket néztem, lehetőleg UDF kéne, vagy hasonló, amit támogat minimum a windows és a linux, és 4Gb-nál nagyobb fájlt is tudjak rá írni. |
Bejelentkezés
Hirdetés |