Fórum témák
» Több friss téma |
A SWAPF utasítás felcseréli egy regiszter két félbájtját. (Ha jól értem a problémát.)
Igen, ezért tettem bele a kódba. Mivel nálam a nibble k fel vannak cserélve. A PORTB alsó négy bitje vezérli az LCD felső 4 bitjét. De már úgy belekavarodtam hogy lehet inkább átgányolom a panelt ahogy pipi is javasolta.
Átnéztem a panelt, mivel a PORTB felső nibble ban van már olyan dolog aminek a működése le van programozva és az már jó, így békén hagyom. Az RS és az EN LCD lábak vannak még rajta de az nem szól bele az említett problémába így maradhatnak. A PORTD4-7 (ami a leg logikusabb) és az elcs&&tt PORTB 0-3 bitjei viszont egyelőre büntetlenül felcserélhetőek mert a PORTD csak szimplán analóg kapcsolókat vezérel amit a PORTB is megtehet, raadásul szinte egymás mellett vannak. Tehát megyek és átdrótozom a panelt. Ezek után pedig remélhetőleg kitisztul a kép, nem bolondulok bele a nibble és bit csereberékbe. Köszi.
A hozzászólás módosítva: Ápr 21, 2020
Ha belefér egy picit nagyobb kód és picit hosszabb futási idő, akkor bitenként is kirakható a 4 bitnyi adat (16 utasításból megvan, a btfsc, bsf, btfss, bcf utasítás sorozatot kell négyszer elismételni hozzá). Csináltam anno C-ben LCD drivert és ha nem sorrendben adtuk meg a lábakat akkor nem volt más lehetőség. Max sebességen működtetve a vezérlőt szinte mérhetetlenül kicsi a futási időben a lassulás.
Szoftverből egyszerűbb lenne:
Valami hasonló megoldással:
Nem gondoltam teljesen végig, ez csak a bitek sorrendjét változtatja meg, de szerintem ez alapján testre tudod szabni..
Hello! A nibble bitcserét legegyszerűbben talán egy 16 elemes táblázattal lehet megoldani.
Pld. 0000 - 0000 = 0 0001 - 1000 = 8 0010 - 0100 = 4 ... Így a nibble a táblázat elemére mutat, a visszatérő érték, pedig a cserélt bit-tel. Tulajdonképen a PC-hez adódik hozzá a nibble, és az az táblázat elemére ugrik. A táblázatot pedig így kell kezelni.
Upppsz.. Még egy kérdés ami lehet lényeges lehet. Írtam hogy felcserélem a PORTB - PORTD t. Viszont a PORTD minden lába fel van húzva tápra (5v) 82k ohm al. Ezek az ellenállások a fixen felforrasztott PIC alatt vannak, ezért macerás őket kivenni. Kérdés maradhatnak vagy sem? Tehát így az LCD D4 - D7 lábai is fel lesznek húzva 5V ra. Gondot jelent ez?
Köszönöm Nagyuram az újabb supportot.
![]() A hozzászólás módosítva: Ápr 21, 2020
Köszönöm szépen, de kezdőként jobban átlátom ha hardveresen is egyértelmű a dolog ezért átalakítom a panelt. Köszönöm a példakódot, az átalakítás előtt kipróbálom azért, tanulok belőle! De aztán vissza a kályhához, és rendbe teszem amit elszúrtam.
Használd 4 bites módban, akkor kevesebbet kell átmadzagolni
Úgy volt eddig is, ezért kellett a keresztben lévő nibble kkel szenvedni. ( 8 bites módban nem lett voilna gondom szerintem mert ott egyértelműek az utasítás küldések, nincs maszkolás. ) Az LCD lábain akkor nem okot gondot a 82k Ohm felhúzó ellenállás (VDD +5V ) ?
A hozzászólás módosítva: Ápr 21, 2020
Pedig ez a sokkal ésszerűbb megoldás! Ezt a kódot egyszer kell megírni és utána oda kötöd az LCD-t ahová akarod. Akár úgy is megvalósítható, hogy a 4 bit 4 különböző porton van!
Hűűű, az jól hangzki, de már megtörtént a "műtét", nem is látszik mert az LCD pont a kontroller felett ül és takarja az átkötéseket. Azért köszönöm a kódot, ezt is ki fogom próbálni. Jó ha van a repertoárban, bár a legközelebbi LCD s projectemnél már jobban figyelek a tervezésnél.
![]() Most állok neki átszabni a kódot az új felállás szerint, remélem így már nem fog ki rajtam. Köszönöm mindenkinek a segítséget, a 82k Ohm os felhúzóellenállásokat végül benne hagytam (LCD D4 - D7 en, (azaz egyben a PORTD 4-7 en) mert a PORTD re kötöttem át a 4 adatbitet. Azokon a lábakon volt pull up 82K, és nem akartam leforrasztanni ezt a 40 lábú böhömöt mert a tok alatt vannak az ellenállások. Remélem nem kavar be a parancs és az adatátvitelbe sem.
Most nézem, nem is olyan bonyi ez a kód, köszönöm. Tulajdonképpen bitenként küldi az adatot az LCD nek, ez ís egy járható út és egyben megoldás a problámámra.
Köszönöm szépen!
Nem bitenként küldi, csak bitenként vizsgálja a küldendő adatot. Régen én is belefutottam abba a hibába, hogy vagy a PIC lábait másra kellett használni vagy egyéb okból nagyon bonyolult lett a bekötés. Akkor kértem én is segítséget és ha jól emlékszem én is ktamás66 útmutatása szerint indultam el.
Használd egészséggel!
Nos, mindjárt működik a dolog. Az inicializálás már ok, kijelző letörörve kurzor a felső sor bal oldali legelső mezejében. Már csak írnom kéne rá, pl a "Háború és Beke" t.
![]()
Köszönöm, elmentettem a kódot vésztartalékként. De lehet eljátszom vele, csak át kell alakítanom akkor a PORTD megfelelő bitjeire. Érdekes megoldás de teljesen logikus, egyszerű és egyértelmű. Legalábbis így első ránézésre.
Viccen kívül, az inicializálás az ok, de azért van még mit átirogatno, mert az eredeti proli007 oktató példakódban minden vezérlő és adatláb a PORTD re van konfigolva, nálam meg az LCD RS és EN bemenetét pl. a PORTB 4-5 bitje vezérli. Tehát ezt még át kell írni, de ez már nem gond.
Mindenesetre a sikerélmény mára megvan és ez motivál. Tehát 3 óra előtt tuti nem fekszem le... ![]() A hozzászólás módosítva: Ápr 21, 2020
Nem kell átalakítani semmit sem!
A te kódod elején #define paranccsal megadod a az én kódomban leírt RS, EN, stb és include fáljként megadod az én kódomat. Én így használom.
Az én megoldásom hasonló Pali79-éhez.
Amikor adatot akarok küldeni:
A kiíró rutin pedig így néz ki:
A hozzászólás módosítva: Ápr 21, 2020
Minden működik, legalábbis proli007 kódja igen. Most már csak azt kell megoldjam valahogy, hogy különböző feltételek teljesülése vagy nem teljesülése esetén más és más szöveget írjon ki az LCD re. Ez egy tesztelő masina lesz, USB n tol be parancsokat egy szoftvernek ami PC re csatlakoztatva futtat egy hardveren tesztet. A hardver különbözü pontjain közben méréseket vagy jelszinteket kell chekkolni, és a szerint hogy jó vagy nem jó a teszt eredmény, ki kéne iratni az LCD re. Én arra gondoltam hogy egy regiszterben az eredményeknek megfelelően jelzőbiteket állítok be, majd a végén kiértékelem és a feltételeknek megfelelően hívok meg a kiirató rutinba különböző text eket. Mindegyik text egy külön rutin, ami csak meghívódik a feltétel teljesülése esetén a kiirató rutinba. Remélem össze tudom stoppolni valahogy, így ahogy kitaláltam elvileg működnie kéne... Nagyon sokféle szöveget kéne kiirítni, kb 20 - 30 félét, tehát ennyi text rutin kell gondolom. Vagy szerintetek hogyan kéne ezt megoldani, "egyszerűen?"
Szerintem a legjobb ilyenkor ha mindig kiírod mind a 16 karaktert, akkor nem kell görcsölni a különböző hosszúságú szövegekkel, csak egy rutint kell használni. A szöveget DB paraccsal letárolod, a rutin elején beállítasz egy számlálót, TBLRD*+ paranccsal olvasol.
Köszönöm, de ezt körül kell járnom. Egyelőre nem világos a "DB" és "TBLRD +" parancs (ez nem "C" véletlenül? Mert asm ben én nem látom sehol az utasításkészletben ) és semmit nem találok róla. És azt se nagyon értem hogy proli007 kódjában a TXT1 és TXT2 string táblák rutinhívással vannak meghívva de a rutin végén nincs "return" (hogy tér vissza a főprogramba onnét?) , Tehát történik valami még "a háttérben", ami a kódból számomra nem derül ki. Van egy másik kód(igaz F684A ra de ez a lényeget tekintve nem érdekes..) amiben a string karaktrenként retlw utasításokkal működik és az utolsó karakter az "h0", ezt chekkolják és onnét tudja a program hogy véget ért a kiírás. Ez se rossz megoldás de bárhogy próbálok ugyan ezzel a rutinnal más string ben letárolt szöveget kiiratni vagy az egyik szöveg jelenik meg jól vagy a másik. Az egyik szöveg a kettő közül mindig "irkafirka lesz"... Mindjárt beollózom mivel próbálkozom, segítenétek?
Ezzel próbálkozom de nem működik, de ha múködne is ez még mindig csak 1 feltétel és 2 szöveg. Ennél lényegesebben több kéne mert sok feltétel van sokféle szöveggel. Bocs hogy ilyen rendezetlenül jelenik meg a kód, nem tudom miért, talán az eredeti kód formázása miatt
A hozzászólás módosítva: Ápr 22, 2020
TBL utasítások nincsenek ebben a PIC-ben.
A mellékelt kódban a PRINT rutin ír mi mindig egy egész sort egyszerre ( gondolom 20 karakteres LCD-d van mivel ennyi van a kódban). Ezt nem látom a kódodban. A szövegek tárolásakor figyelni kell, hogy memóriában hol helyezkednek el, mivel az addwf PCL csak az alsó bájtot állítja, így nem lóghat túl a 256-os memóriahatáron. Ezt az ORG utasítással irányíthatod.
Igen, valóban a példakód 16 karakteres LCD re íródott, az egyém 20 karakteres. Valóban van még 2 rutin amit nem linkletem be, az "LCDaddr" és az "LCDdata"
16F877 est használok Az ORG al a program elején csak a kecdőcím 0x00 és az int 0x04 van megadva
Szöbegek kiíratása PIC16 kontrollerekkel az alábbi módon történhet:
A program memóriában létre kell hozni a kiírandó szövegek karakter sorozatait:
Kell készíteni egy rutint, ami egy 16 bites változóban kapja a kezdőcímet: CIM és CIM+1 Hívás előtt fel kell tölteni a változót a kiírandó szöveg címével:
Nagyon köszönöm a segítséget, megpróbálom így összehozni.
|
Bejelentkezés
Hirdetés |