Fórum témák

» Több friss téma
Cikkek » Távirányító jelének fogadása uC-vel
Távirányító jelének fogadása uC-vel
Szerző: lazsi, idő: Ápr 12, 2010, Olvasva: 18739, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   3 / 6

A programnak fel kell ismernie, hogy mikor érkezik egy adatsor. Ezen belül meg kell különböztetnie az egyes biteket. A protokoll szerint bármelyik bit kezdődhet akár lefutó, akár felfutó éllel, ezért minden változást figyelni kell. Ha két él között eltelt idő 1.5 ms vagy 2 ms, akkor az egy "0" bitet jelent, ha az eltelt idő 0.6 ms vagy 1.1 ms, akkor az egy "1" bit egyik fele. Végülis elég csupán azt figyelni, hogy 1.3 ms-nál rövidebb vagy hosszabb az eltelt idő, így marad némi biztonsági tartalékunk is. Ha 2 ms-nál sokkal hosszabb ideig nem érkezik újabb él, az azt jelenti, vége az adatsornak. Ha ilyenkor megérkezett az utolsó bitünk is, akkor örülhetünk és feldolgozhatjuk a kapottakat. Ha a szükségesnél több vagy kevesebb bit érkezett, akkor valami hiba történt, ezért az addig kapott biteket eldobjuk. Az idő mérésére a uC 8 bites időzítőjét használjuk. Az órajel frekvenciája 4MHz. 1/64-es előosztót alkalmazva az alábbi értékek adódnak:

A számláló értéke A mért idő (ms) Értelmezés
38 0.6 "1" bit fele
72 1.1 "1" bit fele
83 1.3 Döntési határ
94 1.5 "0" bit

128

2 "0" bit
255 4 Túlcsordulás -> időtúllépés

A számláló értéke = (a tervezett időkülönbség s-ban) X (órajel-frekvencia Hz-ben) / (előosztó osztásaránya)

A program működése: Alapvetően az időzítő áll. Amikor megérkezik egy élváltozás, az egy EXT_INT0 (external interrupt 0) nevű megszakítást okoz. A megszakítás-rutin a számláló pillanatnyi értékétől függően több dolog közül választ:

  • Ha a számláló értéke 0, akkor még nem indítottuk el, vagyis ez egy adatsor első bitjének a kezdete. Kinullázzuk a változókat és elindítjuk az időzítőt.
  • Ha a számláló értéke 83-nál kisebb, akkor ez egy "1" bit valamelyik fele. Ha még nem érkezett ilyen, megjegyezzük, hogy ez az első fele és nullázzuk a számlálót. Ha már volt ilyen, akkor ez már a második fele, tehát megérkezett a teljes "1" bit. Töröljük a fél1bit jelzőjét, növeljük a bitek számát eggyel, tároljuk a bitet és nullázzuk a számlálót.
  • Ha nagyobb a számláló értéke, mint 83, akkor "0" bitet kaptunk. Növeljük a bitek számát eggyel, tároljuk a bitet és nullázzuk a számlálót.

Ha T0_OVF (timer 0 overflow) nevű megszakítás történik, az azt jelenti, hogy az utóbbi 4 ms alatt nem történt élváltozás. Ilyenkor meg kell vizsgálni, hogy hány bit érkezett eddig. Ha 13 darab, akkor ez a 14. bit. A fél1bit jelzőtől függően eldöntjük, hogy "0" vagy "1" értékű az utolsó bit. Mivel ez az adatsor végét jelenti, az időzítőt leállítjuk és feldolgozzuk a kapott adatsort. Ha több vagy kevesebb bit érkezett, akkor eldobjuk az eddigieket, törlünk minden változót, leállítjuk az időzítőt és várjuk a következő adatcsomagot.

A beérkezett biteket két változóban tároljuk. Függően attól, hogy az első vagy a második 7 bites csoportnál tartunk, a vettbyteL vagy a vettbyteH nevű változót használjuk. A változót logikai léptetéssel eltoljuk balra egy helyi-értékkel. Ilyenkor a jobb oldali, legalacsonyabb értékű bit helyére "0" érkezik. Ha nekünk "1" bitünk van, akkor azt be kell írnunk oda.

Az itt látható folyamatábra alapján más mikrokontrollerre is könnyen átírható a program.


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 6
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem