Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

Tipka, ki bi služila kot stikalo na AT89C2051
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Mitjaf
Novinec


Pridružen/-a: Sre Dec 2004 21:06
Prispevkov: 9
Kraj: Maribor

PrispevekObjavljeno: Sre Dec 15, 2004 9:23 pm    Naslov sporočila: Tipka, ki bi služila kot stikalo na AT89C2051 Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 555
Kraj: Ljubljana

PrispevekObjavljeno: Čet Dec 16, 2004 11:53 am    Naslov sporočila: tipka Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2058
Kraj: Ljubljana

PrispevekObjavljeno: Čet Dec 16, 2004 12:51 pm    Naslov sporočila: Odgovori s citatom

Mitja,

odgovoril ti je že Vlado, predlagam pa, da si prebereš/ogledaš knjigo:

http://www.svet-el.si/cgi-bin/okno.cgi?zap_st=5LIT0046&foo=474

Tam notri je tudi napisano, kako vezati rele, tranzistor, tipko itd... skratka osnove.

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Čet Dec 16, 2004 3:52 pm    Naslov sporočila: Odtipavanje tipke v Bascomu Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
MarE
Profesionalec


Pridružen/-a: Pet Nov 2004 23:38
Prispevkov: 177

PrispevekObjavljeno: Čet Dec 16, 2004 4:47 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Mitjaf
Novinec


Pridružen/-a: Sre Dec 2004 21:06
Prispevkov: 9
Kraj: Maribor

PrispevekObjavljeno: Čet Dec 16, 2004 9:09 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Pet Dec 17, 2004 8:41 am    Naslov sporočila: Pull up Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Profesionalec


Pridružen/-a: Tor Jan 2004 19:06
Prispevkov: 234

PrispevekObjavljeno: Pet Dec 17, 2004 10:28 am    Naslov sporočila: Odgovori s citatom

V assemblerju za pic bi zgornjo nalogo naredil v osmih vrsticah Wink - pa pravite, da je assembler kompliciran Confused 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
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Pet Dec 17, 2004 11:26 am    Naslov sporočila: Zanimivo! Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Profesionalec


Pridružen/-a: Tor Jan 2004 19:06
Prispevkov: 234

PrispevekObjavljeno: Pet Dec 17, 2004 12:52 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Pet Dec 17, 2004 2:08 pm    Naslov sporočila: Ja, mislim, da razumem Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Pet Dec 17, 2004 2:12 pm    Naslov sporočila: Napaka! Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Profesionalec


Pridružen/-a: Tor Jan 2004 19:06
Prispevkov: 234

PrispevekObjavljeno: Pet Dec 17, 2004 2:27 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Mitjaf
Novinec


Pridružen/-a: Sre Dec 2004 21:06
Prispevkov: 9
Kraj: Maribor

PrispevekObjavljeno: Sob Dec 18, 2004 2:52 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Sob Dec 18, 2004 6:12 pm    Naslov sporočila: program Odgovori s citatom

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. Mad

_________________
Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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