- RP1 RP0
- 0 0 --> Bank 0 is selected
- 0 1 --> Bank 1 is selected
- 1 0 --> Bank 2 is selected
- 1 1 --> Bank 3 is selected
Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Sziasztok!
Újabb kérdésem lenne...16F648 al kapcsolatban. Indirekt címzésnél nekem nem egyértelmű az adatlap, miszerint PIC16F627A/628A PIC16F648A Bank0 20-7Fh 20-7Fh Bank1 A0h-FF A0h-FF Bank2 120h-14Fh, 170h-17Fh 120h-17Fh Bank3 1F0h-1FFh 1F0h-1FFh szerint vannak a RAM területek. Ezzel szemben a STATUS regiszter részleteinél egész mást ír...azt írja hogy ha a STATUS regiszter 7 es bitjét "1" be állítom akkor a BANK 2,3 at tudom elérni ami 100h - 1FFh ig tart, míg ha "0" ba állítom akkor a BANK 0,1 et érem el 0x00h - 0xFF h ig Most akkor mi az igazság..? Nem jó az adatlap, vagy én nézek be valamit megint...? SMS t szeretnék letárolni a RAM területre, ez maximum 160 karakter lehet (a szöveges része..+ a hívószám, dátum ..egyéb adatok...stb) Tehát nem férek el egy RAM területen, mindenképpen váltani kell a letárolás közben. De nem tiszta hogy mettől meddig tartanak ezek a területek, az adatlap szerintem nem jó... vagy igen..?
Két bit játszik, így olvasd:
Lehet két malomban őrlünk..én az FSR el címezhető INDF RAM területekkel vagyok bajban, ezt nem igazán értem...azt az IRP bit el lehet váltogatni. Illetve nem volt vele eddig semmi bajom míg elfértem egy RAM területen, (0XA0 - 0xFF h ig) de ezt kinőttem....és az nem világos hogy milyen címre lépjek át 0xFF után mert nem egyértelmű (nekem) az adatlap....
de lehet megint én nem értek valamit azzal a kos agyammal... a ban váltásokat én makrokkal oldom meg...így: BANK0 MACRO BCF STATUS,IRP BCF STATUS,RP0 BCF STATUS,RP1 ENDM BANK1 MACRO BCF STATUS,IRP BSF STATUS,RP0 BCF STATUS,RP1 ENDM BANK2 MACRO BSF STATUS,IRP BCF STATUS,RP0 BSF STATUS,RP1 ENDM BANK3 MACRO BSF STATUS,IRP BSF STATUS,RP0 BSF STATUS,RP1 ENDM
most látom hogy ez nem is jó.....hmmm lehet meg is van a baj forrása...?
de ettől még mindig nem értem az adatlapban leközölt címeket amik nem egyértelműek....már nekem.
Az utasításokban, ha egy regiszterre hivatkozol 7 bit áll rendelkezésre a regiszter címének tárolására, ezért 2 bankválasztó bit RP0 és RP1 kell, még hozzá, hogy max 512 regisztert megcímezhess, ez 4 db 128 bájtos bankban fér el.
Az FSR regiszter 8 bites, ehhez már csak 1 bitet kell hozzávenni, hogy 512 regisztert megcímezhess, ez az egy bit az IRP. Tehát ha IRP=0, akkor indirekt címzéssel (a címet maradék 8 bitjét FSR-be téve és INDF-et használva az adat olvasására vagy írására) elérheted BANK0 és BANK1 regisztereit, ha IRP=1 akkor pedig BANK2 és BANK3 tartalma érhető el.
A makrók szerintem jók.
Még nem néztem az említett mikrovezérlő memóriatérképét, de lehet, hogy már a 0x7F című regiszter után kell valahonnan máshonnan folytatni a tovább írást.
Az adatlap szerint az általános felhasználású regiszterek három szakaszban vannak:
0x020-tól 0x07F-ig (96 bájt) BANK0-ban 0x0A0-tól 0x0EF-ig (80 bájt) BANK1-ban 0x120-tól 0x16F-ig (80 bájt) BANK2-ban Minden bank utolsó 16 regisztere valójában a BANK0-ban található utolsó 16-regiszter. Ha a bitek számozását 0-tól kezdjük, akkor RP0 a cím 7. bitje, RP1 a cím 8. bitje. IRP szintén a cím 8. bitje, de csak indirekt címzéshez. (ott a 7. bit még pont belefér FSR-be)
éppen most próbálgatom...a 0XA0 - 0xFF területet gond nélkül elérem, de a 0x20 - 0x7F ig terjedőt nem...És azért fura mert mindkettő az IRP - 0 (bank0 / bank1 ) beállítással érhető el. Akkor miért megy az egyik és miért nem a másik...magas nekem.
ahha..tehát a leírásod szerint az IRP (BCF STATUS,IRP) beállításán kívül a BANK macrot is át kellene állítanom... BANK 0 ról BANK 1 re és akkor menne? No ezt kipróbálom....
Nézd szimulátorban, MPLAB-ban a View menüben a File registers menüpontot kiválasztva megmutatja a teljes memória tartalmát. Feltéve, hogy a MPLAB-SIM szimulátor van kiválasztva Debugger-nek.
Egyelőre írtam egy próba programot ami a soroson érkező adatokat letárolja a RAM ba és aztán onnan kiolvasva beírja az eeprom területre. A A0 - ff ig tejedő RAM területtel működik a dolog, a 20- 7f ig terjedő RAM területet pedig nem érem el...
Az IRP beállítása mindkét RAM terület esetén "0" kell legyen. A BANK ot viszont hiába váltogatom BANK0 ról BANK1 re...ugyanaz az eredmény... az A0-FF ig működik..a 20 - 7F ig nem.
Egy példa, ami végigmegy a teljes memórián és nullázza:
Köszönöm a segítséget..a helyzet az hogy minden jónak látszik de mégsem jó...Részemről holnap vissza a kályhához, és átnézem az egész kódot mert valami el van ebben szúrva csak még nem tudom hogy mi a bánat...Idegesít hogy ugyan azokkal a beállításokkal kéne menjen mindkét RAM területen és mégsem jó valami. Holnap azért is kiderítem...!!
Köszi még egszer, jó éjt.
Ha nem teszed fel a programodat nem tudunk segiteni...
Amugy nezdd meg, hogy az FSR legfelso bitje a bank valaszto also bitje valojaban. Ugye a 0x20 es a 0xA0 kozott az az 1 bit a kulonbseg... RP1:RP0-nak nincs koze az indirekt cimzeshez, azert IRP a 7. bit a statuszban, mert Indirekt RP (RP gondolom Register Page akar lenni de nem vagyok ebben biztos). Amugy ne menj el ezzel a modszerrel 0xFF-ig, sot 0x7F-ig sem, hiszen a 0x70-0x7F tartomany az access ram tartomany, azaz amit a 0x70-re beirsz, azt a 0xF0-on is elered.. tehat ha az egyik lapon vegig toltod a 0x20-0x7F-ig, a masikon pedig a 0xA0-0xFF-ig, akkor az utoso 16 byte-tal felul fogod irni amit az elozo lapodon tettel bele.
Hűűűha....Köszönöm az infót. Ez megint egy olyan dolog amivel még nem találkoztam kezdő létemre és ezért nekem tök fekete lyuk. Mint a lapváltások pl. egy hónapja kb... De hála nektek azt is belevertétek a nehéz fejembe és azóta megy. Kicsit meg kell emésztenem a dolgokat, utána olvasgatok, próbálgatom, és előbb utóbb ezen is túl leszek remélem. Ha hazaértem felrakom később azt a teszt kódot amivel próbálgatom, az csak erre a problémára van kihegyezve..nem kell kirostálni a többi borzalom közül amit összegányoltam...
Köszönöm előre is a segítséget.
Ez a hozzáállás nekem nagyon tetszik!
Steve
Sziasztok!
Még soha nem használtam I2c-t. Ezért utánna néztem áttanulmányoztam stb. Tegnap elkezdtem tesztelni, és nem haladok vele sehova. Egy MCP4531 tipusú digipotit szeretnék I2C-n elérni PIC18F26J11-el órajel 40MHz. A PIC 3.3V-s, az SDA és SCL +5V-ra van felhúzva 5K-s ellenállással. A configurálásnál RC3 és RC4 lábakat bemenetnek állítottam. Kiválasztottam a master módot (SSPM=8), SSP1ADD=99 (100kHz), majd bekapcsoltam a modult(SSPEN=1). Adat küldésekor: Startjel, SSP1CON2bits.SEN=1; while (SSP1CON2bits.SEN); majd adat töltése a buffreba SSP1BUF=92; //cím és írás parancs közben debuggoltam és soha nem változott egy regiszter tartalma sem (SSP1CON1,SSP1CON2,SSP1STAT,PIR1.SSP1IF). Az Errata-ban megnéztem, az inicializálásról adtküldésről nincs írva benne semmi, a vételnél már írt egy két problémát, de egyenlőre még adni sem tudok, olyan mintha nem menne az I2C modul. SDA,SCL lábakon 5V mérhető.
Közben megoldódott a problémám:
Az igaz volt hogy a vonalvezetékeken mérhező volt az 5V, de PIC SDA, SCL lábain nem, és Digipoti SCL lábán sem. Annyiban jó tanulság volt számomra hogy legalább tudom ha a regiszterek nem reagálnak akkor buszhiba van. További szép napot mindenkinek!
Na erre varjatok gombot!
PIC18F4523-ról van szó. 4db analóg bemenetét használom, konkrétan az AN0-át, AN1-et, AN4-et és AN6-ot bár ez lényegtelen. Mind a négy bemeneten kb 48mV-nak kell lennie (így állítottam be a PIC előtt lévő analóg részeket). Az AN1-en, AN4-en és AN6-on valóban kb 48mV van, de az AN0-án csak 16mV! Megnézem a Watch ablakban és azt látom, hogy épp az AN0 az aktív. Továbbléptetem a debuggerben a programomat ami a következő lépésben az AN1-et kapcsolja be. Abban a pillanatban hogy az AN1 bekapcsolásához szükséges bájtot beleírom az ADCON0 regiszterbe, az AN1-en lévő 48mV leugrik kb 16mV-ra! Ugyanebben a pillanatban az AN0-ra megjön a 48mV. Magyarul tehát azon az analóg bemeneten amelyik épp be van kapcsolva, lecsökken a feszültség. Mintha az AN bemenet bekapcsolásával egy párhuzamos ellenállást kapcsolnék az épp aktív AN lábra. Gondolom ez a PIC A/D-jének bemeneti impedanciája akar lenni. Na és most jön a csavar! A PIC-es panelmérő II áramköröm analóg része igazából ugyan az mint ami a jelenleg problémás áramkörömben is van, csupán annyi a különbség hogy a panelmérőben csak két analóg bemenetet használok és nem négyet. Mivel a két áramkör szubrutinjai szinte teljesen megegyeznek, debuggerben könnyen előidézhettem a panelmérő esetében is ugyan azt az állapotot amit a mostani áramkörben. És ott az analóg bemenet aktiválásakor nem esik le a 48mV! Ráadásul azt se nagyon mondhatjuk hogy más PIC-ről van szó, mert a panelmérőmben 18F2423 van, ebben a vezérlőmodulban pedig 18F4523 ami a 2423 nagyobb memóriájú és lábszámú testvére. Még az adatlapjuk is ugyan az. Mutatok rajzot is, itt van a panelmérőmé: Bővebben: KÉP A problémás vezérlőmodul analóg része szinte tök ugyan ez, csak ott duplán van (tehát 4db OPA van és 4db A/D bemenet).
Én PICkit2 Logikai Analizátor módban megnézném az SDA, SCL kimeneteket.
Az inicializálás nálam így néz ki, ez nagyjából megegyezik a tieddel:
A start szekvencia generálását ugyanúgy végzem:
Egy bájt kiküldése pedig így néz ki:
Ennek így mennie kellene. A kapcsolást jó volna látni, s nem tudom, hogy mit csináltál az A0, A1, A2 vonalakkal. Az A0 bemenet szerepe számomra elég zavarosnak tűnt az adatlapból.
Az OPA kimenetén lévő 1k-s ellenállás két végén akkor más-más érték mérhető?
A két OPA bemeneténél vannak kis fetek. Ezek arra vannak hogy általuk a PIC rövidre zárja az OPA-k bemenetét. Ebben az állapotban az OPA-k kimenetén az offsetfeszültségük mérhető. A PIC ezt méri meg, hogy aztán majd kikompenzálhassa a rendes méréskor. Az OPA-k kimenetén azért van egy soros 1k és egy 82k a referencia felé, hogy az offsetet szándékosan eltoljam. Körülbelül 48mV lesz a PIC bemenetén akkor, amikor az OPA kimenete 0V.
Tehát a kérdésedre válaszolva igen, az 1k egyik és másik oldalán más érték mérhető. Ha az OPA ideális lenne akkor a kimenetén, s így az 1k egyik végén pont 0V lenne, a másikon pedig kb 48mV.
Egy kis tippem lenne, bár nem ismerem pontosan az OPA-kat, így lehet butaságot írok: ha az 1, 8 lábak segítségével nem csak az offset-feszültség nullázása, hanem annak egy fix értékre állítása is lehetséges, érdemesebb lenne ott állítani az offset-feszültséget, és az OPA-t direktbe kötni a PIC-re
Ha ott állítom, akkor egyrészt kell OPA-nként egy trimmer, aminek a tekerése miatt az élesztés is nehezebb lenne. Ráadásul a trimmernek is van hőfokfüggése így ugyan úgy elmászna az offset. A legjobb megoldás az amit én is alkalmazok, hogy nem érdekel mennyi az offset mert időnként fogom és megmérem, aztán minden mérés alkalmával kivonogatom a mért eredményből.
De a gond nem az analóg résszel van mert mind mondottam a "PIC-es panelmérő II" áramkörömben ez a dolog tökéletesen működik. A probléma az, hogy a PIC18F4523 A/D-je nem úgy viselkedik mint a kistestvére, a PIC18F2423.
Elképzelhető, hogy az aktív analóg bemeneten fellép valamekkora szivárgó áram, bár ilyet az adatlapban nem láttam. Lehet, kellene kotorni a Microchipnél valami olyan leírást, ami az A/D átalakító elektromos tulajdonságait részletezi.
Segítséget kérnék egy olyan ügyben, hogy a már lassan egy éve elkezdett jelgenerátoromnak nincs meg a forráskódja használható formátumban. És kellene egy olyan ember, akinek régebbi operációs rendszerrel rendelkező gépe van. Mivel van egy "asm" és egy "obj" kiterjesztésű fájlom, és a beállító bitek is meg vannak adva. Meg egy szoftver, ami nem fut XP alatt. (Szerintem win98 vagy win2000 alatt működik.) Ezzel a szoftverrel kellene egy hex.-et generálni. Remélem érthető a problémám. A jelgenerátorom linkje: Bővebben: Link (Itt legalul található.) Egy másik link, ahonnan a szoftver is letölthető: Bővebben: Link
De csatolok is minden hozzá kellő fájlt. A konfigurációs biteket a pdf-ben az utolsó előtti oldalon lehet megtalálni. (Elméletileg a toolkit2v4d szoftverrel lehet generálni hex-et.) MPLAB-ban nekem nem sikerült úgy átírni a szoftvert, hogy az a PIC-ben működjön.
Szia!
A '$' jelek hexa számokat jelentenek, a '%' binárisakat és még ki kell venni a '.'-ot az EQU, ORG és END előtt, azután szerintem fordulnia kellene az MPLAB-ban! Steve
Íme az MPLAB-os próbálkozásom. (MPLAB v8.5) Ha valaki ebben tud segíteni, annak is nagyon örülnék. Amit módosítottam, az a deklarálás rész. És beszúrtam az elejére egy org 0-át, mert anélkül még a szimuláció sem működött. Most egy régebbi MPLAB-ban elkezdtem szimulálni, és ott végig fut a szoftver, de amikor beletöltöm a PIC-be, akkor az nem ír ki semmit a kijelzőre. (A PIC és a kijelző is működik.) Egy teszt progit beletettem és azzal jó volt minden. (És valaki elmondhatná nekem azt is hogy miért kell az "obj" fájl.) (Vagy mi az?)
|
Bejelentkezés
Hirdetés |