Fórum témák

» Több friss téma
Cikkek » Infra távirányítós lámpa
Infra távirányítós lámpa
Szerző: sonajkniz, idő: Jan 20, 2019, Olvasva: 13517, Oldal olvasási idő: kb. 4 perc
Lapozás: OK   5 / 6

Most lássuk a vevő programját:

  1. ;*******************************************************************************
  2. ;* Ledszalag fényerő szabályzó *
  3. ;*******************************************************************************
  4. LIST P=PIC10F322 ; lista megadása
  5.  RADIX hex ; alapértelmezett számrendszer megadása
  6.  #include "p10F322.inc"
  7.  
  8.  __CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_ON & _MCLRE_OFF & _LVP_OFF & _LPBOR_OFF
  9.  
  10.  CBLOCK 0x40
  11.  WAIT
  12.  IDO
  13.  CIKLUS
  14.  ADAT1
  15.  ADAT2
  16.  ADAT3
  17.  ADAT4
  18.  KONTROL1
  19.  KONTROL2
  20.  ENDC
  21.  
  22.  
  23.  
  24.  org 0x0000
  25.  nop
  26.  
  27. INICIALIZALAS
  28.  CLRF LATA
  29.  CLRF ANSELA
  30.  CLRF ADCON
  31.  MOVLW B'00001010'
  32.  MOVWF TRISA ;RA3 és RA1 bemenetnek van állítva.
  33.  MOVLW B'00001010'
  34.  MOVWF WPUA ;RA3 és RA1 belső felhúzó ellenállás bekapcsolva.
  35.  MOVLW B'00100000'
  36.  MOVWF OSCCON ;Oszcillátor 500KHz-re állítva
  37.  MOVLW B'00000001' ;Itt van engedélyezve a WPUA, valamint beállítva
  38.  MOVWF OPTION_REG ;Timer 0 1:4-es előosztása
  39.  MOVLW B'00000100'
  40.  MOVWF T2CON ;Timer 2 bekapcsolása elő és utó osztó nélkül
  41.  MOVLW .249
  42.  MOVWF PR2 ;PWM periódus idejének beállítása 500Hz-re
  43.  MOVLW B'10000000'
  44.  MOVWF PWM1CON ;PWM 1 kiválasztása
  45.  MOVLW .60
  46.  CLRF PWM1DCL ;Kitöltési tényező beállítása. A LED-ek fényereje állít-
  47.  MOVWF PWM1DCH ;ható itt be a tápfeszültség mértékének megfelelően.
  48.  MOVLW B'00100011'
  49.  MOVWF WDTCON ;Watchdog timer beállítása 2 percre
  50.  ;---------------
  51. MAIN ;-------------------Alaphelyzet, adat vétele-------------
  52.  CLRWDT ;Alaphelyzetben, amíg a lámpa felkapcsolása nem történt
  53.  BCF INTCON,2 ;meg, a watchdog számlálója folyamatosan törlésre
  54.  MOVLW .32 ;kerül. Timer 0 időzítő feladata, hogy a bejövő jelre
  55.  MOVWF CIKLUS ;való várakozást kb 8 milisecenként megszakítsa és
  56. VETEL ;a vételi ciklust újra indítsa. Ilyenkor törli a
  57.  BTFSC INTCON,2 ;watchdog timert is. Így egy esetleges zavarjel, vagy
  58.  GOTO MAIN ;hibás vétel esetén dobja az adatot és újat vár.
  59.  BTFSC PORTA,1 ;Az adó két adás közötti várakozása is ezt a célt
  60.  GOTO VETEL ;szolgálja, hogy ha hiba volt a vételben, a vevő a
  61.  CLRF TMR0 ;következő adatcsomagot már tudja fogadni. Vétel
  62.  BCF INTCON,2 ;megkezdésekor törlésre kerül Timer 0 számlálója, hogy
  63.  MOVLW .16 ;vétel közben nehogy újra indítson.
  64.  MOVWF WAIT ;Ha jött be jel, várakozik usec-et, majd a négy adat-
  65.  DECFSZ WAIT ;byte bitjeit a 4. byteval kezdve egymás után eggyel
  66.  GOTO $-1 ;balra tolja. Ezután törli a 4. adatbyte 0-ás bitjét.
  67.  RLF ADAT4 ;majd megvizsgálja az adatvonalat. Ha az adatvonal 1
  68.  RLF ADAT3 ;akkor a 4. byte 0-ás bitjét is egybe állítja.
  69.  RLF ADAT2 ;Ezután addig figyeli az adatvonalat, míg az 1-be nem
  70.  RLF ADAT1 ;vált. Ha ez megtörténik, és még nem érkezett meg mind
  71.  BCF ADAT4,0 ;a 32 bit, visszatér a ciklus elejére.
  72.  BTFSS PORTA,1
  73.  BSF ADAT4,0
  74.  BTFSS PORTA,1
  75.  GOTO $-1
  76.  DECFSZ CIKLUS
  77.  GOTO VETEL
  78.  MOVLW .112 ;--------------Adat ellenőrzés-------------
  79.  SUBWF ADAT1,F ;Ha a vétel lezajlott, ellenőrzi a bejövő adatokat.
  80.  BTFSS STATUS,Z ;Ha mind a 4 adat megfelelt, bekapcsolja a PWM
  81.  GOTO MAIN ;kimenetet. Végezetül beállít egy várakozási időt.
  82.  MOVLW .25
  83.  SUBWF ADAT2,F
  84.  BTFSS STATUS,Z
  85.  GOTO MAIN
  86.  MOVLW .52
  87.  SUBWF ADAT3
  88.  BTFSS STATUS,Z
  89.  GOTO MAIN
  90.  MOVLW .250
  91.  SUBWF ADAT4
  92.  BTFSS STATUS,Z
  93.  GOTO MAIN
  94.  BSF PWM1CON,6
  95.  MOVLW .250
  96.  MOVWF IDO
  97. VARAKOZAS ;---------------Biztonsági várakozás---------------
  98.  CLRF TMR0
  99.  BCF INTCON,2
  100.  BTFSS INTCON,2
  101.  GOTO $-1
  102.  BCF INTCON,2 ;Ez a kb. 4 másodperces várakozás azért van,
  103.  DECFSZ IDO ;hogy megakadályozza a véletlen távirányító
  104.  GOTO VARAKOZAS ;nyomkodás nem várt hatását.
  105.  MOVLW .250
  106.  MOVWF IDO
  107. VARAKOZAS2
  108.  CLRF TMR0
  109.  BCF INTCON,2
  110.  BTFSS INTCON,2
  111.  GOTO $-1
  112.  BCF INTCON,2
  113.  DECFSZ IDO
  114.  GOTO VARAKOZAS2
  115. MAIN2 ;-------------Kikapcsoló jelre való várakozás----------
  116.  BCF INTCON,2
  117.  MOVLW .32 ;Innentől a program gyakorlatilag ismétlődik.
  118.  MOVWF CIKLUS ;annyi külömbséggel, hogy most a vett jel kikapcsolja
  119. VETEL2 ;a lámpát, illetve nem törlődik a watchdog, tehát
  120.  BTFSC INTCON,2 ;ha lejár, reseteli a programot, azaz lekapcsol a
  121.  GOTO MAIN2 ;lámpa.
  122.  BTFSC PORTA,1
  123.  GOTO VETEL2
  124.  CLRF TMR0
  125.  BCF INTCON,2
  126.  MOVLW .16
  127.  MOVWF WAIT
  128.  DECFSZ WAIT
  129.  GOTO $-1
  130.  RLF ADAT4
  131.  RLF ADAT3
  132.  RLF ADAT2
  133.  RLF ADAT1
  134.  BCF ADAT4,0
  135.  BTFSS PORTA,1
  136.  BSF ADAT4,0
  137.  BTFSS PORTA,1
  138.  GOTO $-1
  139.  DECFSZ CIKLUS
  140.  GOTO VETEL2
  141.  MOVLW .112
  142.  SUBWF ADAT1,F
  143.  BTFSS STATUS,Z
  144.  GOTO MAIN2
  145.  MOVLW .25
  146.  SUBWF ADAT2,F
  147.  BTFSS STATUS,Z
  148.  GOTO MAIN2
  149.  MOVLW .52
  150.  SUBWF ADAT3
  151.  BTFSS STATUS,Z
  152.  GOTO MAIN2
  153.  MOVLW .250
  154.  SUBWF ADAT4
  155.  BTFSS STATUS,Z
  156.  GOTO MAIN2
  157.  BCF PWM1CON,6
  158.  CLRF LATA
  159.  MOVLW .250
  160.  MOVWF IDO
  161. VARAKOZAS3
  162.  CLRF TMR0
  163.  BCF INTCON,2
  164.  BTFSS INTCON,2
  165.  GOTO $-1
  166.  BCF INTCON,2
  167.  DECFSZ IDO
  168.  GOTO VARAKOZAS3
  169.  MOVLW .250
  170.  MOVWF IDO
  171. VARAKOZAS4
  172.  CLRF TMR0
  173.  BCF INTCON,2
  174.  BTFSS INTCON,2
  175.  GOTO $-1
  176.  BCF INTCON,2
  177.  DECFSZ IDO
  178.  GOTO VARAKOZAS4
  179.  GOTO MAIN
  180.  END

Ez már kissé hoszabb, de nem vészes. Itt jelentősen alacsonyabb az órajel. Mindössze 500 kHz.
A LED meghajtása 500 Hz-es PWM jellel történik.
Még az inicializálás során kell megadni a PWM kitöltési tényezőjét a tápfeszültség függvényében.
Az áramkört 8 V-tól 20 V-ig teszteltem, ebben a tartományban nem tapasztaltam melegedést.  

Én ezt a LED szalagot használtam.
Ez két szalag egy alumínium lemezen, ami hosszában kettéválasztható. 
Mivel ezek a LED szalagok már 8 V-tól szépen virítanak, a 12 V-on viszont már melegszenek, ezért célszerű 8-10,5 V közötti feszültségre állítani a rá jutó feszültséget. Ez az élettartamot is növeli.

De térjünk rá a programra.
A 2 perces lekapcsolási időről a watchdog timer gondoskodik. Ezért amíg a kapcsoló jelre vár, watchdog számlálóját rendszeresen törli a program. Timer 0 időzítő 8 msec-ra van állítva. 
Ez védi beragadás ellen a vételi részt. Azaz, ha 8 msec-ig nem érkezik jel, kiugrik a figyelő
ciklusból, törli watchdog számálóját, újra írja a ciklus számlálót (azaz eldobja az eddig esetleg már
beérkezett adatokat), majd visszatér bejövő jelet figyelni.
Az adó leírásában említettem, hogy a két byte közötti szünetre jelen estben nem lenne szükség,
mivel a 4 byte adatot folyamatosan veszi. Ez hosszabb adatsor esetén nem járható út, ezért
olyankor már szükség van a szünetre.
Elérkeztünk az adások közötti szünet értelmezéséhez. 
Mivel egy adatcsomag 7,5 msec alatt érkezik meg, ezért vár ki a a biztonsági rész 8 msec-ot.
Mivel történhet olyan, hogy pont a legelső bitet nem vette, ezért a 32. bitnél ragad be, ott indítja a 
8 msec-os várakozást, így kb. 9 msec múlva lehetne indítani a következő jelcsoportot. De ez ennél
a rendszernél felesleges és "necces" tűrés lenne, így adtam neki egy kis ráhagyást.
Maga a vételi folyamat roppant egyszerű. 
Ha a bemenet alacsonyra vált, továbblép a figyelő ciklusból. Elsőként törli timer 0 számlálót,
nehogy vétel közben jelezzen be. Mivel megeshet, hogy a timer 0 flag bitje már az ellenőrzés után
billent be, ezért azt is törli. Ezután várakozik egy kicsit, majd az adatbyte-ok bitjeit a 4. byte-al
kezdve egymás után eggyel balra tolja, (ezt nem lehet a végtelenségig fokozni), majd a 4. adatbyte 0-ás bitjét törli. (Ez a helyi törlés teszi feleslegessé a vétel előtti törölgetést.)
Eddigre a jel érkezésétől eltelt annyi idő (472 μsec), hogy ismét belenézzen az adatvonalba.
Amennyiben az adatvonal még mindig alacsony, akkor a 4. adatbyte 0-ás bitjét 1-be állítja.
Ha nem, akkor 0-án hagyja. Ezután addig várakozik, míg a bemenet magas nem lesz. 
Végezetül levon egyet a ciklus számlálóból, és ha még nem járt le, visszaugrik a vételi rutin
elejére. Ha lejárt, ellenőrzi a beérkezett adatokat. Ha valamelyik nem stimmel, visszaugrik a 
program legelejére. Ha minden jó, bekapcsolja a PWM kimenetet.
Ezután vár néhány másodpercet a véletlen gombnyomások ellen, majd továbblép az előző vételi rutinnal csaknem megegyező rutinra. A különbség csupán annyi, hogy most nem törölgeti a watchdogot, azaz ha lejár, reseteli a PIC-et, azaz lekapcsolja a lámpát. Valamint, hogy ha újabb jel érkezik, akkor most nem be-, hanem kikapcsolja a PWM kimenetet, és visszatér a program elejére.

Lehetett volna a vételi rutint és a várakozást is szubrutinba tenni, de mivel így is csak a 29%-a van
használva a programmemóriának, felesleges lett volna.


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 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