- Hibás kód!!!
- 1 adcon0 ! ( select channel 0, enable ADC )
- $0e adcon1 ! ( Vref=Vdd,Vss onla AN0 is analog )
- $b6 adcon2 ! ( Right justified, 16TAD, Fosc/64 )
Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Sziasztok!
Valaki tudna nekem egy olyan programrészletet küldeni melyben van SLEEP és ebből hogyan ébred fel a kontroller(PIC16F690-esem van)??Vagy programkóddal és kommentekkel elmagyarázni az egész lényegét.. Köszi
Hali!
Tudja valaki hogy miért nem veszi figyelembe Mpalb Sim-je a breakpoint-okat? Simán átgázol rajta. Anno használtam a 8.14-et. Működött. Aztán néztem hogy javítottak 8.15--re amiben az ECAN regisztereken sokat faragtak (anno jeleztem nekik). Erre a fenti problémát csinálja ICD2-vel. Na vissza 8.14-re. Ezzel is. Aztán ICD2 mindkét verzióban kikapcsol, és a SIM se veszi fogyelembe a breakpoint-okat... Mi lehet? Idézet: „A tabla olvasas igy ebben a formaban nem jo, mivel csak akkor mukodik ha a tablazat nem esik laphatarra.” Azt,hogy egy adott kontrollerben,jelen esetben nálam 18F452-ben hol vannak a laphatárok azt honnan tudom meg?Az rendben hogy 32768 byte a program memória,tehát 16384 word,de hány részre van osztva?Tehát milyen címen kell elhelyeznem a táblázatomat hogy jó legyen?(34bytes-os a táblázatom.) Adatlapot már néztem többször is de nem találtam meg. köszi üdv
A 18F-eken nincs laphatár. A táblázatokat sem RETLW-vel kell megoldani, hanem a táblakezelő utasításokkal.
Ha a MOVWF PCL és hasonló utasításokkal megvalósított táblázatolvasást nézed, akkor az azt jelenti, hogy minden 256. byte új "lapra" esik, azaz kell foglalkozni a PCLATH regiszterrel is (sőt, ha kellően nagy a flash, akkor ott még a PCLATU-val is). De mivel a 18F-ben léteznek a táblázatkezelő utasítások, ezt így nem szoktuk ott használni. Esetleg akkor van létjogosultsága, ha egy kész progit migrálunk 16F-ről 18F-re és nem akarjuk az egész, 16F-en már belőtt táblázatkezelést átírni (de a PCLATH-val 16F-en is kell foglalkozni).
Akkor jó.Egyébként nem RETLW-vel csinálom hanem a táblázatkezelő utasításokkal.
Az adatlap 14.6.1 alfejezete elmagyarázza. Elég sok lehetőséget sorol fel a felébresztésre. Konkrétan kérdezz: ezek közül melyik kellene, vagy mi nem világos az ott leírtakban?
Szia!
nekem egy olyan kellene, amit már Potyo megírt,h. elméletben hogyan kellene,ami a kontrollert sleep állapotba juttatja és olyan 10 perc múlva felébreszti, de sajnos nem tudom lekódolni "Pl. lehet úgy, hogy a Timer1 külső oszcillátorát engedélyezed, teszel rá egy 32,768kHz-es kvarcot 4-es prescalerrel, és a kontrollert meg SLEEP-be küldöd. Amikor a Timer túlcsordult, akkor felébreszti a kontrollert, ekkor egy változó tartalmát megnöveled egyel, és ismét SLEEP. Ezzel 8 másodpercenként ébred fel néhány us időre. Amikor a változód elért 75-re, akkor telt le a 10 perc, nullázod a változót, és megcsinálod, amit kell. Ezután kezdődik előlről." Idézet: „Azt,hogy egy adott kontrollerben,jelen esetben nálam 18F452-ben hol vannak a laphatárok azt honnan tudom meg?Az rendben hogy 32768 byte a program memória,tehát 16384 word,de hány részre van osztva?Tehát milyen címen kell elhelyeznem a táblázatomat hogy jó legyen?(34bytes-os a táblázatom.)” Az adatlapon a "Computed Goto" foglalkozik a kerdessel... Arrol van szo, hogy a memoria cimzes ezeknel 20 bites, igy sem 8 sem 16 biten nem fer el a teljes cim - elmeletben, gyakorlatilag mivel csak 32kB a RAM ezert 16 biten leirhato... Az architektura ugye 8 bites, igy a teljes PC-hez (Program Counter) nem fersz hozza, csak a PCL (PC Low) regiszterhez. Ez csak 8 bit igy 0..255 -ig vagy kepes ezzel cimezni. A PCL ugye a PC also 8 bitje, tehat minden 256-os laptoresek keletkeznek. A 0. lap a 0...255, az 1. a 256...511 es igy tovabb... Mivel a 18F-eken 1 utasitas 16 bites, es neked byte-os cimzesed van, ezert a szamitott ugrasoknal van egy kettes osztas, azaz egy lapon max 128 elemet tarolhatsz el - marmint ha egy elem 1 szavas utasitas. Namost ha a tablad a 250-es cimen kezdodik, akkor (256-250)/2, azaz 3 tabla elem fer bele az aktualis lapba, a rakovetkezok mar a kovetkezo lapra esnek. Ha a talad biztosan elfer egy laoon, akkor meg lehet csinalni, hogy lekerdezed a tabla elejen es vegen a programszamlalo cimet, ossze hasonlitod es ha nem egyezik egy error-al leallitod a forditast. high(TABLA) ill high(TABLA_VEGE) mondja meg, es egy egyszeru IF-el lehet az elagazast megoldani. Abban viszont wattnak maximalisan igaza van, hogy tablakhoz 18F-nel mar nem szokas RETLW-s tablakat hasznalni, annal joval hatekonyabb a TBLRD stb utasitasok hasznalata. Szamitott elagazast persze ettol fuggetlenul meg lehet eszkozolni mas feladatokra.
Trudnai, Köszi a választ villog a ledem! És azt hiszem értem mis a lényeget. Kicsit tovább akartam fejleszetnia progimat de nem sikerül. A PORTC 0-3ig van egy 4 es kapcsolóm azt szeretném megvalósitnai hogy ha a RC0 n lévó kapcsolót egyesbe állirom akkor induljon el a LED villogás ha meg lekapcsolom akkor megszünjön a villogás. Próbálkoztam pár dologgal de aze a megszakitásos dolog nekem még kinai. Tudnátok nekem segiteni hogy mit hova irjak hogy működjön a kapcsolgatás? Előre is köszi!
Köszönöm a leírást, végül is C-ben hasonló a helyzet, és ott használom is félig meddig a dolgot de csak eddig a szintig(még annyit tettem, hogy másképp osztottam fel a memória területet a linker fájl szerkesztésével).
A cikk írására ösztökélnélek, mert szerintem sokan nagyon örülnének(én is!), főleg a több nyelvű forrásból való összelinkelés menetének(ASM+C)! Mégegyszer köszi!
Idézet: „de sajnos nem tudom lekódolni” A kiinduláshoz elég annyi, hogy az adatlap 6.8 alfejezetében leírtakat kell követni.
Errefelé próbálkozz:
Tehát csak S1 egy bizonyos állapotában engedd a vezérlést a testB szakaszra, s minden ciklusban S1 tesztelésére kell visszaugrani. Természetesen a C port kezdeti konfigurálását rád hagytam...
Igazából elég lett volna annyi, hogy a testB-t átteszi a btfsc S1 elé és kész.
De bevallom nem nagyon szeretek olyan szöveget olvasni, amiben egy szál vessző sincs, ezért el se olvastam a kérdését végig! Minden tiszteletem a tiéd, hogy Te veszed a fáradságot!
Orulok, hogy villog a LED-ed. A PORTC-t is illik felinicializalni, talan ha szerencsed van akkor eppen digitalis input lesz a power-on reset utan (bekapcsolast kovetoen).
De igen, epp, hogy ilyen egyszeru, csakhogy nem elore kellene ugrani!
Azonban ez:
problemat okozhat! Az van ugyanis, hogy ha ugyanazon a porton ketszer egymast kovetoen elvegzel egy RMW utasitast, akkor nem biztos, hogy a vart eredmenyt kapod meg. Mi az az RMW? Read-Modify-Write. Mikor azt mondod BCF peldaul, akkor elobb kiolvassa a teljes portot, majd elvegzi a bitmuveletet majd vissza irja a teljes portot. Ez nem baj eddig, a baj az, hogy a BSF ROLED (ami ugye BSF PORTB,1) magasra allitana a portot, de a port nem kepes eleg gyorsan magasra allni, igy a kovetkezo hasonlo utasitasnal amikor a port kiolvasodik akkor meg alacsony erteket mutat, ezert ezt az alacsony erteket szepen vissza irja a portba (ugye mert hiaba allitasz egy masik port bitet akkor is a teljes portot olvassa-irja)! A lusta javitasa ennek a problemanak, hogy egy NOP-ot szursz ezek koze, a profi javitasa, hogy un. shadow regisztert alkalmazol, azon vegzed el a muveletet es azt irod ki a PORT-ra...
Ja, es igen, elkepzelheto, hogy veletlenul mukodott a LED villogtatas, ettol meg a problema fenn all - valtozik a feszultseg, a homerseklet vagy a para tartalom es a cuccod megall!
Srácok! Köszönöm a válaszokat, ezek több mint válaszok, jól el is magyarázzátok, többet segítetek, mint itt Franciaoban a kedves konzulensem. Le se sz*r. Szóval tényleg köszi szépen!
Idézet: „Igazából elég lett volna annyi, hogy a testB-t átteszi a btfsc S1 elé és kész.” Meglehet. Csak kicsit furán nézett volna ki a TesB címke a C port tesztelésénél....
Ahá! Látod ilyen összefüggést nem kerestem!
En raadasul meg a "testB" elneztem "test8" -nak Amugy mentsegunkre legyen mondva a teszteles az S1-re hivatkozik, igy nem egyertelmu hogy miert B vagy C a cimke
Elárulom a titkot: a próbálgatások közepette ugy maradt és nem írtam át
Köszi szépen.Kezdem érteni a táblakezelést.
Ha jól értem akkor a PCL állítása csak a RETLW-s megoldásnál kell.Viszont ha TBLRD valamelyikét használom akkor nem kell bántani a PCL-t,hanem csak a TBLPTR regisztereket.Erre az esetre is vonatkozik a lapváltás amit írtál? köszi üdv Idézet: „Ha jól értem akkor a PCL állítása csak a RETLW-s megoldásnál kell.” Igy van. Idézet: „Viszont ha TBLRD valamelyikét használom akkor nem kell bántani a PCL-t,hanem csak a TBLPTR regisztereket.Erre az esetre is vonatkozik a lapváltás amit írtál?” Nem kell PCL - Az a gyanum, hogy nem erted a PCL/RETLW-s megoldas hogy mukodik es hogy mi a kulonbseg a tablas olvasastol. PCL az szamitott GOTO utasitas. Azaz a programszal alugrik valahova. Ott azon a helyen pl van egy csupa RETLW utasitasbol adodo tablazat. Mikor RETLW vegrehajtodik vissza ter a CALL utasitas utani cimre, de kozben a W-be betolti azt amit megadsz a RETLW parameterekent... Magyaran annal ugy nez ki a dolog, hogy
A {szamitott GOTO} az valojaban az ADDWF PCL - ill ha normalisan csinalja meg az ember akkor az ami szamol a PC felso bitjeivel is... TBLRD-nel nincs ugras! Ott a tabla mutatot kell feltolteni, es ugyanugy kell szmaolni a cimek felso bitjeivel, nemcsak az alsokkal. Magyaran a TBLPTR regiszter 3 reszre van osztva: TBLPTRU : TBLPTRH : TBLPTRL --> U)pper : H)igher : L)ower: Ami miatt a TBLPTR-nel mindenkeppen torodnod kell a felso bitekkel, mert mig a PC eseteben ha a PCL-t kiolvasod akkor a PCU es PCH automatan atmasolodik a PCLATU : PCLATH regiszterekbe, mig a TBLPTRL olvasasanal ilyen jatekok termeszet szeruleg nincsenek. Magyaran ADDWF PCL -nel ami tortenik: Ugye ADDWF ugyanugy RMW utasitas, tehat: 1. Kiolvasodik a PCL, emiatt a felso bitek masolasa megtortenik a PCLATU : PCLATH -ba 2. ADD W 3. PCL vissza irasa Magyaran ha nincs az ADDWF es a tabla vege kozott lapvaltas akkor minden ok, mivel a felso bitek aktualizalodnak... TBLPTR-nel meg ugye minden esetben ki kell tolteni a felso biteket, de ami gond szokott lenni, hogy nem eleg egyszzer kitolteni, mikor hozza adsz a TBLPTR-hez manualisan erteket, akkor azt 16 ill 24 bitesen kell megtenni... Szerencsenkre ez 18F eseteben eleg egyszeru:
Egy tanulságos hiba
Ismerkedve a FlashForth programnyelvvel, nekiestem az ADC programozásnak. Mivel a "!" utasítással bármely címre írhatunk adatot, így akartam inicializálni az ADC-t: Csupán arról az "apróságról" feledkeztem meg, hogy az alap adattípus 16 bites, így ADCON1 írásakor kitöröltem ADCON0-t, ADCON2 írásakor pedig ADCON1-et. A bájtonkénti írás (c!) használata természetesen megoldotta a problémát. A működő kód:
adc-init analóg bemenetnek konfigurálja AN0-t. adc-an0 pedig indít egy konverziót és visszatér egy 0-1023 közötti értékkel. Korábbban felmerült már itt, hogy mire jó a Forth. Nos, leginkább a breadboardhoz (dugdosós panel) tudnám hasonlítani. Olyan a Forth a programfejlesztésben, mint a dugdosós panel az áramkörfejlesztésben. Könnyű összerakni benne egy kísérleti elrendezést, s könnyű ellenőrizni a működését, vagy módosítani valamit, ha nem működik. Amióta a HPC Explorerbe egyszer beégettem a Forth interpretert, azóta nyugdíjaztam a PICkit-et és az MPLAB-ot.
Régebben volt olyan nyelv, hogy Forthran, annak van valami köze ehhez? Na azt se szerettem meg. Olvashatatlan áttekinthetetlen számomra az egész íráskép.
Idézet: „Forthran, annak van valami köze ehhez?” Nem, az inkabb Pascalos. A Forth es "mas programnyelvek" kozott kb annyi a kulonbseg, mint egy HP48-as kalkulator es "mas szamologep"-ek kozott... A HP48 ugyanis forditott lengyel logikaval dolgozik, tehat mikor azt akarod, hogy (3+4) * (5+6) akkor beirod: 3 4 + 5 6 + * Ezt a logikat meg kell szokni, elonye, hogy nem kell zarojelezni (es amugy minden programozasi nyelv ebbe a formaba onti at a dolgainkat). Ha jol ertem icserny, ezzel a Forth interpreterrel van egy RS232 linked a PC es a PIC+breadboard kozott, tehat ahogy beirod "1 portb c!" azonnal latod, hogy pl a LED kigyullad? A definialt fuggvenyek hol tarolodnak le? Program memoriaban? Ugyanis az hamar elhasznalodik, ha sokszor ujrairogatja az ember... Idézet: „Régebben volt olyan nyelv, hogy Forthran, annak van valami köze ehhez?” Nem, nincs. Az FORTRAN volt azaz FORmula Translator, s az volt a célja, hogy a tudományos, műszaki, vagy egyéb számolások viszonylag kényelmesen megfogalmazhatók legyenek benne (azaz a fordító tudja a matematikai kifejezéseket gépi kódra fordítani). A Forth-nak inkább a 4th-hoz van köze, "negyedik generációs" nyyelvnek szánta a kitatálója. Idézet: „ezzel a Forth interpreterrel van egy RS232 linked a PC es a PIC+breadboard kozott, tehat ahogy beirod "1 portb c!" azonnal latod, hogy pl a LED kigyullad?” Igen, így van. Sőt, a copy+paste is használható. S ha beírom, hogy portb c@ . akkor meg beolvassa és kiírja a B port állapotát. Sőt, azzal is lehet szórakozni, hogy $ff trisb c! $ff latb c! portb c@ . latb c@ . s akkor látom, hogy portb estleg nulla, latb meg csupa egyes. Van egy RAM buffer, s a változókat ide pakolhatom, illetve a direkt parancsok is ezt írogatják felül. Az újonnan definiált parancsok azonban (előbb vagy utóbb ) a programtárba kerülnek (ezért Flash Forth a neve). Az elhasználódással valóban számolni kell, ezért: - bár elvileg tehet az ember változót a Flask memóriába is, nem érdemes, ha az gyakran változik. - Amit lehet, azt direkt paranccsal (a már meglevő utasítások kombinálásával) próbálok ki. Ez - tudomásom szerint - csak a RAM-ba ír. - Az új definiciók próbálgatásánál inkább haladok előre a memóriában ( pl. ha adc-test nem jól működik, akkor a memóríában utána írom a javított változatot adc-test2, adc-test3 néven) hogy ne egy helyen gyötörjem a memóriát újraírással, s csak amikor végeztem, akkor törlöm ki egyben a szemetet (ehhez kell a marker utasítás). - nem utolsó sorban papíron ceruzával kell megírni a programot úgy, hogy ne kelljen sokat javítgatni rajta Mindezek mellett a PIC18F8722 10000-100000-szeres ujraírhatósága elég soknak tűnik...
Jé! Eddig ez nekem nem esett le, hogy ez ilyen! Ez nem is olyan rossz!
köszi.
még egy olyan kérdésem lenne,h.ha nem így akarom megoldani a megszakítást, hanem ugy,h.egy (RA2/INT) -en lévő gomb nyomására induljon újra a mérés, akkor mit kell figyelembe venni?? |
Bejelentkezés
Hirdetés |