|
Cikkek » Infra távirányítós lámpa
Most lássuk a vevő programját:
;*******************************************************************************
;* Ledszalag fényerő szabályzó *
;*******************************************************************************
LIST P=PIC10F322 ; lista megadása
RADIX hex ; alapértelmezett számrendszer megadása
#include "p10F322.inc"
__CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_ON & _MCLRE_OFF & _LVP_OFF & _LPBOR_OFF
CBLOCK 0x40
WAIT
IDO
CIKLUS
ADAT1
ADAT2
ADAT3
ADAT4
KONTROL1
KONTROL2
ENDC
org 0x0000
nop
INICIALIZALAS
CLRF LATA
CLRF ANSELA
CLRF ADCON
MOVLW B'00001010'
MOVWF TRISA ;RA3 és RA1 bemenetnek van állítva.
MOVLW B'00001010'
MOVWF WPUA ;RA3 és RA1 belső felhúzó ellenállás bekapcsolva.
MOVLW B'00100000'
MOVWF OSCCON ;Oszcillátor 500KHz-re állítva
MOVLW B'00000001' ;Itt van engedélyezve a WPUA, valamint beállítva
MOVWF OPTION_REG ;Timer 0 1:4-es előosztása
MOVLW B'00000100'
MOVWF T2CON ;Timer 2 bekapcsolása elő és utó osztó nélkül
MOVLW .249
MOVWF PR2 ;PWM periódus idejének beállítása 500Hz-re
MOVLW B'10000000'
MOVWF PWM1CON ;PWM 1 kiválasztása
MOVLW .60
CLRF PWM1DCL ;Kitöltési tényező beállítása. A LED-ek fényereje állít-
MOVWF PWM1DCH ;ható itt be a tápfeszültség mértékének megfelelően.
MOVLW B'00100011'
MOVWF WDTCON ;Watchdog timer beállítása 2 percre
;---------------
MAIN ;-------------------Alaphelyzet, adat vétele-------------
CLRWDT ;Alaphelyzetben, amíg a lámpa felkapcsolása nem történt
BCF INTCON,2 ;meg, a watchdog számlálója folyamatosan törlésre
MOVLW .32 ;kerül. Timer 0 időzítő feladata, hogy a bejövő jelre
MOVWF CIKLUS ;való várakozást kb 8 milisecenként megszakítsa és
VETEL ;a vételi ciklust újra indítsa. Ilyenkor törli a
BTFSC INTCON,2 ;watchdog timert is. Így egy esetleges zavarjel, vagy
GOTO MAIN ;hibás vétel esetén dobja az adatot és újat vár.
BTFSC PORTA,1 ;Az adó két adás közötti várakozása is ezt a célt
GOTO VETEL ;szolgálja, hogy ha hiba volt a vételben, a vevő a
CLRF TMR0 ;következő adatcsomagot már tudja fogadni. Vétel
BCF INTCON,2 ;megkezdésekor törlésre kerül Timer 0 számlálója, hogy
MOVLW .16 ;vétel közben nehogy újra indítson.
MOVWF WAIT ;Ha jött be jel, várakozik usec-et, majd a négy adat-
DECFSZ WAIT ;byte bitjeit a 4. byteval kezdve egymás után eggyel
GOTO $-1 ;balra tolja. Ezután törli a 4. adatbyte 0-ás bitjét.
RLF ADAT4 ;majd megvizsgálja az adatvonalat. Ha az adatvonal 1
RLF ADAT3 ;akkor a 4. byte 0-ás bitjét is egybe állítja.
RLF ADAT2 ;Ezután addig figyeli az adatvonalat, míg az 1-be nem
RLF ADAT1 ;vált. Ha ez megtörténik, és még nem érkezett meg mind
BCF ADAT4,0 ;a 32 bit, visszatér a ciklus elejére.
BTFSS PORTA,1
BSF ADAT4,0
BTFSS PORTA,1
GOTO $-1
DECFSZ CIKLUS
GOTO VETEL
MOVLW .112 ;--------------Adat ellenőrzés-------------
SUBWF ADAT1,F ;Ha a vétel lezajlott, ellenőrzi a bejövő adatokat.
BTFSS STATUS,Z ;Ha mind a 4 adat megfelelt, bekapcsolja a PWM
GOTO MAIN ;kimenetet. Végezetül beállít egy várakozási időt.
MOVLW .25
SUBWF ADAT2,F
BTFSS STATUS,Z
GOTO MAIN
MOVLW .52
SUBWF ADAT3
BTFSS STATUS,Z
GOTO MAIN
MOVLW .250
SUBWF ADAT4
BTFSS STATUS,Z
GOTO MAIN
BSF PWM1CON,6
MOVLW .250
MOVWF IDO
VARAKOZAS ;---------------Biztonsági várakozás---------------
CLRF TMR0
BCF INTCON,2
BTFSS INTCON,2
GOTO $-1
BCF INTCON,2 ;Ez a kb. 4 másodperces várakozás azért van,
DECFSZ IDO ;hogy megakadályozza a véletlen távirányító
GOTO VARAKOZAS ;nyomkodás nem várt hatását.
MOVLW .250
MOVWF IDO
VARAKOZAS2
CLRF TMR0
BCF INTCON,2
BTFSS INTCON,2
GOTO $-1
BCF INTCON,2
DECFSZ IDO
GOTO VARAKOZAS2
MAIN2 ;-------------Kikapcsoló jelre való várakozás----------
BCF INTCON,2
MOVLW .32 ;Innentől a program gyakorlatilag ismétlődik.
MOVWF CIKLUS ;annyi külömbséggel, hogy most a vett jel kikapcsolja
VETEL2 ;a lámpát, illetve nem törlődik a watchdog, tehát
BTFSC INTCON,2 ;ha lejár, reseteli a programot, azaz lekapcsol a
GOTO MAIN2 ;lámpa.
BTFSC PORTA,1
GOTO VETEL2
CLRF TMR0
BCF INTCON,2
MOVLW .16
MOVWF WAIT
DECFSZ WAIT
GOTO $-1
RLF ADAT4
RLF ADAT3
RLF ADAT2
RLF ADAT1
BCF ADAT4,0
BTFSS PORTA,1
BSF ADAT4,0
BTFSS PORTA,1
GOTO $-1
DECFSZ CIKLUS
GOTO VETEL2
MOVLW .112
SUBWF ADAT1,F
BTFSS STATUS,Z
GOTO MAIN2
MOVLW .25
SUBWF ADAT2,F
BTFSS STATUS,Z
GOTO MAIN2
MOVLW .52
SUBWF ADAT3
BTFSS STATUS,Z
GOTO MAIN2
MOVLW .250
SUBWF ADAT4
BTFSS STATUS,Z
GOTO MAIN2
BCF PWM1CON,6
CLRF LATA
MOVLW .250
MOVWF IDO
VARAKOZAS3
CLRF TMR0
BCF INTCON,2
BTFSS INTCON,2
GOTO $-1
BCF INTCON,2
DECFSZ IDO
GOTO VARAKOZAS3
MOVLW .250
MOVWF IDO
VARAKOZAS4
CLRF TMR0
BCF INTCON,2
BTFSS INTCON,2
GOTO $-1
BCF INTCON,2
DECFSZ IDO
GOTO VARAKOZAS4
GOTO MAIN
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!
Értékeléshez bejelentkezés szükséges!
|
|