Fórum témák
» Több friss téma |
Kapcsolási rajz? Kód? Konfiguráció (charlcd.h) ? Az alapértelmezetten analóg bemenetként működő lábakat átállítottad digitális I/O-ra? Egyébként tud ez a program 4 és 8 bitet is, csak úgy kell beállítani, a leírásban benne is van.
A hozzászólás módosítva: Aug 18, 2015
Sziasztok! Adódott még egy kérdésem, de a neten nem találom. Az MPLAB X - XC8 párosban hogy tudom bekapcsolni a belső felhúzó ellenállásokat? Egyelőre csak egy bemenetet kéne felhúzni, de ez lényegtelen.
Köszönöm szépen!
Köszön a sok segítséget, ezek nagyon jók lesznek kezdésnek!
Üdvözlet!
2400 baudos uart beállítható 40MHz órajel mellett ? (18f26k22) Csak hw uart jöhet szóba...
Beallithato. Brg16 regisztert 1-re kell allitani es az SPBRGHx:SPBRGx regiszterek erteke 1041.
Köszönöm a gyors választ!
Urak!
Tanácsra lenne szükségem. Egy LCD kivezérlésmérőn dolgozom. Hasonló kijelzéssel mit Vicsys-é (lásd a mellékelt képet). Addig eljutottam, hogy ADC-vel fel kell dolgozni a jelet. A kijelzés 1×8 pixeles vonalakkal törénik. Elgondolásom szerint ehhez 3 db egyéni karaktert kell létrehozni 1 db egyvonalas, 1 db kétvonalas, és 1 db három vonalas. Nekem csak az a megoldás jutott eszembe, hogy megvizsgálom az ADC értékét és annak megfelelően hívom az előre megírt kijelzőképet. Ez így elég egyszerű, talán még működne is, de baromi hosszú lesz a kód. Ennek az egyszerűsítésére szeretnék tanácsot kérni!
Szia!
Én úgy oldanám meg, hogy a beolvasott AD értéket (0-255) osztom 18-al. Kijelző felső sorát 0-nál kezdve beírom "L:" Majd pedig egy ciklussal annyiszor iratom ki a három vonalat, ami az osztás eredménye volt. Ezután a maradékot osztom 3-al. Ha 0-> üres mezö, ha 1-> 1vonal, ha 2-> 2 vonal. Ezután 13-ból levonom az első ciklus számát, majd a maradék értékkel ciklust készítve üres mezőket írok. így mind a 16 karaktert felülírom, és nem kell törölni, tehát nem fog villogni. Majd a második sorral ugyan ezt mégegyszer, csak a másik AD csatornáról.
Ha jól számolom 42 vonalat kell maximum kijelezni. A kijelezendő értéket erre kell formázni. Utána ezt osztod 3-mal (itt egy segéd állandóval való osztáshoz/szorzáshoz). Egy ciklusban ennyiszer kiírod a 3 vonalat és mindig levonsz 3-at az értékből, a maradék megadja az utolsónak kijelezendő karaktert ( különösen egyszerű, ha 00, 01, 02, 03 helyre definiáltad). Ha közben a kiírt karaktereket is számolod a maradékot 0-val felülírod.
Sajns ez teljesen mégsem oldotta meg a problémámat, a B portot minden gond nélkül fel tudm húzni, a C-t már nem, és ott van a nyomógombom. Egyébként muszáj az egész portot felhúzni, vagy lehet külön csak az egyik bitjét is?
Nem akarok ám hülyeségeket kérdezni, de itt mutatkozik meg tökéletesen a (magyar nyelvű) oktató anyagok hiánya, illetve attól, hogy C nyelv, még a fordítókban elég nagy különbségek vannak, így egy egyetemes C-ről szóló anyaggal sokra nem megy az ember fia. A CCS-ben ezek egyáltalán nem okoztak problémát, de itt már egy sima bemenet kezelés is teljesen más.
Az elgondolás nem rossz. Az osztást szerettem volna elkerülni, de úgy látom nem lesz más választás. Kigondolom, hogy tudnám a kódot így megírni. Addig is Köszönöm!
Igen a 42 stimmel.
Idézet: Ezt, hogy érted pontosan? Nem egészen értem mit is kell 3-mal elosztani...„A kijelezendő értéket erre kell formázni.” Tök jó ez a segéd, csak nálam az osztásra nem hajlandó valamiért, gyakorlatilag üres kódot ad vissza. A vonalakat 00, 01, 02 helyre raktam, de oda rakom ahová akarom, ez nem gond.
Nem tudom milyen PIC-et használsz, de a C porta általában nincs belső felhúzás, és nem muszáj az egész portot felhúzni a WPUx regiszterrel tudod beállítani, hogy melyik lábon van engedélyezve a belső felhúzás.
Az AD eredményét úgy kell átalakítani, hogy 0-42 közötti számot kapjál mint kijelzendő érték (nem tudom lineárisat vagy logaritmikusat szeretnél, de végeredmény legyen 0-42 között). Ezt én a mintavételek számával és kettes osztásokkal szoktam variálni, de mint látod az állandóval való osztás sem bonyolult.
A 3-mal való osztás 0.333333-mal való szorzásnak felel meg .
Az hogy egy mikrovezérlőben melyik porton tudod a felhúzó ellenállásokat bekapcsolni nem a fordítóprogramtól függ, hanem magától a mikrovezérlőtől. Nézted már az általad használt típus adatlapját (mondjuk ha a típust közzé tennéd az sem ártana) ?
Idézet: „A 3-mal való osztás 0.333333-mal való szorzásnak felel meg” Assemblyben ez még bonyolultabb, mint az osztás. Itt egy egyszerű 8 bites osztórutin:
Az osztás végén az osztandóból lessz az eredmény! A hozzászólás módosítva: Aug 19, 2015
Arra gondoltam, hogy a linkelt oldalon a szorzás helyére kell a 0.33.... beírni, így adja a rutint. Ha megnézed 17 utasításból oldja meg .
Milyen PIC-re generál ez a program kódot? Mert az álltalam használt PIC-ek nem minden utasítást ismernek fel.
Köszönöm, és benjami-nak is, 18F2455-ről van szó. Most nézem, hogy sajnos csak a B porton van belső felhúzási lehetőség, az A és C portról ez kimaradt, az adatlapban ezt meg pont nem néztem, figyelmetlen voltam. De a lényeg megvan, hogy a WPUx regiszterrel fel tudom húzni egyesével is a portok bitjeit. Köszi!
Szerintem elég általános, clrc a carry törlése. Ezt lehet STATUS-ban is, vagy csinálni rá makrót, de az újabbakban a clrc, rrf helyett lsrf is használható.
Eleg regi modszer a tablazat. Csinalsz egy tablazatot, aminek minden eleme egy A/D ertkhez tartozik. A tablazatban szereplo byte-ok pedig ket dolgot tarololnak. Mondjuk az also 4 biten azt, hogy hany darab harom csikos karaktert kell kirajzolni, es tovabbi ket biten pedig azt, hogy ez utan egy 0, 1, vagy ket csikos karakter kell. Ez tulajdonkeppen egy specialis osztotabla, mert a maradek is benne van. Ezzel elkerulod az osztast teljes egeszeben. Ha elotte az A/D erteket atszamolod valami alacsonyabb ertekre, mert ugysincs 256 vonalnak hely, akkor meg kisebb is lesz a tablazat.
A hozzászólás módosítva: Aug 19, 2015
Idézet: „Ezzel elkerulod az osztast teljes egeszeben.” Idézet: „Ha elotte az A/D erteket atszamolod valami alacsonyabb ertekre,” És máris nem kerülted el az osztást!
Igen, a 255->41 kerdest is valahogy meg kell oldani. Egyreszt megteheted azt, hogy szorzod 42-vel es osztod 256-tal. Utobbi nem osztas, mert csak el kell dobni a 16 bites szorzat also 8 bitjet. 42-vel szorozni meg talan konnyebb, mint osztani. Mert ahhoz csak 5 shifteles kell meg ketto osszeadas kell. Vagy, mivel a vegeredmeny ugyis csak 42 lepesben kell, akkor mar eleve lehet az A/D-t is igy hasznalni, azaz "hardverbol osztani". Mondjuk csak a felso 6 bitet felhasznalni az A/D-bol (néggyel osztás), es nem 100%-ig kivezerelni az A/D-t. De ha ez sem megy, akkor marad a 256 byte-os tablazat. De ez csak egy otlet volt a hetvenes evekbol, amikor gyengek voltak a processzorok...
mellesleg az általam az egy 'l' A hozzászólás módosítva: Aug 19, 2015
Én inkább ezt csinálnám: a 42 prímtényezői 2x3x7, a kettő megvan 256-ban is, tehát szerintem a legegyszerűbb venni 21 mintát (3x7), ezt összeadogatni egy 16 bites változóban. A végeredményt 128-al kellene osztani, de egyszerűbb szorozni 2-vel (rotálni) és a felső bájban ott az eredmény.
A kódgenerálás jól működik, de a maradékot elhagyja. Végülis sonajkniz is azt írta mint Te. A 42-re formázás és 3-mal osztás, azt tulajdonképpen 18-cal osztás. Csak ez a "maradék megadja az utolsónak kijelezendő karaktert" dolgot nem tudom, hogyan oldjam meg.
Ha azt az osztórutint használod, amit feltöltöttem, a MARADEK- ban egy 0-17-ig terjedő szám lessz. Miután a ciklus a kijelzőre kiírta a kellő számú háromvonalas karaktert, MARADEK-ot áttöltöd OSZTANDO-ba.Ha ezt 6-al osztod az eredmény 0, 1, vagy 2 lessz. Ha az általad elkészített karakterek a 0-ás helyen semmi, az 1-es helyen egy vonal, a 2-es helyen két vonal, akkor az utolsókarakter kódja OSZTANDO névre halgat.
A hozzászólás módosítva: Aug 19, 2015
|
Bejelentkezés
Hirdetés |