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 |