Előszőr nézzük az adó programját:
;*******************************************************************************
;* Infrás kapcsoló adó *
;*******************************************************************************
LIST P=PIC10F322 ; lista megadasa
RADIX hex ; alapertelmezett szamrendszer megadasa
#include "p10F322.inc"
__CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _MCLRE_OFF & _LVP_OFF & _LPBOR_OFF
CBLOCK 0x40
ADATBYTE
CIKLUS
CIKLUS2
CIKLUS3
ENDC
WAIT MACRO MENNYIT
MOVLW MENNYIT
MOVWF CIKLUS2 ;A késleltetés makrója a T2 időrelén alapul.
BTFSS PIR1,1 ;Ez nem csak kényelmi megoldás, hanem az adás
GOTO $-1 ;pontossá és egyszerűvé tétele miatt van.
BCF PIR1,1
DECFSZ CIKLUS2
GOTO $-4
ENDM
org 0x0000
nop
INICIALIZALAS
CLRF LATA
CLRF ANSELA
CLRF ADCON
MOVLW B'00001000' ;RA3 bemenet. minden egyéb kimenetnek állítva
MOVWF TRISA
CLRF OPTION_REG ;Option reg törölve, hogy engedélyezze a WPUA-t
MOVLW B'00001000' ;RA3 belső felhúzó ellenállása bekapcsolva
MOVWF WPUA
MOVLW B'01010000' ;Oscillátor 4MHz-re állítva.
MOVWF OSCCON
MOVLW B'00000100' ;T2 bekapcsolása. Elő és utóosztó nincs.
MOVWF T2CON ;T2 időzítő (PWM periódus ideje) 25-re állítva,
MOVLW .25 ;(ami valójában 26) így a PWM frekvencia kb
MOVWF PR2 ;38,5 KHz.
MOVLW B'10000000' ;PWM2 kiválasztása.
MOVWF PWM2CON
CLRF PWM2DCL
MOVLW .13 ;Kitöltés beállítása
MOVWF PWM2DCH
MOVLW .20
MOVWF CIKLUS3
;---------------
MAIN
WAIT .250 ;Adatküldés előtti és küldések közötti kb. 13msec-es
WAIT .250 ;várakozás
MOVLW .112
MOVWF ADATBYTE
CALL KULDES ;Első adat küldése
WAIT .10 ;Az adatok küldése között van kb. 250 usec várakozás
MOVLW .25
MOVWF ADATBYTE
CALL KULDES ;Második adat küldése
WAIT .10
MOVLW .52
MOVWF ADATBYTE
CALL KULDES ;Harmadik adat küldése
WAIT .10
MOVLW .250
MOVWF ADATBYTE
CALL KULDES ;Negyedik adat küldése
DECFSZ CIKLUS3 ;Adatcsomag visszaszámláló. 20 küldés után befejezi
GOTO MAIN ;az adást.
CLRF PWM2CON
CLRF LATA
GOTO $-0
KULDES
MOVLW .8 ;Ciklusszámlálót feltöltöm 8-al.
MOVWF CIKLUS
KULDES1
WAIT .10 ;Az adatbyte elküldése egyszerűsítve van. A WAIT
BSF PWM2CON,6 ;időzítő a PWM periódusait számolja. Bit küldés előtt
WAIT .10 ;10 periódust kivár, majd engedélyezi PWM kimenetét.
BTFSS ADATBYTE,7 ;Újabb 10 periódus után megnézi, hogy az adatbyte 7-es
BCF PWM2CON,6 ;bitje mi. Ha alacsony, lekapcsolja a PWM kimenetet.
WAIT .15 ;Ezután újabb 15 periódust kivár, majd függetlenül a
BCF PWM2CON,6 ;PWM kimenet állapotától, lekapcsolja azt.
RLF ADATBYTE ;Ezután eggyel balra tolja az adatbyte bitjeit.
DECFSZ CIKLUS ;Végül levon egyet a ciklusszámláló értékéből.
GOTO KULDES1 ;Ha ciklusszámláló még nem 0, akkor ciklus elejére, ha
RETURN ;0, akkor a meghívási pontra ugrik.
;-------------------------------------------------------------------------------
END
Most pedig az ígért részletes leírás:
A konfigurációs beállítások és a cblock elemeinek beállítása után a 18. sortól a 24. sorig található egy makró. Ez a makró a programon belüli késleltetések egyszerűbb létrehozásáért készült.
A timer 2-es időrelén alapul, annak ciklusait számolja. Timer 2 az infra adó frekvenciájáért felel, de ezt majd később.
Az inicializálást nem részletezem, mert azt szerintem mindenki érti, aki bármilyen nyelven is
írt már programot, de azért érdemes a beállításokat megnézni.
Maga a tényleges program egy 13 msec-os várakozással kezdődik. Mivel az adás többször
is lemegy, ezért az adások közt kell egy kis szünetet tartani. Ennek a szünetnek a vevő programjában van igazán jelentősége. Ott majd látni fogjátok, miért épp ennyi ez a szünet.
Az 52. sortól kezdődik az adatok elküldése. Két byte küldés között is van egy rövid szünet. Ennek igazából nincs jelentősége jelen esetben, de ha nagyobb adatmennyiséget küldenénk, akkor a vevő programja más volna, és két byte között akkor már kell a szünet.
A 73. sorban lévő ciklusszámláló lejártáig ismétlődik a program. Ezt követően lekapcsol a
kimenet és a 77. sorban gyakorlatilag unatkozik a PIC.
Most pedig jöjjön a küldő rutin. Ez igényli a legtöbb magyarázatot, mert eléggé eltér a megszokott
megoldásoktól.
A 79-80-as sor még szokásos, feltölti a ciklusszámlálót a byte elküldéséhez.
Utána jön a tényleges adás, ami egy szünettel kezd. Bár ez a szünet elvben lehetne a rutin végén
is, de akkor az első PWM impulzus kimaradna. Maga a szünet 10 PWM ciklus hosszú. Az adás rutin
egyik érdekessége, hogy időzítések helyett a kiküldött impulzusokat számolja.
Tehát a szünet után bekapcsolja a PWM kimenetet, azaz a beállításoknak megfelelő ütemben és
ideig villogtatja a LED-et. 10 impulzust kivár, majd megnézi, hogy a küldendő byte 7. bitje milyen.
Ha alacsony, lekapcsolja a PWM kimenetet, ha magas, békén hagyja. Ezután vár újabb 15
impulzust, és függetlenül attól, hogy az előbb lekapcsolta-e vagy sem a PWM kimenetet, most megteszi. Ezt követően 1-el balra tolja az adatbyte bitjeit, majd levon egyet a ciklus számlálóból.
Amennyiben még nem járt le, úgy a rutin elejére ugrik, ha lejárt visszatér a meghívási pontra.
Ezzel a módszerrel egyfelől nagyon egyszerű az adás rutin, másfelől a vevő számára mindig
pontos mennyiségű impulzus érkezik, azaz az időzítésekben nem keletkezhet elcsúszás.
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!