Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Sziasztok!
Elolvastam Topi cikkeit (amik nagyon jók ) és böngésztem a pic-em adatlapjait és nekifogtam assemblyben programozni. A problémám az, hogy amikor lefordítanám a programot az MPAsmWin.exe egy/több figyelmeztetést ad (a program hosszától függően), hogy ,,Crossing page boundary-ensure page bits are set"). Ez mit jelent? Mit lehet kezdeni vele? (Ha rövidebb a program, semmi bajom sincs vele) A PIC egy menürendszert jelenít meg egy 2x16-os LCD-n (hőmérő-óra-újraindítás-kikapcsolás), és előtte bekér egy jelszót. Minden tökéletesen működött, amíg be nem illesztettem az óra beállítását lehetővé tevő programrészeket, ezáltal a program nagysága felcsúszott 2500-2600 sorra, és miután beégetem a PIC kiír pár betűt a kijelzőre és nem csinál semmit. (Sztem nem az órabeállítós résszel van a baj, azt csak a menüből lehetne meghívni) Én úgy sejtem az a baj, hogy túllépek a programmemóriában egy határt, amikor ,,tovább kell lapozni", csak nem tudom, hogyan kell. Segítségeteket előre is köszönöm! (gyári PicKit2-t használok, és egy 16F887-et)
Sziasztok!
Tudnátok segíteni? Ha egy rutin hívás után az áll hogy GOTO $-2 ez annyit jelent hogy csak akkor fut tovább a program ha a rutin 2 X lefutott?
A gond eredete az, hogy a programmemória címzéséhez a CALL és GOTO utasításokban csak 11 bit áll rendelkezésre, ezért az egész programmemóriaterület fel van osztva 2kB-os lapokra. Amikor pl. a nulladik lapról az egyes lapra akarsz ugorni egy GOTO-val, akkor előtte a PCLATH regiszter 4:3 bitjeihez be kell írni a 01 kombinációt. Ugyanígy ha CALL-al akarsz pl. a kettes lapra menni, akkor az 10 kombináció kell a fenti két helyre. Ha nagy a program, akkor legjobb valamilyen módon a programot 2-3-4 blokkra osztani, és ORG-al fixen laphatárra igazítani az egyes blokkokat. A blokkok közötti ugrálást pedig a legkevesebb helyen csinálni, hogy a hibalehetőségek számát csökkentsd. Nézd meg az adatlapban a programmemória felépítését, és a GOTO és CALL utasítások részletes ismertetőjét.
Idézet: „GOTO $-2 ez annyit jelent hogy csak akkor fut tovább a program ha a rutin 2 X lefutott?” Nem. A $ jel az aktuális programcímet jelenti, a $-2 pedig a kettővel kisebb címet jelenti, tehát visszaugrik a program. Mindezt addig csinálja (akár végtelen ciklus is lehet belőle...) amíg egy feltételes ugróutasítással ki nem kerülöd a GOTO $-2 utasítást. A program tehát akkor fut tovább, ha teljesül valamilyen vizsgált feltétel.
Nézd meg a disassembly ablakban, hogy pontosan mit tett a $-2 helyére a fordító!
Köszönöm, most már értem. Ezt egy programban láttam ami kezel egy nyomógombot. A hívott rutin egy prellmentesítés , utána van egy feltétel (BTFSC) , azután a GOTO $-2 (tehát vissza 2 sorral amig a nyomógombot nyomják. Tovább ugrik ha elengedik...)
Köszönöm a segítséget.
011 CALL 0x5f
012 BTFSC 0x6, 0x3 013 GOTO 0x11 Köszi
Ha adhatok egy tanácsot, ne tanuld el ezt a megoldást, mert igen gány módja a programozásnak(szerintem). Szépen fel kell címkézni, és úgy ugrálni.
Annak hogy sokminden van itt, nagyon kell örüljél, mert amikor én kezdtem úgy kellett összevadászni a dolgokat, most meg minden mennyiségben itt van ami kell! Igaz kicsit válogatni kell, de már kaptál jó ajánlásokat. Nézz fel az oldalamra ott is találsz egy linkgyűjteményt.
De ismét azt kell mondanom neked, hogy meg kell add neki azt az időt, ami megjár! Nem fog gyorsabban menni, abba pedig belefér, a nyugodt olvasgatás, a lényeg megértése, leülepedése, míg összeáll a kép. Mikor már lesznek saját ötleteid, akkor érdemes a hardver után gondolkodni, mert már tudni fogod melyik kell neked. Egyébként a PICKit2 egy jó választás... És Köszönöm, hogy megtiszteltél minket emberhez illő mondatszerkesztéssel! Van aki megsértődik, van aki nem. Ez is inteligencia kérdése!
Eltanulni...? Örülök hogy végre megtudtam mit jelent, és hogyan kell használni, ha nem is jó megoldás. A cimkézésre van valami példa? Az hogyan néz ki?
Pl.
Persze értelme nincs, csak látod rajta a cimkézést.
Ja, teljesen h..lye vagyok..Ez a cimkézés. Én így szoktam csinálni, ez a "$-X " dolog viszont új volt nekem mert eddig nem láttam. (vagy nem vettem észre...)
köszi
Most jutott eszembe, hogy van erre két makró az MPASM-ben. A LCALL és a LGOTO. Ha ezeket használod, akkor nem kell kézzel állítanod a PCLATH bitjeit, hanem a fordító megcsinálja. Viszont ezek makrók, két BSF/BCF és egy CALL/GOTO utasítást tesz a helyükre a fordító, tehát nem írhatsz olyant, hogy
mert akkor csak az első BSF/BCF utasítást ugorná át. Helyett csinálhatod pl. így
Ehhez kapcsolódva, kicsit zavaró, hogy a 18F-eknél ez már nem makró, hanem utasítás! Igazán megkülönböztethették volna! Na mindegy!
Idézet: „Eltanulni...?” Gondoltam, hátha megtetszik, hogy ez milyen egyszerűnek látszik és használni fogod. Aztán egyszer, amikor belenézel a saját kódodba, és tele lesz GOTO $-5 és hasonló számokkal, átkozni fogod a percet!
Ezzel azért vitatkoznék, mert az ésszerűség határain belül alkalmazható (elvégre ezért találták ki!). Pl. egy GOTO $-1, vagy GOTO $-2 sokkal áttekinthetőbb, mint egy fölösleges cimkékkel teletűzdelt kód (pláne, ha rossz divatként a cimkét is külön sorba írod).
A GOTO $-5 már már határeset, a még nagyobb számok használata pedig nyilvánvaló, hogy agyonvágja az áttekinthetőséget (és növeli a hibalehetőségeket!).
Ezzel én is egyetértek, egy-két sorig szerintem is nagyon jól használható!
Steve
Noigen, csak azt ne felejtsd el, hogy ha a "goto $-2" típusú ciklusba egy utasítást beszúrsz, akkor már "goto $-3"-at kell írnod, illetve ha véletlenül pl. egy makró odakerül (akár egy banksel), akkor az már nem egy utasítás! Én inkább írok címkét, minthogy egy ilyenen esetleg elcsússzon később a kódom.
Ízlések és pofonok. Nekem nem tetszik, és nem is használom. A külön soros címke pedig jobban áttekinthetővé teszi a kódot(nekem).
Próbálkoztam még a 877 es döggel, sajnos sehogy nem akar működni. winpic be a lódhoz végig nullákat írtam, azt hajlandó volt beégetni, de semmi értelmeset.
Törölni törli de a nullák nem tűnnek el a következő olvasásnál u. az bennemarad. A 877 es nem olyan, hogy ha valamelyik port el is száll, a többi működik? Csak a pwm et próbáltam ki benne, egy ledet szabályoztam egy potival. Ez csak nem akkora bűn?
Tettél a LED elé ellenállást?
Idézet: „Törölni törli de a nullák nem tűnnek el a következő olvasásnál u. az bennemarad.” Azaz nem törli! Ha törölné, akkor 3FFF lenne benne. Ha beégeti a nullákat, akkor az jónak mondható... Idézet: „pláne, ha rossz divatként a cimkét is külön sorba írod” Velemenyem szerint ez nem divat es meg csak nem is rossz. Ez egy szoftverfejlesztesi stilus. Emogott ket dolog bujik meg: 1. A cimke hossza nem hatarozza meg az utasitasok indentjet 2. Ha a cimke utan kozvetlenul kell egy utasitast beszurni akkor nem kell bajlodni tordelesekkel
Nekem volt olyan is, hogy a címke után írt parancsot nem volt képes lefordítani a fordító.
Én is jártam így a cimkével és azóta írom mindig másik sorba az utasítást! Ha esetleg valami hibás beállítás miatt van, akkor szóljatok, de én nem vettem észre semmit!
A ' GOTO $-1' pedig szerintem jobban látható egy-két sorra vonatkoztatva, mint ha cimkézne az ember ( tipikusan egy-egy bit tesztelésénél vagy késleltetésnél szoktam alkalmazni); ha véletlenül még valamit be kell szúrni, akkor jön a cimke! Steve
Mondjuk én az ilyen
tipusú dolgokat sem tartom követendő példának, mert megfogja a program futását addig, amíg be nem következik az esemény, közben meg lehet, hogy valamire reagálni kellene.
Egyetértek. Ide egy időtúllépést jelző flag vizsgálata is kellhet még, ami egy Timer megszakításban állítódik be, ha letelik az idő. Ennek hatására kilép a végtelen ciklusból, ha nem történne meg, amire várunk.
Esetleg egy egyszerű várakozás is megfelel, ha éppen nincs más feladat közben, bár a fontosakat megszakításban ki lehet szolgálni, csak közben nehogy lemaradjunk az eseményről! Szép dolgok ezek!
Sziasztok!
PIC - el szeretnék csinálni egy nagyon egyszerű hőmérőt. Csak annyi lenne a lényeg hogy a hőmérséklettel arányos bináris szám legyen a PIC egyik regiszterébe. Szabályzásra szeretném használni. PL. ha meghalad egy bizonyos hőmérsékletet a PIC végez egy szabályzást (mondjuk fűtést kikapcsol.) Ezzel a résszel nincs gond csak annyi kéne hogy mit használjak hőmérsékletérzékelőnek, hogyan kössem össze a PIC - el. Rajz is nagyon hasznos lenne illetve a programot hogyan írjam meg? (mármint ezt a részét?) |
Bejelentkezés
Hirdetés |