|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Mitjaf Novinec
Pridružen/-a: Sre Dec 2004 21:06 Prispevkov: 9 Kraj: Maribor
|
Objavljeno: Sre Dec 15, 2004 9:23 pm Naslov sporočila: Tipka, ki bi služila kot stikalo na AT89C2051 |
|
|
Pozdravljeni !
Pri izdelavi vezja z mikrokontrolerjem AT89C2051 sem naletel na problem (programiranje) kako bi naredil-sprogramiral, da bi ob pritiku na tipko (ki je vezana na mikrokontroler) prižgal oz. ugasnil npr. LED diodo oz. rele vezan na mikrokonroler.
Torej, da ko bi stisnil na tipko T1 bi se Led prižgala in ko bi ponovno stisnil na tipko T1 bi le ta ugasnlila.
Pregledal sem že vso literaturo, ki jo imam doma a sem zasledil, da je tak ukaz povsod izveden z dvema tipkama ali pa s stikalom vezanim na mikrokontroler oz. z jumperjem.
Jaz bi na vsak način rad to led diodo oz. rele krmiril samo prek ene tipke in ne stikala vendar za to neznam napisati ustreznega ukaza v program. |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Čet Dec 16, 2004 11:53 am Naslov sporočila: tipka |
|
|
Zelo enostavno!
Px.x=1
If px.x=0 then 'pin na katerega je vezana tipka
Px.y= not Px.y 'izhodni pin
end if
Še bolj bi bilo uporabiti ukaz "debounce" ,ali pa določen čas preverjaj vhodni pin.
Vlado |
|
Nazaj na vrh |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Čet Dec 16, 2004 3:52 pm Naslov sporočila: Odtipavanje tipke v Bascomu |
|
|
Oddipavanje tipke BASCOM-u
Vezje. Tipka je vezana med vhodno/izhodnim pinom mikroprocesorja in maso, a s 'pull up' uporom, vezanim na pozitivno napajanje, tako da je ob spuščeni tipki, potencial pina visok, ob pritisnjeni tipki pa nizek, na masi. Pri 8051 procesorjih moramo tedaj ta pin programirati 'high', visoko.
Sedaj lahko programiramo:
Koda: |
tipka alias p3.7 'definiramo, kateri pin.
set pin 'postavimo ga na visok potencial
zvonec alias p3.6 ' recimo da želimo krmiliti zvonec
|
... in ostale uvodne zadeve potem program vedno pride v zanko:
Koda: |
do
if pin = 0 then
' s pravi tipka je pritisnjena,
' sedaj lahko tukaj držimo prižgano luč ali zvonec
' ki bo gorela, vse dokler držimo tipko
set zvonec, luč, ..
else
reset zvonec, luč,..
endif
... in ostale stvari, ki ji procesor dela v zanki..
... vse dokler se ne vrne nazaj na začetek zanke
loop
|
Če pa hočemo z enim pritiskom na tipko prižgati luč, pri drugem
pritisku na tipko pa jo ugasniti pa je treba delati tako:
Koda: |
do
if pin = 0 then
' tipko smo pritisnili
' sedaj spremenimo stanje luči/zvonca
zvonec = not zvonec
wait 1 'čakamo sekundo, da človek ponovno spusti tipko
endif
...
loop
|
Če bo človek kar naprej držal tipko, tedaj bo zvonec zvonil sekundo,
program bo po sekundi zapustil 'wait zanko' in se vrnil na začetek, kjer
bo spet zasledil pritisnjeno tipko in zvonec bo po sekundi nehal zvoniti, in
po sledeči sekundi spet začel, vse dokler bo tipka pritisnjena.
Če je to vse, kar ima program delati, potem je tako dovolj dobro. Če pa programa ne smemo zavirati z ukazom 'wait', ker mora recimo program poleg odtipavanja tipke nadzirati tudi druge naprave, ki ne smejo ostati celo sekundo brez nadzora, tedaj si je potrebno pomagati z dodatnim bitom, ki bo recimo 1, če je bila tipka pred pritiskom tudi spuščena. Torej poleg omenjenega definiramo še spremenljivko
Koda: |
dim spuščena as bit
|
In sedaj gremo v zanko:
Koda: |
do
if tipka = 0 and spuščena = 1 then
zvonec = not zvonec
spuščena = 0
endif
if tipka = 1 and spuščena = 0 then
spuščena = 1
endif
..
loop
|
Tako bo ob enem pritisku na tipko se zvonec vklopil, ob drugem pa spet izklopil. Sedaj pa naletimo na drug problem: Tipka mehansko krmili dve kovinski kotvi, ki se ob pritisku na tipko dotakneta ena ob drugo in tako naredita stik. Problem, pa je v tem, ker se ne dotakneta 'lepo', temveč 'zaletita' ena v drugo, potem se odbijeta ena od druge in spet zaletita, dokler ne obstaneta v stiku. (Odbiti se, angl. bounce izg. bauns)
Naš mikroprocesor je silno hiter in bi pri zgornjem program programu tako odbijanje kotve kontaktov imel za večkratno pritiskanje in spuščanje tipke. Še posebej nerodno bi bilo, če bi imeli za nalogo šteti, kolikokrat je človek pritisnil na tipko. En pritisk na tipko bi lahko štel za dva, tri, celo več pritiskov na tipko. Zato so avtorji bascoma izdelali debounce ukaz, ukaz, ko nas reši pri tem. Ukaz je narejen tako, da ima vgrajeno zakasnitev, (ki jo s config debouce lahko določimo, kolikšna bodi), po kateri se kotva sigurno umiri, in šele potem gre program, kamor je potrebno. Zgornji program z uporabo debounce ukaza izgleda lepo tako:
Koda: |
do
debounce tipka, 0, preklopi, sub
' pomeni, ob pritisku na tipko izvedi podprogram z imenom preklopi
.....
in ostalo v zanki
loop
preklopi:
zvonec = not zvonec
return
|
.............
Upam, da sem razjasnil, kako je s tem.
Pozdrav
Vilko _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
MarE Profesionalec
Pridružen/-a: Pet Nov 2004 23:38 Prispevkov: 177
|
Objavljeno: Čet Dec 16, 2004 4:47 pm Naslov sporočila: |
|
|
BASCOM mi nekako ne "potegne". A se da narest npr. tako finto:
Koda: | //----------------------------------------------------------------------------
static void delay_10ms (uchar t)
{
uchar i;
do
{ for (i = 3; i; i--)
{ fl3ms33 = 0;
while (!fl3ms33)
PCON |= _IDL;
}
feed_wdog ();
}while (--t);
}
//----------------------------------------------------------------------------
static void key_delay ()
{
if (tout)
{ if (keyp & KEYMASK) tout = 0; // if key pressed, reset tout
tout--;
if (!tout)
{ blink = 0; // timeout expired
SP = savsp;
return;
}
}
delay_10ms (10); // 100 ms delay
}
//----------------------------------------------------------------------------
static void start_tout () // start editor timeout function
{
tout = 0xFF;
savsp = SP;
}
//----------------------------------------------------------------------------
static void stop_tout () // stop editor timeout function
{
tout = 0;
}
//-------------------------------------------------------------------------
static void wait_release_key ()
{
do
key_delay ();
while (keyp & KEYMASK);
}
|
bistvo je v tistem
savsp = SP;
potem npr. zgleda ena rutina za editiranje npr. dvomestne BCD cifre takole:
Koda: | static uchar edit_BCD_byte (uchar val, uchar max, uchar pos)
{
bit enice;
LED_cpos (pos);
wait_release_key ();
enice = 0;
do
{ if (UP)
{ if (!enice)
{ val += 0x10;
if ((val & 0xf0) > max) val &= 0x0f;
}
else
{ val++;
if ((val > max) || ((val & 0x0f) >= 0x0a))
val &= 0xf0;
LED_cpos (pos-1);
}
BCD_wr(val);
LED_cpos (pos);
wait_release_key ();
}
if (RIGHT)
{ if (enice) break;
if (val > max) BCD_wr (val = max);
LED_cpos (++pos);
enice = 1;
wait_release_key ();
}
key_delay ();
}while (!MODE);
if (val > max)
{ if (enice) LED_cpos (pos-1);
BCD_wr (val = max);
}
return (val);
}
|
za userja tako nastane zelo koristna funkcija timeouta, če določen čas na tipko ne pritisne, se vrne na nivo, kjer si izvedel start_tout () |
|
Nazaj na vrh |
|
|
Mitjaf Novinec
Pridružen/-a: Sre Dec 2004 21:06 Prispevkov: 9 Kraj: Maribor
|
Objavljeno: Čet Dec 16, 2004 9:09 pm Naslov sporočila: |
|
|
Vilko!
Zanima me kako vežem ta pull up upor v vezje direktno na napajanje (5V) preko upora 4,7k na pin mikrokontrolerja na katerega je vezano tudi stikalo (tipka). |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Pet Dec 17, 2004 8:41 am Naslov sporočila: Pull up |
|
|
Pull up je upor cca 10k med pinom in +5v
Stikalo, tipko, vežeš med pinom in maso.
Vilko _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Pet Dec 17, 2004 10:28 am Naslov sporočila: |
|
|
V assemblerju za pic bi zgornjo nalogo naredil v osmih vrsticah - pa pravite, da je assembler kompliciran Vrjetno pa bi assemblerska koda za atmel izgledala podobno? To bi potem lahko vrinil v bascomovo kodo.
Koda: | #define TIPKA PORTB,0
#define IZHOD PORTB,1
;---------------------------------------
;on/off z eno tipko
;---------------------------------------
ON_OFF
btfss TIPKA
goto $-1
btfss IZHOD
goto I_ON
bcf IZHOD
return
I_ON
bsf IZHOD
return
|
(predpostavlja se, da je procedura "ON_OFF" poklicana ko se tipka pritisne -nizko stanje na pinu "TIPKA" ko je le ta spuščena je na pinu logična "1") |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Pet Dec 17, 2004 11:26 am Naslov sporočila: Zanimivo! |
|
|
Pozdravljen,
izgleda, da bomo vsi izvedli malo šolo programiranja! Fino!
Silvo, daj prosim malo komentarja zraven! Obrazloži prosim ukaze btfss, bcf in bsf! Nekako si mislim, da so to pogojni ukazi skoka,
bcf je najbrž bit clear, bsf bo verjetno bit set, ampak malo poduka bi mi prav prišlo! Hvala!
Vilko _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Pet Dec 17, 2004 12:52 pm Naslov sporočila: |
|
|
Citiram: | Silvo, daj prosim malo komentarja zraven! Obrazloži prosim ukaze btfss, bcf in bsf! Nekako si mislim, da so to pogojni ukazi skoka, |
instrukcija "BTFSS" ima nekako pomen skoka. Le ta preverja določen bit poljubnega registra. V koliko je ta postavljen preskoči vrstico ki sledi. Če, kometiram zgornji primer:
btfss TIPKA ;-enako napisano bi bilo btfss PORTB,0 torej, ko bo na izhodu RB0 stanje 1 takrat se ne bo upoštevala vrstica, ki sledi to je goto $-1 kar pomeni skok za eno vrstico nazaj. (Lahko bi mesto označil tudi z labelo ter namesto $-1 napisal ime labele kot je to narejeno spodaj) Torej vse se bo ponavljalo v zanki dokler na ne bo omenjen bit postavljen.
bsf IZHOD ;enako napisano bsf PORTB,1 torej instrukcija postavi bit RB1 - to je en izhod na mikrokontrolerju.
bcf IZHOD ;briše bit
Če bi zgornjo kodo preprosto napisal z besedami:
Ko bo pin RB0 nizek "vskočim" v to proceduro, čakam v zanki dokler pin ni spet visok (tipka spuščena -pullup upor potegne pin navzgor) na kar preverim kako je trenutno stanje na izhodu (RB1), če je visoko ga dam "dol" sicer "gor" . |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Pet Dec 17, 2004 2:08 pm Naslov sporočila: Ja, mislim, da razumem |
|
|
Ja, mislim, da razumem:
V glavnem programu testiraš, ali je tipka pritisnjena, in v tem slučaju kličeš podprogram ON_OFF.
V tem podprogramu najprej počakaš, (prvi dve instrukciji), da bo tipka spuščena in potem preklopiš stanje izhoda, ter se vrneš v glavni program.
Ostane le še rešiti problem odskakovanja kotve, debouncing, ki ga Bascom rešuje z ukazom Debounce. Vendar klobuk dol: Assembler je orodje, s katerim se da narediti vse.
Hvala!
Vilko _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Pet Dec 17, 2004 2:12 pm Naslov sporočila: Napaka! |
|
|
V Bascom programu sem naredil napako pri:
Definiral sem alias
tipka alias p3.7 in potem sem, namesto da bi uporabljal na novo definirano ime 'tipka' uporabil v nekaterih instrukcijah ime pin namesto tipka. tako bi se moral ukaz glasiti
set tipka in ne
set pin in tako na več mestih.
Oprostite
VIlko _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Pet Dec 17, 2004 2:27 pm Naslov sporočila: |
|
|
Citiram: | Ostane le še rešiti problem odskakovanja kotve. |
Vilko tudi to ne predstavlja kak večji problem. Na začetku rutine bi dodal rutinco, ki bi za par uS zadržala program, da se kontaki "umirjo"
primer nekaj uS dolge pavze
Koda: |
movlw .10 ;v W "akumolator" polnim z vrednostjo 10
movwf TEST ; to vrednost preneseno v prost splošno nameski register
decfsz TEST,f ;instukcija "dcfsz" odšteje od registra 1 ko je rezultat 0
goto $-1 ;preskoči to vrstico sicer se program izvaja v zanki
........ ; čas "pavze" je še odvisen od oscilatorja
........ ;
|
v asemblerju za namen korekcije časov izvajanja rutin obstaja instrukcija "NOP" , ki porabi en ukazen cikel sicer nima nobenega drugega vpliva na nič niti na statusne bite. |
|
Nazaj na vrh |
|
|
Mitjaf Novinec
Pridružen/-a: Sre Dec 2004 21:06 Prispevkov: 9 Kraj: Maribor
|
Objavljeno: Sob Dec 18, 2004 2:52 pm Naslov sporočila: |
|
|
Vilko !
Program deluje (debounce) in ko na hitro pritisneš tipko ne preklopi - tako kot more bit.
Ko protisneš tipko normalno se v mojem primeru Led dioda vklopi vendar ko ponovno pritisnem tipko se le ta noče izklopiti.
Vezal sem pin na pull up upor le tega pa na +5V kot piše zgoraj. |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Sob Dec 18, 2004 6:12 pm Naslov sporočila: program |
|
|
Pošlji mi program in opis vezja v zasebnem sporočilu, da vidim, kako in kaj.
Vilko
Eno od Murphyjevih pravil pravi:
Če lahko kaj narobe gre, bo narobe tudi šlo. _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
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 You cannot attach files in this forum You cannot download files in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|