Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   628 / 1320
(#) Braf válasza trudnai hozzászólására (») Dec 25, 2009 /
 
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.
  1. TABLE
  2.         MOVWF TABLETTEMP
  3.         MOVLW HIGH REALTABLE    ; felső címbájt a workbe
  4.         MOVWF PCLATH            ; felső címbájt a pclath ba
  5.         MOVLW LOW REALTABLE     ; itt módosítottam mert nem a pcl aktuális értéke a lényeg
  6.                                 ; hanem az első táblaelem-1 címének alsó bájtja (azért táblaelem-1, mert eggyel növelődni fog automatikusan)
  7.         ADDWF TABLETTEMP,W      ; hozzáadjuk az indexet
  8.         BTFSC STATUS,C          ; túlcsordult?
  9.         INCF PCLATH,F           ; igen növelni kell egyel a pclaht ot
  10.        
  11. REALTABLE
  12.         MOVWF PCL               ; alsó cím bájtal ugrunk
  13.         GOTO HETFO
  14.         GOTO KEDD
  15.         ...
(#) valaki2 hozzászólása Dec 25, 2009 /
 
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?
(#) watt válasza valaki2 hozzászólására (») Dec 25, 2009 /
 
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.
(#) valaki2 válasza watt hozzászólására (») Dec 25, 2009 /
 
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.
(#) Attila86 hozzászólása Dec 25, 2009 /
 
Miért nem tudok egy S-betűt kiíratni az LCD-re?
  1. movlw   'S'
  2.         movwf   LATC
  3.         call    LCD_kiiratas
  4.  
  5. LCD_kiiratas
  6.         bsf             lcd_RS
  7.         bcf             lcd_b4
  8.         bcf             lcd_b5
  9.         bcf             lcd_b6
  10.         bcf             lcd_b7
  11.         bcf             lcd_EN
  12.         btfsc   WREG,4
  13.         bsf             lcd_b4
  14.         btfsc   WREG,5
  15.         bsf             lcd_b5
  16.         btfsc   WREG,6
  17.         bsf             lcd_b6
  18.         btfsc   WREG,7
  19.         bsf             lcd_b7
  20.         bsf             lcd_EN
  21.  
  22.         bcf             lcd_b4
  23.         bcf             lcd_b5
  24.         bcf             lcd_b6
  25.         bcf             lcd_b7
  26.         bcf             lcd_EN
  27.         btfsc   WREG,0
  28.         bsf             lcd_b4
  29.         btfsc   WREG,1
  30.         bsf             lcd_b5
  31.         btfsc   WREG,2
  32.         bsf             lcd_b6
  33.         btfsc   WREG,3
  34.         bsf             lcd_b7
  35.         bsf             lcd_EN 
  36.         bcf             lcd_EN
  37. RETURN

Tudom hogy kicsit nyakatekert, de működnie kellene szerintem.
(#) Braf válasza Attila86 hozzászólására (») Dec 26, 2009 / 1
 
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.
(#) Attila86 válasza Braf hozzászólására (») Dec 26, 2009 /
 
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.

Muszer1.asm
    
(#) lidi válasza Attila86 hozzászólására (») Dec 26, 2009 /
 
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 ?
(#) Attila86 válasza lidi hozzászólására (») Dec 26, 2009 /
 
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.
(#) Attila86 hozzászólása Dec 26, 2009 /
 
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?
(#) Hp41C válasza Attila86 hozzászólására (») Dec 26, 2009 / 1
 
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
(#) trudnai válasza Braf hozzászólására (») Dec 26, 2009 /
 
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.
(#) Attila86 hozzászólása Dec 26, 2009 /
 
Így tudok az LCD-n címhez ugrani:
  1. movlw   b'00001100'             ;cím
  2.         movwf   LATD
  3.         bsf             LATD,7
  4.         bcf             LATD,7 
  5.         movlw   b'00000010'             ;cím
  6.         movwf   LATD
  7.         bsf             LATD,7
  8.         bcf             LATD,7


Í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.)
  1. movlw   h'42'
  2.  
  3.         bcf             lcd_EN
  4.         bcf             lcd_RS
  5.         bcf             lcd_b4
  6.         bcf             lcd_b5
  7.         bcf             lcd_b6
  8.         bsf             lcd_b7
  9.         btfsc   WREG,4
  10.         bsf             lcd_b4
  11.         btfsc   WREG,5
  12.         bsf             lcd_b5
  13.         btfsc   WREG,6
  14.         bsf             lcd_b6
  15.         call    delay1ms
  16.         bsf             lcd_EN
  17.         call    delay1ms
  18.         bcf             lcd_EN
  19.         bcf             lcd_b4
  20.         bcf             lcd_b5
  21.         bcf             lcd_b6
  22.         bcf             lcd_b7
  23.         btfsc   WREG,0
  24.         bsf             lcd_b4
  25.         btfsc   WREG,1
  26.         bsf             lcd_b5
  27.         btfsc   WREG,2
  28.         bsf             lcd_b6
  29.         btfsc   WREG,3
  30.         bsf             lcd_b7
  31.         call    delay1ms
  32.         bsf             lcd_EN
  33.         call    delay1ms       
  34.         bcf             lcd_EN
(#) Attila86 hozzászólása Dec 26, 2009 /
 
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.
(#) Attila86 hozzászólása Dec 26, 2009 /
 
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)
(#) watt válasza Attila86 hozzászólására (») Dec 26, 2009 /
 
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
(#) Attila86 válasza watt hozzászólására (») Dec 26, 2009 /
 
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...
(#) watt válasza Attila86 hozzászólására (») Dec 26, 2009 /
 
Van hátránya, ha ilyen kicsi valami!
(#) googa hozzászólása Dec 27, 2009 /
 
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
(#) Braf válasza trudnai hozzászólására (») Dec 27, 2009 /
 
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.
(#) potyo válasza googa hozzászólására (») Dec 27, 2009 /
 
Mekkora frekvencián akarod hajtani a PIC-et?
(#) trudnai válasza Braf hozzászólására (») Dec 27, 2009 /
 
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
(#) googa válasza potyo hozzászólására (») Dec 27, 2009 /
 
Most csak 4Mhz.
(#) potyo válasza googa hozzászólására (») Dec 27, 2009 /
 
Mutasd meg a kapcsolási rajzodat mind az 5V-os, mind a 3,3V-os esetét. Illetve az LCD tipusa is jó lenne.
(#) googa válasza potyo hozzászólására (») Dec 27, 2009 /
 
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...

abra.JPG
    
(#) potyo válasza googa hozzászólására (») Dec 27, 2009 /
 
BOR nincs véletlenül bekapcsolva?
(#) googa válasza potyo hozzászólására (») Dec 27, 2009 /
 
Azt mondod, hogy kellene működnie 3,3V módban a PIC-nek rendesen?
(#) potyo válasza googa hozzászólására (») Dec 27, 2009 /
 
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.
(#) googa válasza potyo hozzászólására (») Dec 27, 2009 /
 
...éééééés köszönöm! BOR OFF és már működik is! Hálás köszönet! g.
(#) Attila86 hozzászólása Dec 27, 2009 /
 
A LATA-ra nem tudok kiküldeni semmit. Miért?
Beírom ezt:
  1. movlw   b'00000100'
  2. movwf   LATC
  3. movwf   LATA

É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:
  1. movlw   B'00000000'             ;0-át írunk a W-be
  2.         movwf   TRISA                   ;PORTA minden lába kimenet lesz
  3.         movwf   TRISB                   ;PORTB minden lába kimenet lesz
  4.         movwf   TRISC                   ;PORTC minden lába kimenet lesz
  5.         movwf   TRISD                   ;PORTD minden lába kimenet lesz
Következő: »»   628 / 1320
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem