Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   856 / 1320
(#) vilmosd válasza messer hozzászólására (») Dec 9, 2010 /
 
(#) bbalazs_ válasza messer hozzászólására (») Dec 9, 2010 /
 
Beágyazott.
(#) The_Saint hozzászólása Dec 10, 2010 /
 
Sziasztok, segítséget szeretnék kérni. Biztosan már többen találkoztatok a problémával...Íme:
Általában 16F876A-t használok. A megírt program hossz még nem lépi túl a bankhatárt, sőt meg sem közelíti. A programban van kb. 25 szubrutin, rövidebbek, hosszabbak. Egy karakteres kijelzőt kezelgetne sok egyéb mellett. Van hogy a tökéletesen működik, de van hogy nem. Ilyenkor simán a szubrutinok sorrendjének a megváltoztatása megoldja a problémát. Ha nem az első átrendezés, akkor a második. Nem a végrehajtás sorrendjét változtatom, hanem egyszerűen a szerkesztőben elfoglalt helyét. A hibás működés úgy jelentkezik, hogy a kijelzőn mindenféle karakter kezd el rohangálni. Eddig megoldottam az átrendezéssel, de most már kezd idegesíteni, hogy nem tudom, hogy mi történik...Előre is köszi a hozzászólásokat! Üdv! The_Saint
(#) icserny válasza messer hozzászólására (») Dec 10, 2010 / 1
 
Idézet:
„NSTDIS: Interrupt Nesting Disable bit”

Itt érdemes nézelődni: Angol-magyar informatikai szótár

A nesting interrupt hasonló, mint a nesting loop (egymásba ágyazott ciklusok), mivel a magasabb prioritású megszakítás kiszolgálása "beleágyazódik" az alacsonyabb prioritású megszakítás kiszolgálásába.

Ez a beágyazódás azonban letiltható az INTCON regiszter NSTDIS bitjének '1'-be állításával. Az interruptok egymásba ágyazásának letiltásakor minden felhasználói interrupt 7-es prioritásszinten fut, ami megakadályozza, hogy bármilyen további felhasználói interrupt érvényesülhessen, mielőtt az aktuális megszakítás kiszolgálása befejeződik. Ezen kívül IPL<2:0> csak olvasható válik (nem módosítható a futási prioritásszint), s az interrupt prioritások csak arra szolgálnak, hogy az egyidejű kérelmek érvényesülési sorrendjét megszabják.
(#) messer válasza icserny hozzászólására (») Dec 10, 2010 /
 
Köszönöm nektek.
(#) Ideiglenes válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
A regiszterbankok kezelését és a lapváltásokat érdemes átnézned és sűrűn használgatni a banksel makrót. Ha kísérletezős kedvű vagy, akkor az egyes szubrutinok elé szúrd be az org xxxxh sort, természetesen az xxxx helyére egy-egy önálló memóriacím kerüljön. Érdemes még megnézni a fordítás végén kapott .map fájlt, mert abból kiderülhet, hogy esetleg a programoddal átlépted az első memórialapot a programtárban. Ilyenkor már illene használni a pagesel makrót is. Ha van a programodban indirekt regiszterhasználat, akkor még a bankisel makrót is előveheted.
Kb. ennyit láttatlanban. Az biztos, hogy a hiba ki fog derülni, ha foglalkozol a problémával.
(#) Hp41C válasza The_Saint hozzászólására (») Dec 10, 2010 / 1
 
Szia!

A programodban szerepel a "movf PCL" vagy az "addwf PCL,f" , azaz a programszámlálót módosító kiszámított ugrás. Az ugrás egy táblázat (lista) elemeire ugrik, ennek a listának az elhelyezkedésével van a gond. Az egész táblázatnak egy 256 utasítás blokkban kell lennie, azaz a kezdőcím és a végcím felső byte-jának meg kell egyeznie - Ha nem egyezne meg, akkor a PCLATH regiszteri is kezelni kellene az ugrás címének kiszámításakor...

  1. Table:
  2.  retlw 0x00
  3. ...
  4.  retlw 0x0f
  5. EndTable:
  6.  
  7. if high(Table) != high(EndTable)
  8.   error ("Table error")
  9. endif
(#) watt válasza Hp41C hozzászólására (») Dec 10, 2010 /
 
Idézet:
„A programodban szerepel a "movf PCL" vagy az "addwf PCL,f" , azaz a programszámlálót módosító kiszámított ugrás.”

Ezt honnan tudtad? Így könnyű!
(#) watt válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Idézet:
„A megírt program hossz még nem lépi túl a bankhatárt”

Csak szeretnélek kigazítani, mert nem a bankhatárról beszélsz, illetve a válaszokban sem arról esik szó, mert a bankok a RAM memóriához tartoznak, a programod a laphatárokat nem lépi át! (PAGESEL)
Ha netán tényleg van a programodban táblázat, akkor a laphatárokkal van gondod. A megoldást Hp41C segítsége jelzi.
(#) The_Saint válasza Hp41C hozzászólására (») Dec 10, 2010 /
 
Sziasztok! Köszönöm a válaszokat mindenkinek!
Igen, szerepel az "addwf PCL,f", de elég rövid táblázatokról van szó. Egyszerre max 16 karakter. Ja és igen elírtam laphatárra gondoltam
Ime egy részlet, a teljesség igénye nélkül:
  1. init_text_table
  2.     MOVLW       HIGH(init_text_table)
  3.     MOVWF       PCLATH
  4.     movf                count,w
  5.     addwf               PCL,f
  6.     retlw               0x49
  7.     ....
  8.     retlw            0x00


általában így néz ki egy táblázat, de max. 16 értékkel. Sajnos még mindig nem értem, hogy az átrendezés miért oldja meg a problémát.
A PicKIT ben a beírásra szánt hex vége (remélem jól jelenik meg ):
  1. [b]06F0[/b]             204C    01A3    1406    0823    2669    3A00    1903    2EFC
  2. [b]06F8[/b]     00A1    204C    0AA3    2EF3    11BB    123B    0008    3FFF
  3. [b]0700[/b]     3FFF            3FFF            3FFF            3FFF            3FFF    3FFF            3FFF            3FFF


A leírásból azt olvastam ki, hogy 0800H-nál kezdődik a második lap... vagy nem jól értelmezek valamit?

Hp41C, köszi a kis részletet, de a C nem az erősségem...többnyire asm-ben írogatok. Bár értem, hogy mit írtál...

Üdv
The_Saint
(#) The_Saint válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Huuu... ez elég összevissza lett, de mind1, alán érthető....
(#) Hp41C válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Szia!

A félreértések elkerülése érdekében megemlíteném, hogy az idézett részlet assembly környezethez illeszkedik. Azok a furcsa (if, endif, error) kulcsszavak az MPASM direktívái. Ha a részt beleteszed a programodba (minden táblázathoz - természetesen átírva), és a változtatások miatt a táblázataid (akármilyen rövidek is) a 256 utasítás blokk határt átlépnék, a fordítás hibára futna. A hibajelzére kattintva, a hiba helyére lehet ugrani a forrásban...

Az error sorba nem kellenek a zárójelek - Elnézést elírtam..
(#) Hp41C válasza watt hozzászólására (») Dec 10, 2010 /
 
Nem ismertem a kérdéses programot...
Mi másért lenne jó az egyik sorrendben és hibásan lefutó egy másik sorrendben a program? A különböző lapokon definiált címkék keveréséből származó hibát a kérdés kizárta.
(#) icserny válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Idézet:
„A leírásból azt olvastam ki, hogy 0800H-nál kezdődik a második lap... vagy nem jól értelmezek valamit?”
Bizony nem, mert a PCL csak 8 bites, tehát annak minden túlcsordulása PCLATH módosítását igényelné (ennek hiányában rossz helyre ugrik a program).
(#) The_Saint válasza Hp41C hozzászólására (») Dec 10, 2010 /
 
Huu...köszi, ezt eddig nem tudtam. De tényleg! Így mindjárt más! Tényleg köszi!
Utoljára a TurboPascal-ban találkoztam a "furcsa" kulcsszavakkal, meg talán pár éve php-ben
Annyira mélységeiben nem ismerem az MPASM lehetőségeit.... gondolom meglepődnék, mi mindent tud még...
(#) The_Saint válasza icserny hozzászólására (») Dec 10, 2010 /
 
Szia,
ezt kifejtenéd bővebben? Tehát az ugrás nem lehet messzebb mint 8 bit? Tehát ha a call pl. 0x100H on van és ha a cél 0x0208 on akkor ez hibát okoz? Vagy még mindig nagyon messze járok?
Üdv
The_Saint
(#) icserny válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Én az alábbi struktúrákról beszéltem:
  1. movf                count,w
  2.    addwf               PCL,f
(lásd ezt a beírásodat!)

A CALL/GOTO utasításnál egészen más a helyzet, ott van a 2K-s laphatár.
(#) erdoszoli válasza icserny hozzászólására (») Dec 10, 2010 /
 
Szia
átnéztem a programod és a meglévő programohoz sok helyen kéne belenyulnom, énmeg ugye lusta vagyok . Annyit sikerült elérnem hogy közvetlenül olvasás előtt és után állítgatom a CREN bitet és egy tömbbe olvasom a bejövő adatokat. Viszont ami nem megy (illetve megy csak nem ugy ahogy szeretném .. ) az a putch , és putst fv-ek. Elvileg az egy alapfüggvény nem? Michrochip honlapon található samplek között találtam egy progit amivel a soros portos kommunikációt nyomon követem, Terminal v1.9b a neve ha valakinek ismerős. Namost a transmit és recive ablakban szépen ugyanazt látom, tehát amit elküldök a PICnek az vissza is jön, és a pic fogadja is mert szépen eltárolja és dolgozik vele, de pl válaszüzenetet nem látok egyik ablakban sem. Még a sima putch() fv-t se nemhogy valami karaktersorozatból álló szöveget (putst...). Elvileg a serial jol van inicializálva. A program rosz vagy a PIC nem kezeli tul jol ezeket a fv-eket?
(#) The_Saint válasza icserny hozzászólására (») Dec 10, 2010 /
 
Ok, kezd összeállni a kép

Tehát ha PCL éppen mondjuk 253, én meg pont a 10. karaktert akarnám beolvasni, akkor túlcsordul, mert ugye 253+10...az sok.

Idézet:
„minden túlcsordulása PCLATH módosítását igényelné (ennek hiányában rossz helyre ugrik a program).”


ebben segíts még kérlek, ezt hogy kell csinálni? Előre is köszi!
....
hm... és mi lesz a visszatérésnél? Hhhh.... lettem volna inkább a halászok detektívje!!
(#) icserny válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Ebben a hozzászólásban már megkaptad a segítséget. Ha használod azokat a direktívákat minden táblázatnál, akkor a fordító visítani fog, ha rossz helyre került a táblázatod.
(#) icserny válasza erdoszoli hozzászólására (») Dec 10, 2010 /
 
Idézet:
„a meglévő programohoz sok helyen kéne belenyulnom, énmeg ugye lusta vagyok.”
Én legaláb annyira lusta vagyok, tehát ha a saját fejed után mégy, akkor magadra leszel utalva.

Idézet:
„Viszont ami nem megy ... az a putch , és putst fv-ek. Elvileg az egy alapfüggvény nem?”

Nem. Bizonyos könyvtári függvényeid lesznek stdio.h és a p18f2420.lib becsatolása után, de abban nem tudok ilyen nevűeket. Van viszont putc() és puts() nevű. Ezek csak akkor fognak értelmes dolgot csinálni, ha vagy fölüldefiniálod az _usart_putc() függvényt (én ezt teszem...), vagy a nem interruptos gyári Open1USART() függvénnyel kell megnyitni a soros portot.

A "gyári" függvények között nincsen getc() függvény, helyette Read1USART()-tal és gets1USART()-tal lehet próbálkozni.
(#) Hp41C válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Szia!

A tálbázat címének felső byte-ját töltsd be a PCLATH regiszterbe, eztán az alsó byte és a index összeadásának eredményét a W -be képezd, ha túlcsordulás keletkezik, növeld a PCLATH értékét. Ezután a W -t beírhatod a PCL-be.

Ha az index is hosszabb 8 bitnél, akkor az index felső byte-ját és a táblázat címének felső byte-jának összegét töltsd be a PCLATH regiszterbe. A többi lépés nem változik.

A visszatérés nem gond, a belső stack mind a 13 bitre emlékszik, onnan az egész cím kerül át a programszámlálóba.
(#) erdoszoli válasza icserny hozzászólására (») Dec 10, 2010 /
 
Jó annyira nem vagyok lusta Nagyon szivesen veszem a segitséget és nem várom el h megcsinálják helyettem.Lehet könyebb lesz ha leirok pár sort a programbol
Tehát :
void init_comms(void)
{
INTCONbits.INT0IE = 0;
INTCONbits.RBIE = 0;
INTCONbits.GIEH=1;
INTCONbits.GIEL=1;
INTCON2bits.RBPU = 0;
RCONbits.IPEN = 0;
SPBRG = 31;
TXSTA = 0x26;
RCSTA = 0x90;
DDRCbits.RC6=0;
DDRCbits.RC7=1;
}

Putch és getch fv-ek is elővadászva:
void putch(unsigned char byte)
{
/* output one byte */
while(!TXSTAbits.TRMT) /* set whilst TX in progress */
continue;
TXREG = byte;
}

unsigned char getch() {
/* retrieve one byte */
while(!PIR1bits.RCIF) /* set when register is not empty */
continue;
return RCREG;
}

void putst(register const char *str)
{
while((*str)!=0)
{
putch(*str);
if (*str==13) putch(10);
if (*str==10) putch(13);
str++;
}
}

Ez a putst pedig elvileg szöveg kiirásra van . Namost ha én ezekbe a kis rutinokba egy ledvisszajelzést is rakok akkor látni hogy valami történt szoval meghivja a főprogram őket, és az adatvétellel nincs is gondja a PICnek , szépen sikerül letárolni és feldolgozni , de ha már valamit küldenék akkor a használt progi nem nagyon jelzi ezt nekem, se hyperterminal se más. Lehet nem a TRMT bitre kéne figyelni a TXREG feltöltés előtt?
(#) icserny válasza erdoszoli hozzászólására (») Dec 10, 2010 /
 
Küldés engedélyezéséhez az alábbi beállításokra van szükség (a baudrate beállításán kívül):
• bit SPEN (RCSTA<7>) must be set (= 1)
• bit TXEN (TXSTA<5>) must be set (= 1)
• bit TRISC<7> must be set (= 1)
bit TRISC<6> must be set (= 1)

Ha a program túljut a while(!TXSTAbits.TRMT); feltételen (nem kell oda continue, csak pontosvessző!), akkor a PICkit2 logikai analizátor módjában megnézheted, hogy a TXREG = byte; hatására kimegy-e az impulzussorozat.
(#) erdoszoli válasza icserny hozzászólására (») Dec 10, 2010 /
 
Ezek is megvannak az IO_init-ben , mármint a port beállitás.
A pickites analizálást reggelt tudom meglesni de köszönöm a tippet.
Addig elméleti gondolkodás megy tovább
(#) trudnai válasza The_Saint hozzászólására (») Dec 10, 2010 /
 
Hp41C-t kiegeszitve: Ugy kell tekinteni mint egy 16 bites aritmetikat, ahol a felso 8 bit a PCLATH-ba kerul, mig az also a PCL-be. Csupan arra kell figyelned, hogy mikor a PCL-be toltod az erteket akkor a program szamlalo azonnal frissul a PCLATH es PCL ertekekkel, igy annak kell a leges-legutolso muveletnek lennie! (Magyaran, hogy elkeruld az ido elotti, rossz cimre torteno ugrast...)
(#) LAC001 hozzászólása Dec 10, 2010 /
 
Sziasztok!
Csinálok egy külső-belső hőmérsékletet mérő ketyerét. A problémám a következő lenne, hogy az LM35-ös hőmérő IC kimenete feszültség, ezt kötöttem az PIC18F45K20 A/D bemenetére. Pozitív hőmérsékletnél csodálatosan működik, viszont negatív hőmérsékletnél, negatív feszültség a kimenet. Próbálkoztam, hogy -5V-ot adok a -Vref lábnak, de azzal nem működött, így arra gondoltam, hogy 0,5V-al megemelném a jeladó kimeneti jelét és akkor a PIC nem kap soha negatív feszt, csak pozitívat azt meg tudja mérni gond nélkül. A tanácsotokat kérném, hogy milyen konkrét áramköri megoldással oldanátok meg a +500mV-al való emelést?
Köszi!
LAC
(#) vilmosd válasza LAC001 hozzászólására (») Dec 10, 2010 /
 
Hali
MCP9700 a megoldas. 0 C-nel 500 mV a kimenete.
Csa Vili
Ja es 2.56V Vref.
(#) The_Saint válasza Hp41C hozzászólására (») Dec 10, 2010 /
 
Köszönöm mindenkinek a segítséget...megküzdök vele

Üdv
The_Saint
(#) Hp41C válasza LAC001 hozzászólására (») Dec 10, 2010 /
 
Szia!

Az adatlapon a figure 7. szerint...

P_Istvánnak: Egyszerre írtuk, majd egzszerre töröltük...
Következő: »»   856 / 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