Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Igen, de le is írtam, hogy nincsen kezelve. Azért itt nem egy majdnem teljes lapot elfoglaló tábláról van szó hanem csak egy 8 eleműről, amit szerintem nem nehéz olyan helyre tenni ahol nincs lapváltás. Illetve így egy kicsi hely is megspórolható.
Illetve a kód amit mellékeltél az egyáltalán nem működőképes! Ha pl én a tábla 0. elemére vagyok kíváncsi akkor nem a 0. elemre fog ugrani, hanem vissza a 7. sorra. Kijavítottam benne a címzési hibát, illetve a címkét is betettem.
Hali,
SPI kommunikációval kapcsolatos kérdésem lenne. Egy int típusú adatot szeretnék küldeni SPI buszra.Pl. 0x1234 -t. Ezt így közvetlenül betudom tölteni az SSPxBUF-ba? Azt olvastam, hogy akárhány bitet lehet küldeni. Ugye, az SSPxSR 8 bites. De SSPxBUF mérete mekkora? Ha jól értelmeztem, akkor ha ezt az int adatot betöltöm SSPxBUF-ba, akkor mindig csak 8 bit lesz az SSPxSR-be. Ahogy a shift regiszterből kilépett egy bit, úgy az SSPxBUF-ból belép egy ujabb bit az SR-be. Ez így lehetséges?
A puffert(8bites) a kiürülése után lehet feltölteni egy újabb bájttal. Nem értem a bitenkénti problémádat, ez magától működik. Ahogy kiért a bájt, beér a másik, feltéve, hogy volt ami küldjön értelmezendő adatot.
Hát nem tudom másképpen megfogalmazni.
![]() Inkább irom példában:v.1 void spi_ir (unsigned long adat) { WriteSPI(adat); } void main (void) { unsigned long adat=0x12345678; spi_ir(adat); } adat 4 bájtos változó. Ígyis meglehet hivni az SPI irás függvényt? Vagy tömbökbe gondolkozzak:v.2 void spi_ir (void) { int *n; n=kuld; WriteSPI(*n); n++; WriteSPI(*n); } int kuld[4]; void main (void) { int *m; int *p; int adat[2]={0x1234, 0x5678}; m=kuld; p=adat; *m=*p; p++; m++; *m=*p; spi_ir(); } Eredetileg tömbösen kezdtem, de most elakadtam, és a továbbiakban sokkal könnyebb lenne, ha az első verzió szerint is lehetne.
Miért nem tudok egy S-betűt kiíratni az LCD-re?
Tudom hogy kicsit nyakatekert, de működnie kellene szerintem.
A kód többi részét is láthatnánk? (lcd inicializálása, várakozások stb)
A 26. sort tedd a 21. helyére.
A többi részt azért nem mutattam meg, mert teljesen biztos vagyok benne hogy a hiba ebben a kódrészletben van. És tényleg, mert áttettem a 26. sort és így már jó.
A gond az, hogy kiíratom a szöveget és kb fél perc múlva még a végére odaír valami karaktert. Ha kiírok egy hosszabb szöveget, akkor pedig olvashatatlan karaktersorozat lesz belőle fél perc múlva. ![]() Ja és egyenlőre nem tudok egy adott karakterhez ugrani, de erre talán rájövök. Az volt az elképzelésem hogy ugyan ez a szubrutin jó erre is, csak a legelső sorát kell bsf lcd_RS-ről bcf lcd_RS-re átírni.
Nem vagyok asm guru, de miért jó a biteket egyenként billegtetni ? Miért nem írod be egyszerre a portra a szükséges biteket ?
Azért mert a programot igyekszem úgy megírni, hogyha a PIC másik I/O lábaira kötözgetem az LCD-t, akkor is működjön a program, csak az elején a definíciókat kelljen átírnom.
Ha hívok egy szubrutint, akkor a RETURN után ugyebár visszaugrik oda, ahonnan meghívtam a szubrutint. De ha a szubrutinban is hívok egy szubrutint, meg abban is egyet stb... Akkor honnan tudja a PIC hogy most végül is mikor hova kell visszaugornia? Eltárolja magának valahol ezeket a címeket? Ha igen, mennyit tud maximum eltárolni?
Szia!
A Pic18F szériában van egy külön 31 mélységű zsáktár (stack) , ami elsősorban a visszatérési címek tárolására szolgál... Szia Idézet: „Illetve a kód amit mellékeltél az egyáltalán nem működőképes! Ha pl én a tábla 0. elemére vagyok kíváncsi akkor nem a 0. elemre fog ugrani, hanem vissza a 7. sorra” Teljesen igazad van, nem figyeltem oda! Amugy a Tiednel meg a 13. soron fog vegtelen ciklusba kerulni W=0 eseten, de konnyu rajta segiteni: csak at kell helyezni a cimket a kovetkezo sorra.
Így tudok az LCD-n címhez ugrani:
Így viszont nem sikerül. Pontosabban így is átugrk máshova a kurzor, csak nem ahhoz a karakterhez amihez szeretném. (Elvileg ugyan oda kellene ugrania a kurzornak mindkét kódrészlet esetén.)
Ja és rájöttem, hogy miért lesz értelmetlen karaktersorozat az LCD-n a kiíratás után kb egy perccel. Azért, mert a watchdog be volt kapcsolva és resetelte a PIC-et. De persze az LCD-t ugyebár nem, így az értelmetlen parancsokat kapott és ezért írta tele a kijelzőt mindenféle érdekes karakterekkel.
![]()
Vettem egy LTC1865-ös 16 bites A/D átalakítót a Chipcad-nél. Hogyan lehet az ilyen konvertereket használni?
Olvasgattam az adatlapját és arra jutottam hogy a CONV lábára kell H szintet adnom a konverzió idejéig, utána pedig az SCK lábra impulzusokat kell küldenem és mindegyik impulzus felfutó élekor az SDO lábán kiadja az egyes biteket, a legnagyobb helyértékűvel kezdve. Jól gondolom hogy ilyen egyszerű a dolog? ![]() Ja és a Vref lábra kapcsolt referencia-feszültség hogyan befolyásolja pontosan a mért (konvertált) értéket? Ha mondjuk 4,096V-os referenciaforrást kapcsolok az A/D-re, akkor 1mV felbontásban tudok mérni 4,096V-ig? (Eddig csak az ICL7107 és ICL7135-ös A/D-kkel volt dolgom, azoknál nagyon egyszerű; kijelzett érték=2000*Ube/Uref)
Az adatlapja gondolom megvan, gondolom látod az idő/jel folyamatábrán a menetet.
Viszont a 4,096V referenciafesz esetén nem 1mV lesz a felbontás, ha 16bites az A/D, hanem 4096/65536=0,0625mV
Ja tényleg!
![]() Lehet hogy mégsem A/D-zek, mert nem találom a kis nyolclábút sehol. Úgy néz ki 3500Ft-om bánja... ![]()
Sziasztok! Ismét LCD-vel bajlódok. Próbálkoztam az új kijelzőmet 3,3V-ról működtetni, vagyis a PIC is azon a tápon volt, de nem ment.
Elővettem a régi kijelzőt, ami szintén 3,3V-os. A PIC-et 5V-ra tettem és diódákkal leosztottam a vezérlő jelszinteket, hogy ne menjen tönkre az LCD. Működött. Így az egész rendszert megpróbáltam 3,3V-ról, persze a diódákat már kihagytam. Egyszerűen így már nem működik. Mivel még soha nem futtattam PIC-et 3,3V-os rendszerből ezért felmerült bennem a gyanú, hogy valamilyen bit-et át kell állítani, vagy pl. az SPI funkcióra alkalmatlan a PIC-em, már ezen a fesz. szinten. Oktondiságomból fakadóan nem találok a datasheet-ben ilyesmit. A PIC-em 16F887, valaki mondja meg a frankót! Köszi! gabesz
Nem úgy van, hogy az utasítás "előbb" végrehajtódik mint a pc inkrementálódása?
AN556, example 5 Itt is így van, mint ahogy én írtam. Közben eltelt fél óra míg ezt írom és utánanéztem jobban és neked van igazad. Egy sorral arrébb kell tenni a címkét. Ezek szerint nem lehet bízni az appnotekban. Tehát mindig a PC-1 -dik művelet az ami végrehajtódik, és a PC művelet az amit éppen betöltődik.
Mekkora frekvencián akarod hajtani a PIC-et?
Igen, hat vegulis abban az appnote-ban is vegeredmenyben hibasan van ilyen szempontbol, mivel ugye elobb kiolvassa a tabla cimet, ami valojaban nem a tabla cime hanem a MOVWF PCL utasitas cime, tehat 0 hozzaadasaval nyilvan nem lesz jo, es mivel onmagara ugral vissza, vegtelen ciklusba kerul.
Amugy nem ez az elso eset, hogy az appnote-ban hiba van. Van olyan is amiben az aramkor sem megfelelo amit oda raknak -- arra viszont jok ezek az appnote-ok, hogy elgondolkodjon rajtuk az ember ![]()
Mutasd meg a kapcsolási rajzodat mind az 5V-os, mind a 3,3V-os esetét. Illetve az LCD tipusa is jó lenne.
Itt van, de nem nagy dolog. Szerintem a PIC-em alkalmatlan a 3,3V-os normál működésre. Maximum alvó módban tud így működni. Az a baj, hogy nem tudom...
Azt mondod, hogy kellene működnie 3,3V módban a PIC-nek rendesen?
Igen, működnie kell. Ha megnézed az adatlapot, már 2V-ról egészen 8MHz-ig működnie kell. 4MHz és 3,3V bőven belül van a működési tartományon. Config2 konfigurációs regiszterben van a BOR4V bit, az szerintem alapból 1-en van, és akkor 4V-nál resetel a BOR. Ezt ha nullára állítod, akkor 2,1V-nál fog resetelni, ami egészen 8MHz-ig elég is. De ha nem kell a BOR, akkor kikapcsolhatod teljesen a BOREN bitek nullára állításával. Ezek is szerintem alapból 1-en vannak, amivel be van kapcsolva a BOR.
...éééééés köszönöm! BOR OFF és már működik is! Hálás köszönet! g.
A LATA-ra nem tudok kiküldeni semmit. Miért?
Beírom ezt:
És a szimulátorban nézem a regisztereket. A LATC-be beleírja, a LATA-ba viszont nem. ![]() Természetesen kimenetre van állítva mindkét port:
|
Bejelentkezés
Hirdetés |