 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70799.74
|
Objavljeno: Tor Apr 11, 2006 3:16 pm Naslov sporočila: Še en univerzalni menu |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.61 Kraj: Trzic
|
Objavljeno: Tor Apr 11, 2006 7:57 pm Naslov sporočila: |
|
|
Lepo napisano! Mislim da je tole precej uporabna zadevca. |
|
Nazaj na vrh |
|
 |
snoopy Član


Pridružen-a: Ned 11 Maj 2003 1:17 Prispevkov: 230 Aktiv.: 0.97 Kraj: Radovljica
|
Objavljeno: Sre Apr 19, 2006 5:21 pm Naslov sporočila: |
|
|
Mare kot začetniku , bi te prosil ,da mi še malce razložiš kako se časovno osvežuje LCD. Vem da ga enkrat vpišeš in zadrži napis dokler ima napajanje, oziroma ga ponovno vpišeš.
Kako pa v praksi osvežuješ LCD ali ob spremembi za njega ali po nastavljenem času (timerju).
Recimo imamo štiri tipke , vsaka predstavlja svoj napis na LCD-ju.
Kako realizirat v praksi.
Snoopy |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.61 Kraj: Trzic
|
Objavljeno: Sre Apr 19, 2006 6:29 pm Naslov sporočila: |
|
|
Ponavadi imajo tile LCD moduli še svoj kontroler, kateremu preneseš podatke za prikaz. Za osveževanje zaslona skrbi on. Torej, ko želiš, da se vsebina LCD-ja spremeni, pač pošlješ nove podatke. |
|
Nazaj na vrh |
|
 |
snoopy Član


Pridružen-a: Ned 11 Maj 2003 1:17 Prispevkov: 230 Aktiv.: 0.97 Kraj: Radovljica
|
Objavljeno: Sre Apr 19, 2006 7:10 pm Naslov sporočila: |
|
|
To poznam , kot sem že omenil v prejšnem mailu.
Če vzamem primer tipka in LCD displey. Tipko beremo vsake 10ms (recimo s timerjem) Če je tipka pritisnjena sledi vpis v LCD.
Kako se reši v praksi ,da se displey vpiše samo enkrat, takoj ko se zazna tipka in ne stalno ob kontroli stisnjene tipke.
Težko razložit, upam ,da sem uspel. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.56
|
Objavljeno: Sre Apr 19, 2006 7:18 pm Naslov sporočila: |
|
|
Tako, da zaznavas prehod med stanjema - ali v hardveru (uporabis recimo edge-triggered interrupt), ali pa v softveru (odcitas stanje tipke, gres v zanko, v kateri preverjas stanje tipke in ko zaznas spremembo glede na prejsnje stanje, npr. logicno "1" namesto prejsnje vrednosti "0", ustrezno ukrepas). Preverjas lahko oba prehoda, ali pa samo enega (npr. iz "0" v "1", v nasprotno smer pa ne reagiras). |
|
Nazaj na vrh |
|
 |
snoopy Član


Pridružen-a: Ned 11 Maj 2003 1:17 Prispevkov: 230 Aktiv.: 0.97 Kraj: Radovljica
|
Objavljeno: Sre Apr 19, 2006 8:09 pm Naslov sporočila: |
|
|
Sokrat je napisal/a: |
Preverjas lahko oba prehoda, ali pa samo enega (npr. iz "0" v "1", v nasprotno smer pa ne reagiras). |
Lahko pokažeš na primeru, ker je moje znanje . |
|
Nazaj na vrh |
|
 |
LoLek Član

Pridružen-a: Sre 25 Feb 2004 12:46 Prispevkov: 343 Aktiv.: 1.45
|
Objavljeno: Sre Apr 19, 2006 8:25 pm Naslov sporočila: |
|
|
Ne razumem kje je problem, ko preverjaš tipko imaš sigurno neki pogoj npr. if stavek in če je tipka pritisnjena skoči program v if stavek in pač tam "pohendlaš" zadevo okrog LCD-ja, če pa ni pritisnjena pa program preskoči if stavek.
Res ne vem v čem je problem... |
|
Nazaj na vrh |
|
 |
snoopy Član


Pridružen-a: Ned 11 Maj 2003 1:17 Prispevkov: 230 Aktiv.: 0.97 Kraj: Radovljica
|
Objavljeno: Sre Apr 19, 2006 9:23 pm Naslov sporočila: |
|
|
LoLek je napisal/a: |
Ne razumem kje je problem, ko preverjaš tipko imaš sigurno neki pogoj npr. if stavek in če je tipka pritisnjena skoči program v if stavek in pač tam "pohendlaš" zadevo okrog LCD-ja, če pa ni pritisnjena pa program preskoči if stavek.
Res ne vem v čem je problem... |
Program se stalno izvaja in vsakič , ko prideš do tega IF stavka se izvede vpis v LCD. Pomeni, tipka se pregleda vsake 10ms, vsakič je pogoj izpolnjen in vedno se izvede vpis v LCD. Kar pa ni OK.
Potrebujem ,da se izvede samo enkrat čeprav je tipka še kar stisnjena. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.56
|
Objavljeno: Sre Apr 19, 2006 9:24 pm Naslov sporočila: |
|
|
snoopy je napisal/a: |
Sokrat je napisal/a: |
Preverjas lahko oba prehoda, ali pa samo enega (npr. iz "0" v "1", v nasprotno smer pa ne reagiras). |
Lahko pokažeš na primeru, ker je moje znanje . |
Hm, tezka bo - seveda lahko napisem povsem trivialen primer, a ce zgornje razlage nisi razumel, potem ti tudi primer ne bo prav veliko pomagal.
Recimo, da v spremenljivki "stanje" hranis prejsnje stanje tipk (recimo da gre kar za stanje dolocenega 8-bitnega porta, na katerega so tipke prikljucene, izbrana tipka pa je na najnizjem pinu in posledicno v bitu stevilka 1), beri_IO_port() je funkcija, ki vrne trenutno stanje porta, na katerem so obesene tipke, naredi_nekaj_z_LCDjem() pa je stvar, ki naredi zeljeno. Predpostavljam tudi, da naj bi ta del (preverjanje tipk in izvajanje ukrepov glede na pritisk tipk) tekel v neskoncnost, torej ves cas, dokler je naprava prizgana.
Koda: |
...
char stanje;
#define MOJA_TIPKA 1
stanje = beri_IO_port();
while (1)
{
if ((beri_IO_port() & 0x01 << MOJA_TIPKA) != (stanje & 0x01))
naredi_nekaj_z_LCDjem();
stanje = beri_IO_port();
}
...
|
Tole bi odreagiralo na oba prehoda (0 v 1 in 1 v 0). Ce tega ne zelis, pogoj ustrezno popravis tako, da se bo tisti klic izvedel samo ob prehodu iz izbranega v drugo stanje (spodnji primer bi poklical funkcijo naredi_nekaj_z_LCDjem() samo ob prehodu iz 0 v 1, ob prehodu iz 1 v 0 ali dokler je stanje ves cas 1 ali 0 pa ne bi naredil nicesar):
Koda: |
...
if ((beri_IO_port() & 0x01 << MOJA_TIPKA) != (stanje & 0x01 >> MOJA_TIPKA) & ((stanje & 0x01 << MOJA_TIPKA) == 0))
...
|
Se ena opomba: primer je namenoma napisan suboptimalno, da je lazje razumljiv. V praksi bi najbrz uporabil ekskluzivni ali nad izbranima bitoma, kar je en ukaz, namesto zgornjega pogoja, ki je precej bolj obsezen. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70799.74
|
Objavljeno: Sre Apr 19, 2006 10:09 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.56
|
Objavljeno: Sre Apr 19, 2006 10:18 pm Naslov sporočila: |
|
|
Ups, v mojem primeru je tipkarska napaka: operatorji za pomik so cisto v vseh primerih za levi pmik in ne v desno, kot je vsaj enkrat napacno zapisano. Pozna ura in koda od katere nimam nic, pa sem manj pozoren  |
|
Nazaj na vrh |
|
 |
snoopy Član


Pridružen-a: Ned 11 Maj 2003 1:17 Prispevkov: 230 Aktiv.: 0.97 Kraj: Radovljica
|
Objavljeno: Čet Apr 20, 2006 12:10 pm Naslov sporočila: |
|
|
Hvala Maretu in Sokratu , za posredovano rešitev. Trenutno obdelujem Sokratov predlog.
Sokrat ni mi jasno zakaj se v If stavku potrebuje levi shift ?
Bom popoldan probal kako dela.
Lp
Bojan |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.56
|
Objavljeno: Čet Apr 20, 2006 3:49 pm Naslov sporočila: |
|
|
Zato, da ustrezno nastavis masko izbrane tipke - ce je I/O port recimo 8-bitni, tipka pa je obesena na 5. pinu (torej jo ponazarja 5. bit vrednosti, prebrane iz izbranega porta), potem bo (1 << 5) maska za doticni pin.
Pa se to: predspotavljam seveda, da je arhitektura, za katero to pises, low-endian. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Čet Apr 20, 2006 6:04 pm Naslov sporočila: |
|
|
[offtopic]
reče se little-endian
little-endian in big-endian probleme rešiš z makroj
[/offtopic]
 |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 495 dni
Powered by phpBB © 2001, 2005 phpBB Group
|