Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
PIC18F87J94-el dolgozom. Az MPLAB v8.92 debugger módban hibásan ad vissza egy nagy halom funkció regisztert. Igaz, hogy nem teljesen támogatott a típus, de azért ez elég gáz!
Pedig a minap én is avalami hasonlót akartam venni a 14k50 helyett. Nincs benne elég RAM az MC-s könyvtárhoz Nem tudom mikor jött ki, de lehet, hogy már akkor sem foglalkoztak nagyon a sima ide hozzáfrissítésével, inkább az X-re feküdtek rá. Egyre jobban rá leszünk kényszerülve az X-re.
Nem vitás sok jó funkciója van, de a sima IDE-ből is átvehettek volna ezt-azt az X-be is.
Szerintem becsapós, hogy a debuggolás sárgával van jelezve. Ha egy regiszert nem ad vissza rendesen, az nem sárga, hanem piros. Sárga olyan lenne, hogy egy timert nem jól kezel, meg ilyesmi, de alapvető dolgokat így kezelni egyenlő a használhatatlansággal, főleg, ha nem tudod melyikeket adja vissza rosszul. amúgy az IC egész jól sikerült, kivéve a oszciját, ami nagy sebességen nem indul rendesen, de erre van valami az erratában. Néhány probléma van még az ADC-vel, de azzal is együtt lehet élni.
Sziasztok!
Soros kommunikáció tesztelésével van problémám. ( PIC16F628A )MPLAB-ban stimulussal birizgálva az Rx lábat sem az RCIF bit nemváltozik, és az RCREG-ben sem jelenik meg semmi sem. A PIC pdf-e szerint állítottam be mindent - legalábbis azt hiszem. Az MPLAB nem kezeli rendesen, vagy a progimban keressem tovább a hibát?
Készíteni kell egy adatállományt. Ld melléklet.
Debugger / Select tool / MpLab Sim. Debugger / Settings / Uart1 IO lapon Enable Uart1 IO -be pipa, Output Window legyen kiválasztva. Debugger / Settings / Osc / Trace lapon az órajel frekvencia beállítása. Debugger / Stimulus / New Workbook lehívása. A Register Injection fülön az első sorban a Reg / Var mezőben az RCREG kiválasztása, a Data Filename mezőben a létrehozott adatállomány kiválasztása. Save, majd Apply. A project újrafordítása, töréspont elhelyezése. Debugger / Run.
Köszönöm szépen, így már működik!
Ha jól értem az RB1/Rx pin billegtetésével nem lehet tesztelni az USART-ot. (stimulus - Pin/Register Action fülön próbáltam)
Sziasztok! Szükségem lenne egy PIC-es kapcsolásra, ami egy USB-s szkenner adatait olvassa be és azt egy HD44xx alapú 4 soros LCD kijelzőn jeleníti meg. Milyen típust javasoltok? Előre is köszi.
Sanyi
Szia! Az USB-s szkenner az micsoda (gondolom nem képet szkennel?)? Milyen adatok jönnek róla és milyen felülettel kellene a PIC-hez csatlakoznia?
A hozzászólás módosítva: Okt 28, 2014
Jogos, nem fogalmaztam elég pontosan. Vonalkód olvasóról van szó. Betűket, számokat kell csak megjeleníteni.
Akkor valami olyan PIC kell, amiben van USB OTG. Ez 8 bitesben nincs, 16 bitesben talán, 32 bitesben biztosan van. Nézz szét a microchip példakódjai között, mert ezek a vonalkódolvasók sima HID billentyűzetként szoktak a rendszerben megjelenni, és mintha lenne billentyűzetet kezelő példakód.
Fejből a PIC32MX795F512L típust tudom, hogy van benne USB OTG, de itt kereshetsz más típust: Bővebben: Link A hozzászólás módosítva: Okt 28, 2014
Le kell tölteni a Microchip Applications Library csomagot, és meg kell nézni, hogy az USB Host mintapéldák között milyen támogatott eszközök találhatók. Nálam PIC24FJ256GB110, PIC24FJ64GB004, PIC32MX460F512L, PIC32MX795F512L szerepel, de ez egy régi letöltés, azóta bizonyára vannak újabb típusok is.
Egy kis érdekesség.
Lehet nem jó helyen teszem fel ezt a kérdést, ezért ne tépjétek majd le a fejem.
Maga a probléma is elég fura, számomra egyenlőre értelmezhetetlen, de lehet csak én nézek be valamit nagyon csúnyán. Van egy projektem amiben egy részfeladat egy motor fordulatszám mérése. A motoron egy tárcsa forog, ezen van egy jelölés amit egy résoptó érzékel stb.. CCP capture módját használom a méréshez. A kód a következő:
Tudom, lehetne egyszerűbben is megírni és a pollingolás nem túl elegáns. Amikor először próbáltam a programot teljesen hibás értékeket mért. USART modullal elküldtem PC-re az ebben a függvényben használt változók értékeit. Kiderült, hogy a mes_cnt1 és mes_cnt2 változókba néha negatív számok kerülnek, és ezek okoznak furcsa dolgokat a számolásban. A nagy kérdés az, hogy mégis egy unsigned int változóba hogyan kerülhet negatív érték, pláne úgy, hogy a CCPR1L és H értékeit rakom bele, amik pedig a timer1 értékét tárolják ami 0-tól 65535-ig számol. Próbálkoztam, olyannal is, hogy ha valamelyik változó értéke negatív vegye az abszolút értékét és USARTon küldjön egy karaktert. Ennek ellenére továbbra is jöttek negatív értékek és a feltétel teljsülését jelző karakter meg nem jött meg, tehát a program nem érzékelte ezeket az értékeket negatívnak. Azt nem hiszem, hogy usart küldés miatt válnának ezek a számok negatívvá, mert kiszámított fordulatszámot LCD-re is kirakom és ott is ugyan ez látszik. Én már nagyon abszurdnak érzem ezt a szituációt és nemlátom, hogy min csúszik félre a dolog.
Negatív szám = legfelső bit magas. Ettől kezdve a többi értelmezés kérdése. Ha arra vagy kíváncsi milyen adat jött, lehet egy terminál ablakban hexa nézetben látod amit küldtél. A többi már átesik valamiféle értelmezésen.
De az USART karaktereket küld, ha hexa nézetben nézem akkor a karakterek ascii kódját látom hexadecimálisan, ami mondjuk a -1234 esetében 2D 31 23 33 34, de ez azt jelenti, hogy a pic ezt az 5 karaktert tolta ki az usarton keresztül. De azért nem gondolom, hogy ez az értelmezésen múlna, mert pl kijön az hogy:
mes_cnt1=-9785 mes_cnt2=23548 mes_cnt=33333 mes_time=1125 ez egy konkrét mért érték. a pic jól számolt a kód alapján ha valóban negatív szám van a mes_cnt1 változóban. És itt épp helyesen is mérte a fordulatszámot, a kapott érték valós. tehát ebből gondolom, hogy a pic is negatívnak látja ennek a változónak az értékét.
Nincs olyan, hogy a PIC negatívnak lát egy számot. Ugyanaz a bitminta lehet negatívnak értelmezett, vagy pozitívnak. Te döntöd el, hogy minek akarod értelmezni, és ennek megfelelően deklarálod a változót. De ez igencsak nem haladó kérdéskör...
Akkor már a soros portra küldő rutinod is rossz. Azokból a regiszterekből te csak két hexadecimális számot kaphatsz. És előjele az tuti nincs, max a legfelső bitje 1, amit valami negatív számnak tekint, és úgy küld el neked.
Lehet akkor tényleg én vagyok a debil és alapvető dolgokat nem látok vagy nem értek, de hogyan magyarázod azt hogy van két regiszter:
TMR1H és TMR1L amelyek értéke 0b00000000 0b00000000 tól 0b11111111 0b11111111 ig változhat. Ennek a két regiszternek a tartalmát egy RC2 lábra érkező felfutó él hatására átmásoljuk a CCPR1H és CCPR1L regiszterekbe. innentől kezdve ebben a két regiszterben 0b00000000 0b00000000 tól 0b11111111 0b11111111 ig fog valami adat tárolódni emelett van egy unsigned int típusú változóm aminek értéke 0b0000000000000000 és 0b1111111111111111 között változhat. Ebbe a változóba beleteszem a két regiszter értékét. Először a CCPR1H tartalmát teszem bele a 16 bit felső 8 bitjébe. majd a CCPR1L tartalmát a 16bit alsó 8 bitjébe. innentől kezdve az unsigned int változóm 16 bites memória területén van benne a két nyolc bites regiszter tartalma összeolvasztva binárisan. Az unsigned int változóban tárolt 16 bites adatot előjel nélküli számnak értelmezi a fordító vagyis a benne eltárolt bináris érték decimálisan kifejezve 0 és 65535 között vehet fel egy értéket. Ezek után hogyan értelmezi ezt bármi is negatív számnak? ki értelmezi annak, hogyan és miért?
A soros portra és az LCD-re kiíró rutinod értelmezi negatívnak. Ha pl. a printf("%d", mes_cnt1) formában írod ki. Használj %u-t, és nézd meg úgy.
Miután te írod a programot(feltételezem), te értelmezed, jeleníted meg előjelesen, vagy nem előjelesen. Ez a te választásod kellene legyen. Ha olyan rutint használsz, amit nem ismersz, és az előjeles típusként fogadja a számot, akkor az úgy fog megjelenni. Mint írtuk, a bitminta azonos, csak az értelmezési tartomány más. Ahogy potyo írta, az LCD rutinod előjeles típust fogad. Ezt bizonyára te állítottad be így, vagy ha nem te írtad, akkor az aki írta. Nézd meg a prototípusát a függvénynek, ott látni kell. Ha neked ez nem felel meg, át kell írnod a megjelenítést, vagy olyan függvényt kell hívnod (ha létezik), ami nem előjeles típust fogad. A PC-n való megjelenítés teljesen hasonló kérdés. Ha egy 16bites előjeles számot a PC-n 32bites integerbe teszel, akkor nem lesz már előjeles, csak akkor, ha 16bitesbe. viszont ha egy unsigned int PIC-es változót beteszel egy 16 bites integer PC változóba, akkor előjelessé konvertáltad, de ha 32bitesbe, akkor pozitív egészként fog megjelenni (hogy miért , azt gondolom meg tudod fejteni). A változók típusával döntöd el, hogy a számot milyen értelmezési tartományban akarod látni. Nézd meg, hogy melyik típusnak milyen az értelmezési tartománya!
Valami készül a PIC32 -esek körül: Bővebben: Link Csak az a kérdés, mennyit kell várni a programozási leírás megjelenésétől a forgalomba hozatalig...
Szia!
A kérdésed jogos, bár ha azt vesszük ez a leírás megjelenhetett a már kapható hibás példányokhoz is. Szerinted ki fogják javítani a belső osci hibáját, vagy marad a külső órajeles történet? A többi hibáról nem is beszélve. Kicsit kiábrándított, pedig nagyon vártam!
Sziasztok!
Van egy asm programom amit rendszeresen 18-as pic-be programozok. Lehetséges e hogy valamilyen egyedi, minden fordítás után más azonosítót tegyek az epromba (nem a programba írva), beírni nehézkes lenne a nagy darabszám miatt. Cél az lenne hogy utólag azonosítható legyen mikor lett felprogramozva. Pl. időbélyegző, vagy valami más?
Minden FORDITAS vagy minden PROGRAMOZAS?
Ha programozas es a progizo nem tudja, akkor nem fog menni. Ha forditas, akkor a fordito batch-ba be tudsz illeszteni forditas ELOTT egy kis progit, ami megnyitja a forrasnyelvi assemblyt, egy (fix) helyre beirja a kivant ertekeket es ezutan EZEKKEL az ertekkekkel fordul le a progi, lesz belole hex, ami mar tartalmazza az egyedi azonositot es ezt lehet beprogramozni.
Mplab-al fordítok, programozok. Minden programozás után visszaolvasok hogy le van e zárva, így újból fordítanom is kell. Ekkor kellene egy új azonosító bele.
Én írtam két Autoit! alkalmazást, amit az Mplabbal minden fordítás előtt és után meghívatok (Custom build).
Az első alkalmazás létrehoz egy "buildtime.h" fájlt, aminek kötött formátuma van, az első sor kötelezően egy verziószám. Ezt a fájlt lehet "include"-dal meghívni a forrásban, ahol beépíthető a lefordított programba. Sikeres fordítás után megnöveli a verziószámot, és egy tömörített, archív fájlt hoz létre a projekt összes állományából. A hozzászólás módosítva: Okt 30, 2014
Na, ez meg jobb. Szerintem ki lehet a datumot/ idot iratni file-ba, aztan beincludeolod a sajat progidba. Igy meg modosito sem kell.
Sziasztok,egy olyan kérdésem lenne,hogy 3 voltról működhet a pic?
Ezt a hőmérőt szerettem volna megépíteni,de sajnos nem akar elindulni.
Elvileg kellene mennie a belső oszcillátorról már 3V-ról is. Valami más lesz a gondja.
|
Bejelentkezés
Hirdetés |