| Fórum témák 
 
 » Több friss téma | Fórum » PIC - Miértek, hogyanok haladóknak 
				Hát ezt nem értem... és hova jön a "da" sor?						 Idézet: „De nekem tudnom kellene a legelső és a legutolsó érték címét hogy az FSR0 mutatót rá tudjam állítani.” Tulajdonképpen melyik memóriába akarsz írni? Mert ha a programmemóriába rakod az adatokat, akkor nem az FSR0 fogja megcímezni, hanem a TBLPTR Bővebben: Link A címét pedig tudni fogod, ha címkét teszel elé és utána. 
				Akkor nem a programmemóriába, hanem az adatmemóriába kellene tenni a táblát. A lényeg hogy az FSR0-ával rá tudjak mutatni minden elemére. Idézet: „A címét pedig tudni fogod, ha címkét teszel elé és utána.” Címkét magába a programkódba szokás tenni, nem!? Idézet:Majd az orosz nyelvű kiadásba?  :hide: „és hova jön a "da" sor?” 
				Bocsanat, hogy bele szolok, de abszolut modban inkabb igy lenne szep: 
 De szerintem az OP konstans tablazatrol szolt, tehat az eredeti uzeneted volt ide valo a cimkekkel es a TBLPTR-el... 
				Van kezdőérték, vagy nincs kezdőérték? Ha van kezdőérték, akkor a programmemóriából kel elővenni  a program eleji inicializálásnál (ahogy a korábban belinkelt példában mutattam). Ha nincs kezdőérték, akkor meg nem kell "DA". 
				Ha egy címkét teszel bárhová a programba, arra lehet hivatkozni, és pont azt a címet fogja visszaadni ahol áll. A tömb elejére, közepére, bárhová tehetsz címkét, tudni fogod az elem címét ami elé tetted. Csatoltam egy képet... (16F628)						 
				Van kezdőérték. Gyakorlatilag 100db konstanst szeretnék tárolni, amiből majd a PIC dolgozik.						 
				Akkor mit akarsz az FSR0-val, ha konstansok kellenek? Neked így kell megadni a táblázatot: 
 Lehet, hogy a NOP nemis kell, nem próbáltam. Az elérés pedig: 
 Vagy pedig a KEZDET konstanshoz hozzáadod, hogy hanyadik elem kellene, és az eredményt teszed a TBLPTRx regiszterekbe. A táblázat utolsó eleme: 
 A TBLRD utasítás hatására a TABLAT regiszterbe kerül a megcímzett terület tartalma. Nézd meg a TBLRD utasítást, mert van belőle többféle verzió automatikus címnövelés/csökkentésre. Ha nincs a chipben 64k feletti kódmemória, akkor a TBLPTRU kihagyható. 
				Szia! Idézet:Ez az utasítás nem azt fogja csinálni, amit szeretnél ... Sajnos ki kell írni: „MOVFF LOW(KEZDET), TBLPTRL” movlw low(KEZDET) movwf TBLPTRL stb... Az indexelésnél még az átviltelre is figyelni kell - vagy ügyes helyre kell tenni a táblát. Idézet: „Ha nincs a chipben 64k feletti kódmemória, akkor a TBLPTRU kihagyható.” És nem olvasod a config vagy az id területet... 
				Köszönöm, most már sokkal világosabb! Még egy kérdés: Honnan tudhatom azt meg, hogy a tábla végére értem-e már? A TBLPTRU, TBLPTRH, TBLPTRL regisztereket kellene összehasonlítani a VEGE cimke U, H és L regisztereivel?						 Idézet:Igazad van... „Ez az utasítás nem azt fogja csinálni, amit szeretnél ... Sajnos ki kell írni:”   Idézet:Jelen esetre gondoltam, itt meg ugye nem az a cél. „És nem olvasod a config vagy az id területet..” 
				Vagy így, vagy pedig ha a tábla elejéről olvasol folyamatosan, akkor akár egy másik segédváltozót növelsz, és ha az elérte a VEGE-KEZDET-1 értéket, akkor értél az utolsó elemhez.						 
				Na megyeget a tábla... De nem jó. A 100db konstans 0-tól megy felfele kb ötösével: 0,5,10,15,20,25 stb. 135-ig ki is olvassa, tehát kb a 26. konstansig. Aztán valami teljesen más értéket olvas ki a táblából, noha a TBLPTR értéke csak egyel nőtt továbbra is. Olyan, mintha a "da" direktíva után írt decimális konstansokat a programmemóriában nem egy helyre és szépen sorban pakolta volna le.  Itt van az asm. Csak a megszakítást nézzétek, a főprogram nem lényeges és az jól is működik (egy ötcsatornás szoftveres PWM generátor). Ha a "hi_isr" cimke után betesztek egy töréspontot a szimulátorban, majd 27-szer engeditek futni a Run gombbal miközben a watch ablakban nézitek a TBLPTR illetve a LED_1_fényerő regiszterek értékét, akkor láthatjátok hogy a 27. vagy 28. töréspontba lépéskor már nem 5-el növekszik a LED_1_fényerő regiszter értéke...   
				Szia! Az a fránya 18F assembler....  Csak akkor csinálja jól, ha páros számú byte van egy sorban, különben az utolsóhoz hozzácsap egy 0 -t és egész szót tesz a memóriába.... 
				Szia!  Ööööö... minek kell párosnak lennie?   
				Szia! Törd el a sor 10 db adat legyen minden sorban - szépen leteszi sorban a memóriába... Egy assembly sorban megadott byte-ok számának párosnak kell lenni ahhoz, hogy sorban egymás után legyenek az adatok a memóriában. Miért nem használod a mullw 0x05 utasítást ? Lényegesen kisebb helyen elférne... Ha a megszakítási rutinban is használod, a PRODL és PRODH regisztereket is menteni kell. Idézet: „Törd el a sor 10 db adat legyen minden sorban - szépen leteszi sorban a memóriába...” Próbáltam, de akkor errort ír rá... Idézet: „Miért nem használod a mullw 0x05 utasítást ?” Mert nem feltétlen mindig 5-ösével kell majd növekednie, a tábla most csak egy próba erejéig van így. 
				Minden sor elé írj de-t: 
 
				Nincs kéznél szimulátor, de mennyi ezeknél az eseteknél a TLBPTR értéke? Meg a View->Program memory alatt mi látszik a programmemóriában ezeken a helyeken (vigyázz, ott kettesével emelkedik soronként a cím)?						 
				1. Amikor belépsz a programmegszakításba, akkor nem feltételezhető, hogy a táblamutató ugyanott áll, ahol az előző megszakításnál volt.  2. A 16 kbájtos mikrovezérlőben fölösleges 24 bites címekkel bajlódni 
				Szia! Olvasd el a táblázatod, kimaradt az 55, a 105, 200 visszafelé a 135, 10 
				És 100 elemű tömbnél a TBLPTRH -t sem kell figyelni... Egy mullw 0x05 és egy feltételes kivonás megteszi az egészet...						 
				Szia! A high_isr kilépésénél használd a retfie fast utasítást... 
				A főprogram nem nyúl hozzá a táblamutatóhoz.						 
				A TLBPTR értéke 128-tól felfelé növekszik. Tehát a görbe címke a 128-on van. A Program memory ablakban egyenlőre nem sikerült kiismernem maga, máris nekiesek még egyszer...						 
				Na...     A retfie-t átírtam retfie fast-ra, a táblámat pedig átírtam hogy ne egy sorban legyen az összes és máris hibátlanul működik a program.   | Bejelentkezés Hirdetés | 






 
  
						