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 |