Aeronautica | Comunicatii | Constructii | Electronica | Navigatie | Pompieri | |
Tehnica mecanica |
PROIECTAREA SOFTWARE A VARIATORULUI DE PUTERE PENTRU SURSE DE INCALZIRE
1. Organigrame de proces oferite aplicatie propriu - zise
Timp maxim parcurgere bucla < 128 μs maxim 128 instructiuni.
Sincronizare retea
Se face pe primul GP2/TOCKI a microcontrolerului acesta avand posibilitatea de a sesiza inceputul fiecarei semiperioade pozitive, urmand ca inceputul semiperioadei negative sa se determine soft dupa o intarziere de 10ms.
La fiecare trecere prin 0 detectata, avem:
Tfinal se incarca cu valoarea TMR0 + TDEELAY cand putem avea teoretic comanda in faza
Se incrementeaza N_IRper, la numar de perioade contorizate in Receptie_IR
Se incrementeaza N_PER_TREL - numar perioade cat tasta este relaxata
PROGRAM PRINCIPAL
ORGANIGRAMA RECEPTIE DATE SERIALE
Receptia datelor seriale este sesizata pe pinul RX0 cel microcontrolerului sub denumirea IR REC.
N_IRper = timpul cat tine receptia se masoara in numar de perioade, o receptie IR nu poate sa dureze mai mult de 3 perioade, adica 3 x 20ms = 60ms.
Se disting 4 regimuri de lucru:
Regimul 0 - detecteaza frontul negativ, ceea ce reprezinta inceputul unei receptii IR si inceputul bitului 1 din cuvantul de comanda.
Regimul 1 - detecteaza frontul crescator, adica terminarea rececptiei primului bit din cuvantul de comanda, si deci, se poate lua decizia asupra valorii lui.
Regimul 2 - se detecteaza, pe front negativ, inceputul receptiei bitului doi din cuvantul de comanda.
Regimul 3 - se detecteaza, pe front crescator, sfarsitul receptiei bitului 2 din cuvantul de comanda, si deci, valoarea lui cat si sfarsitul transmisiei IR.
In subrutina CLR_IR, se sterg toate variabilele inscrise pana in acest moment, facand nula receptia si totul reluandu-se de la 0. Acest lucru se intampla la aparitia semnalelor parazite sau la orice alta neregula.
REGIMUL 0
REGIMUL 1
REGIMUL 2
REGIMUL 3
ORGANIGRAMA APASARE TASTA
Comanda senzoriala se poate face numai pe fronturi negative cand este depasita tensiunea de prag;
Nper_T0 = numar de perioade cat tasta este apasata (JFET = BLOCAT);
Nper_L = numar de perioade cat tasta este relaxata (JFET = CONDUCTIE);
Flag continuu = 1 --- impulsuri ce vin la fiecare semiperioada negativa, lucru care coincide cu modul tasta apasat continuu ;
Flag continuu = 0 ---- impulsuri ce vin ca simpla comanda;pot fi chiar si impulsuri parazite;
Flag Tasta = semafor care indica validarea apasarii tastei
CLR_RT = subrutina care anuleaza regimul Tasta Apasata reluand totul de la zero.
ORGANIGRAMA COMANDA IN FAZA
Se disting 10 regimuri de lucru dar regimurile 2, 3, 4, 5 sunt identice, adica au rolul de a da comanda de amorsare a triacului pe alternanta pozitiva de impulsuri de 30μs.
Regimurile 7, 8, 9, A, sunt identice si au rolul de a da comanda de amorsare a triacului pe alternanta negativa de impulsuri de 36μs.
Soft startul se face dupa terminarea regimului A. Flagul Soft start este gasit in 0. Atunci Tdelay care este maxim 8Ch "Becul stins" se decrementeaza pana la 2Ch minim, adica becul este aprins maxim. Cand atinge valoarea 2Ch , Flagul Soft start este trecut in "1". Trecerea lui in "0" se face de cate ori avem comanda OFF, adica odata cu aprinderea ledului.
REGIM 1
REGIM 2, 3, 4, 5
REGIM 6
NU
REGIM 7, 8, 9, A
ORGANIGRAMA TASTATURA
Gp0 = Tasta Up Gp1 = Tasta Down Gp3 = ON/OFF |
Foscilatie = 4MHz
FCLOCK = 1MHz
TCLOCK = 1μs
Factor prescare = 32
Fmodulatoare = 35.7KHz
Generarea frecventei de 36KHz se face prin rularea unor intructiuni, din care 14 instructiuni sunt pentru generarea semnalului de "1" si 14 instructiuni pentru generarea semnalului de "0", de aici rezultand un semnal cu factor de umplere 1/2 , cu durata de 28 instructiuni X 1μs per instructiune = 28μs
F = 1/T = 1/28μs = 35.7KHz
5. CONCLUZII
Scopul acestui proiect a fost realizarea hardware a unui modul care sa permita descarcarea dintr-un calculator a unei succesiuni de comenzi pentru comanda si controlul unui heater.
Partea dificila a acestui proiect a fost realizarea separarii galvanice intre partea de comanda, care este conectata direct la reteaua de 220Vca si unitatea centrala care asigura interfatarea cu alte dispozitive (PC) pentru a nu tine cont de modul de alimentare al acestora.
Am creat cateva secvente soft de a arata functionalitatea modulului pe blocuri urmand ca intr-o lucrare ulterioara sa se continue dezvoltarea soft completa ce permite comanda si controlul microsistemului atat din interiorul lui cat si din exterior prin caile de comunicatie pe care le-am creat.
O atentie deosebita s-a acordat proiectarii cablajului fiind nevoit sa lucrez cu doua planuri de masa: unul conectat la retea si celalalt conectat la partea digitala. Totodata a fost nevoie de respectarea distantei intre trasee pentru partea de comanda pe unde circula tensiunea de 220V.
6. BIBLIOGRAFIE
Gheorghe Serban - Note de curs, microprocesoare , editura Universitatii din Pitesti 2002
Bruce Eckel - Thincking in C++
Bogdan Patrut - Aplicatii in C si C++, editura Teora 1998
DCE - Note de curs - Prof. dr. ing. EMIL SOFRON;
Electronica industriala - Prof. dr. ing. NICU BIZON;
Microchip - Tehnical library 2002
7. ANEXE
Implementare software in AMS
; rca.asm
; PROGRAM VARIATOR DE PUTERE PENTRU SURSE DE INCALZIRE
; VARIANTA FINALA
LIST P=ATMEGA128
#include 'C:PROGRA~1MPLABATMEGA128.INC'
;_____ _______ ______ ____________CONSTANTE__________ ______ ____ _____ _______ ______ ______________
; CONSTANTE
T_BIT1 EQU 0X4E ; DURATA BIT 1 LOGIC TRASMISIE DATE
T_BIT0 EQU 0X3E ; DURATA BIT 0 LOGIC TRASMISIE DATE
;_____ _______ ______ ____________CONSTANTE__________ ______ ____ _____ _______ ______ ______________
;_____ _______ ______ ____________LINII DE PORT__________ ______ ____ _____ _______ ______ __________
; LINII DE PORT - IESIRI
COM_FAZA EQU 0X01 ; IESIRE COMANDA IN FAZA
COM_LED EQU 0X05 ; IESIRE COMANDA LED
; LINII DE PORT - INTRARI
SENS_TASTA EQU 0X03 ; INTRARE TASTA APASATA
IR_REC EQU 0X04 ; INTRARE RECEPTIE DATE SER IR
LINE_SYNC EQU 0X02 ; INTRARE SINCRONIZARE RETEA
;_____ _______ ______ ____________LINII DE PORT__________ ______ ____ _____ _______ ______ __________
;_____ _______ ______ ____________VARIABILE__________ ______ ____ _____ _______ ______ ______________
; ----- ----- ----VARIABILE DE UZ TEMPORAR
TEMP EQU 0X08
TEMP1 EQU 0X09
TEMP2 EQU 0X0A
; ----- ----- ----VECHILE INTRARI DE PORT
OLD_GPIO EQU 0X0B ; 0-LINE_SYNC; 1-SENS_TASTA; 2- IR_REC
; ----- ----- ----VARIABILE REFERITOARE LA COMANDA IN FAZA
T_DELAY EQU 0X0C ; TIMPUL DE INTARZIERE (HEX) CORESPUNZATOR COMENZII
T_SPER EQU 0X0D ; TIMPUL (HEX) CORESPUNZATOR UNEI SEMIPERIOADE
REGIM_F EQU 0X0E ; REGIM COMANDA IN FAZA:
; 1 - INTARZIERE COMANDA IN FAZA ALTERNANTA POZITIVA
; 2,3,4,5 - PATRU IMPULSURI COMANDA PE ALTERNANTA +
; 6 - INTARZIERE COMANDA IN FAZA ALTERNANTA NEGATIVA
; 7,8,9,A - PATRU IMPULSURI COMANDA PE ALTERNANTA -
; A(0) - IMPLEMENTARE SOFT START
T_FINAL EQU 0X0F ; TIMPUL LA CARE SE VA DA COMANDA IN FAZA (T_FINAL=TMR0)
OLD_TMR0F EQU 0X10 ; VECHEA VALOARE A TMR0 FOLOSITA PENTRU CALCUL SEMIPER
; ----- ----- ----VARIABILE REFERITOARE LA INTERPRETARE TASTA APASATA
REGIM_T EQU 0X11 ; 0 - APARE PRIMUL IMPULS DE LA INTRAREA SENS_TASTA
; 1 - SE CONTORIZEAZA IMPULSURI DE LA INTRARE TASTA
; CONTINUU, PE DURATA A 3 PERIOADE RETEA (3*20ms=60ms)
; 2 - SE CONTORIZEAZA NUMARUL DE PERIOADE RETEA PE DURATA
; CARORA APAR IMPULSURI DE LA INTRARE TASTA CONTINUU
; LA FIECARE 20 PERIOADE (400ms) SE APELEAZA SUBRUTINA MODIFCARE
; DELAY (TASTA APASATA CONTINUU). DACA SE DETECTEAZA O
; DISCONTINUITATE A APARITIEI IMPULSURILOR SI DISCONTINUITATEA
; ESTE MAI MICA DE 9 PERIOADE SE TRECE IN REGIMUL URMATOR
; 3 - DACA APAR IMPULSURI CONTINUU PE DURATA A 3 PERIOADE
; RETEA SE COMUTA OFF MODULUI
; 4 - ORICE IMPULS VENIT IN MAI PUTIN DE 1 SECUNDA ESTE
; IGNORAT
N_PERT EQU 0X12 ; NUMARUL DE PERIOADE RETEA PE DURATA CARORA APAR CONTINUU
; IMPULSURI DE LA INTRAREA DE TASTA APASATA
N_PERL EQU 0X13 ; NUMARUL DE PERIOADE RETEA SCURSE
; ----- ----- ----VARIABILE REFERITOARE LA RECEPTIA IR
REGIM_IR EQU 0X14 ; REGIM RECEPTIE INFRAROSU:
; 0 - PRIMUL IMPULS (CAZATOR) DE LA INTRARE RECEPTOR IR
; 1 - AL DOILEA IMPULS (CRESCATOR) DE LA INTRARE RECEPTOR IR
; 2 - AL TREILEA IMPULS (CAZATOR) DE LA INTRARE RECEPTOR IR
; 3 - AL PATRULEA IMPULS (CRESCATOR) DE LA INTRARE RECEPTOR IR
N_IRPER EQU 0X15 ; NUMARUL DE PERIOADE RETEA SCURSE INTRE DOUA IMPULSURI DE LA
; RECEPTOR IR - NU TREBUIE SA FIE MAI MAREDE 3
COD_IR EQU 0X16 ; CODUL TRANSMIS PRIN IR: 0 - TASTA SCADERE T_DELAY,
; 1 - TASTA CRESTERE T_DELAY, 2 - TASTA ON/OFF
OLD_TMR0IR EQU 0X17 ; VECHEA VALOARE A TMR0- FOLOSITA PENTRU MASURARE DURATA BIT
; ----- ----- ----REGISTRUL DE FLAG-URI
RFLAG EQU 0X18 ; REGISTRU DE FLAG-URI CARE CUPRINDE URMATOARELE FLAG-URI:
ON_LIGHT EQU 0X00 ; DACA ESTE 1 INDICA LUMINA ON
IN2_CHG EQU 0X01 ; INDICA DOUA INTRARI (RECEPTIE IR SI SINCRONIZARE) MODIFICATE
; SIMULTAN
FL_TASTA EQU 0X02 ; ESTE SETAT IN SUBRUTINA DE TRATARE TASTA APASATA, INDICAND
; CA IN PERIOADA RESPECTIVA UN IMPULS DE LA TASTA A FOST RECEPTIONAT
FL_CONTIN EQU 0X03 ; DACA IN SUBRUTINA DE SINCRONIZARE SE GASESTE FL_TASTA=1
; ATUNCI SE LASA FL_CONTIN=1 (INSEAMNA CA IMPULSURILE DE LA TASTA
; APAR CONTINUU, DACA NU, SE STERGE FL_CONTIN
INC_DEC EQU 0X07 ; DACA ESTE 1 INSEAMNA CA SE INCREMENTEAZA T_DELAY ALTFEL SE
; DECREMENTEAZA (FOLOSIT IN SUNRUTINA MOD_DELAY)
FL_SOFTST EQU 0X04 ; DACA ESTE 0 INSEAMNA CA SUNTEM IN REGIM SOFT START, ALTFEL
; REGIM NORMAL DE COMANDA IN FAZA
IS_COND EQU 0X05 ; INDICA INDEPLINIREA CONDITIEI DE EGALITRATE CU T_BIT1(0)
; FOLOSIT LA RECEPTIA IR
;_____ _______ ______ ____________VARIABILE__________ ______ ____ _____ _______ ______ ______________
;_____ _______ ______ ____________PROGRAM FLOW__________ ______ ____ _____ _______ ______ ___________
;_____ _______ ______ ____________INITIALIZARI__________ ______ ____ _____ _______ ______ ___________
ORG 0
MOVWF OSCCAL
movlw B'11000101' ; TMRO PRESCALAT CU 64
OPTION
bsf GPIO,COM_FAZA ; COMANDA IN FAZA BLOCATA
movlw B'11011100' ; SETARE IESIRI COMANDA LED SI COMANDA IN FAZA
TRIS GPIO ; !! TEST GP0
bsf GPIO,COM_FAZA ; SE CONFIRMA BLOCARE COMANDA IN FAZA
CLRF REGIM_F ; STERGERE VARIABILE RAM
CLRF OLD_TMR0F
CLRF REGIM_T
CLRF N_PERT
CLRF N_PERL
CLRF REGIM_IR
CLRF N_IRPER
CLRF OLD_TMR0IR
CLRF RFLAG
bcf GPIO,COM_LED ; LED-UL APRINS - SE PORNESTE PE OFF_LIGHT
movf GPIO,0 ; IN OLD_GPIO SE PUNE VALOAREA INITIALA GASITA IN GPIO
andlw B'00011100' ; IN ORDINEA: BIT0: LINE SYNC; BIT1: SENS_TASTA;
movwf TEMP ; BIT2: IR_REC
bcf STATUS,C
rrf TEMP,1
rrf TEMP,0
movwf OLD_GPIO
movlw 0x82 ; INITIALIZARE T_DELAY CU VALOAREA MAXIMA
movwf T_DELAY ; DIN CARE VA PORNI SOFT START
movlw 0x9C ; INITIALIZARE DURATA SEMIPERIOADA CU VALOAREA
movwf T_SPER ; CORESPUNZATOARE 10ms
;_____ _______ ______ ____________INITIALIZARI__________ ______ ____ _____ _______ ______ ___________
;_____ _______ ______ ____________PROGRAM PRINCIPAL__________ ______ ____ _____ _______ ______ ______
; ------ SE CITSC CELE TREI INTRARI IN REGISTRUL TEMP ASTFEL:
; ------ BIT0 - LINE_SYNC; BIT1: SENS_TASTA; BIT2: IR_REC
; ------ PENTRU ACEASTA SE MASCHEAZA PORTUL GPIO SI SE SHIFTEAZA CU 2
; ------ APOI SE COMPARA CU OLD_GPIO PENTRU A VEDEA SE INTRARI S-AU SCHIMBAT
; ------ REZULTATUL OLD_GPIO XOR TEMP SE ADUNA LA PCL PENTRU A CREA TABELA DE SALT
L_LOOP movf GPIO,0
andlw B'00011100'
movwf TEMP
bcf STATUS,C
rrf TEMP,1
rrf TEMP,1
movf TEMP,0
xorwf OLD_GPIO,0
addwf PCL,1
goto L_FAZA ; NICI O INTRARE MODIFICATA - SE TRECE LA COMANDA IN FAZA
L_1 goto L_SY ; SE ADUNA 1 - SCHIMBARE INTRARE DE SINCRONIZARE
L_2 goto L_TA ; SE ADUNA 2 - SCHIMBARE INTRARE SENZOR TASTA
L_3 goto L_SY ; SE ADUNA 3 - SCHIMBARE INTRARE DE SINCRONIZARE SI TASTA
; SE IGNORA INTRAREA DE TASTA
L_4 goto L_IR ; SE ADUNA 4 - SCHIMBARE INTRARE RECEPTIE IR
L_5 goto L_SYIR ;SE ADUNA 5 - SCHIMBARE INTRARE DE SINCRONIZARE SI INFRAROSU
L_6 goto L_IR ; SE ADUNA 6 - SCHIMBARE INTRARE DE SINCRONIZARE SI TASTA
; SE IGNORA INTRAREA DE TASTA
L_7 goto L_SYIR ; SE ADUNA 7 - SCHIMBARE INTRARE DE SINCRONIZARE, TASTA
; SI INFRAROSU. SE IGNORA INTAREA TASTA
;_____ _______ ______ ____________PROGRAM PRINCIPAL__________ ______ ____ _____ _______ ______ ______
;_____ _______ ______ ____________COMANDA IN FAZA - PROGRAM PRINCIPAL__________ ______ ____ ___
; ------COMANDA IN FAZA ESTE FORMATA DIN MAI MULTE REGIMURI
; ------INDICATORUL DE REGIM - REGIM_F - SE ADUNA LA PCL PENTRU A CREA TABELA DE SALT
L_FAZA movf REGIM_F,0 ; TABELA DE SALT
addwf PCL,1
goto L_LOOP ; REGIM_F=0: NU SE EXECUTA NIMIC
L_R1 goto L_REGI1 ; REGIM_F=1: INTARZIEREA LA COMANDA IN FAZA PE ALTERNANTA POZITIVA
L_R2 goto L_REGI2 ; REGIM_F=2: CORESPUNDE IMPULSULUI 1 DE COMANDA IN FAZA PE ALTERN POZITIVA
L_R3 goto L_REGI2 ; REGIM_F=3: CORESPUNDE IMPULSULUI 2 DE COMANDA IN FAZA PE ALTERN POZITIVA
L_R4 goto L_REGI2 ; REGIM_F=4: CORESPUNDE IMPULSULUI 3 DE COMANDA IN FAZA PE ALTERN POZITIVA
L_R5 goto L_REGI2 ; REGIM_F=5: CORESPUNDE IMPULSULUI 4 DE COMANDA IN FAZA PE ALTERN POZITIVA
L_R6 goto L_REGI6 ; REGIM_F=6: INTARZIEREA LA COMANDA IN FAZA PE ALTERNANTA NEGATIVA
L_R7 goto L_REGI7 ; REGIM_F=7: CORESPUNDE IMPULSULUI 1 DE COMANDA IN FAZA PE ALTERN NEGATIVA
L_R8 goto L_REGI7 ; REGIM_F=8: CORESPUNDE IMPULSULUI 1 DE COMANDA IN FAZA PE ALTERN NEGATIVA
L_R9 goto L_REGI7 ; REGIM_F=9: CORESPUNDE IMPULSULUI 1 DE COMANDA IN FAZA PE ALTERN NEGATIVA
L_R10 goto L_REGI7 ; REGIM_F=A: CORESPUNDE IMPULSULUI 1 DE COMANDA IN FAZA PE ALTERN NEGATIVA
goto L_LOOP ; PRINDE EXCEPTIILE IN CARE REGIM_F ESTE MAI MARE DECAT 0X0A
;_____ _______ ______ ____________COMANDA IN FAZA - PROGRAM PRINCIPAL__________ ______ ____ ___
;_____ _______ ______ ____________TRATARE SCHIMBARE INTRARE DE SINCRONIZARE CONCOMITENT CU IR__________
; ------ACEATSA PARTE DE PROGRAM SE EXECUTA LA APARITIA UNEI SCHIMBARI PE INTRAREA DE
; ------SINCRONIZARE SIMULTAN CU RECEPTIE IR
L_SYIR bsf RFLAG,IN2_CHG ; SE SETEAZA BITUL CARE INDICA SCHIMBARE DOUA INTRARI SI
goto L_SY ; SE APELEAZA TRATARE SCHIMBARE INTRARE SINCRONIZARE
;_____ _______ ______ ____________TRATARE SCHIMBARE INTRARE DE SINCRONIZARE CONCOMITENT CU IR__________
;_____ _______ ______ ____________TRATARE SCHIMBARE INTRARE RECEPTIE IR - PROGRAM PRINCIPAL____________
; ------SE IMPLEMENTEAZA TABELA DE SALT PENTRU RECEPTIE IR
L_IR btfsc RFLAG,IN2_CHG ; DACA SUNT SCHIMBATE DOUA INTRARI SIMULTAN
goto L_IR00 ; NU SE MAI SALVEAZA TMR0 IN TEMP1 SI NU SE MAI
movf TMR0,0 ; ACTUALIZEAZA OLD_GPIO CU TEMP (IN CARE S-A DEPUS
movwf TEMP1 ; ACTUALA STARE A INTRARILOR)
movf TEMP,0
movwf OLD_GPIO
L_IR00 bcf RFLAG,IN2_CHG ; RESETARE FLAG IN2_CHG
movf REGIM_IR,0
addwf PCL,1 ; CREARE TABELA DE SALT PENTRU RECEPTIE IR
L_RIR0 goto L_REIR0 ; REGIM_IR=0: PRIMUL IMPULS (CAZATOR) DE LA RECEPTIE IR APARUT
L_RIR1 goto L_REIR1 ; REGIM_IR=1: AL DOILEA IMPULS (CRESCATOR) DE LA RECEPTIE IR APARUT
L_RIR2 goto L_REIR2 ; REGIM_IR=2: AL TREILEA IMPULS (CAZATOR) DE LA RECEPTIE IR APARUT
L_RIR3 goto L_REIR3 ; REGIM_IR=3: AL PATRULEA IMPULS (CRESCATOR) DE LA RECEPTIE IR APARUT
;_____ _______ ______ ____________TRATARE SCHIMBARE INTRARE RECEPTIE IR - PROGRAM PRINCIPAL____________
;_____ _______ ______ ____________TRATARE SCHIMBARE INTRARE TASTA APASATA - PROGRAM PRINCIPAL__________
; ------ACEASTA PARTE DE PROGRAM SE EXECUTA LA APARITIA UNUI IMPULS PE INTRAREA DE
; ------TASTA APASATA
; ------SE CREEAZA TABELA DE SALT PENTRU TRATARE IMPULS PE INTRAREA SENZOR TASTA
L_TA movf TEMP,0 ; SE INCARCA IN OLD_GPIO TEMP - CARE REPREZINTA STAREA ACTUALA A
movwf OLD_GPIO ; INTRARILOR
movf REGIM_T,0 ; SE CREEAZA TABELA DE SALT PENTRU TRATARE TASTA APASATA
addwf PCL,1
L_RT0 goto L_REGT0 ; REGIM_T=0: APARE PRIMUL IMPULS DE LA INTRAREA SENS_TASTA
L_RT1 goto L_REGT1 ; 1 - SE CONTORIZEAZA IMPULSURI DE LA INTRARE TASTA
; CONTINUU, PE DURATA A 3 PERIOADE RETEA (3*20ms=60ms)
L_RT2 goto L_REGT2 ; 2 - SE CONTORIZEAZA NUMARUL DE PERIOADE RETEA PE DURATA
; CARORA APAR IMPULSURI DE LA INTRARE TASTA CONTINUU
; LA FIECARE 20 PERIOADE (400ms) SE APELEAZA SUBRUTINA MODIFCARE
; DELAY (TASTA APASATA CONTINUU). DACA SE DETECTEAZA O
; DISCONTINUITATE A APARITIEI IMPULSURILOR SI DISCONTINUITATEA
; ESTE MAI MICA DE 9 PERIOADE SE TRECE IN REGIMUL URMATOR
L_RT3 goto L_REGT3 ; 3 - DACA APAR IMPULSURI CONTINUU PE DURATA A 3 PERIOADE
; RETEA SE COMUTA OFF MODULUI
L_RT4 goto L_REGT4 ; 4 - ORICE IMPULS VENIT IN MAI PUTIN DE 1 SECUNDA ESTE IGNORAT
;_____ _______ ______ ____________TRATARE SCHIMBARE INTRARE TASTA APASATA - PROGRAM PRINCIPAL__________
;_____ _______ ______ ____________SUBRUTINA MODIFICARE T_DELAY__________ ______ ____ __________
; ------SE EXECUTA LA DETECTAREA IMPULSURILOR DE LA SENZORUL DE ATINGERE MANA
L_MDDEL btfsc RFLAG,ON_LIGHT ; DACA LIGHT=ON SE MODIFICA T_DELAY
goto L_MDD1
bsf RFLAG,ON_LIGHT ; DACA NU, SE TRECE IN STAREA ON
bsf GPIO,COM_LED ; SI LED-UL PREZENTA SE STINGE
retlw 0x0 ; DUPA CARE SE IESE DIN SUBRUTINA
L_MDD1 btfss RFLAG,INC_DEC ; SE MODIFICA T_DELAY
goto L_DEDEC ; DACA INC_DEC=1 SE CRESTE T_DELAY, ALTFEL SE DESCRESTE
movlw 0x0A ; SE CRESTE T_DELAY PRIN ADAUGARE 0X0A
addwf T_DELAY,1
movlw 0x83 ; S-A DEPASIT VALOAREA MAXIMA T_DELAY<0X83?
subwf T_DELAY,0
btfss STATUS,C
retlw 0x0
movlw 0x82
movwf T_DELAY ; DACA DA, SE INCARCA T_DELAY CU MAXIMUM - 0X82
bcf RFLAG,INC_DEC ; IAR LA URMATOAREA APASARE TASTA SE VA DECREMENTA T_DELAY
retlw 0x0 ; PRIN RESETAREA FLAG-ULUI INC_DEC
L_DEDEC movlw 0x0A ; SE DESCRESTE T_DELAY PRIN SCADERE 0X0A
subwf T_DELAY,1
movlw 0x28
subwf T_DELAY,0 ; S-A AJUNS SUB VALOAREA MINIMA T_DELAY<0X28?
btfsc STATUS,C
retlw 0x0
movlw 0x28 ; DACA DA, SE INCARCA T_DELAY CU 0X28 SI
movwf T_DELAY ; LA URMATOAREA APASARE SE VA INCREMENTA T_DELAY
bsf RFLAG,INC_DEC ; PRIN SETAREA FLAG-ULUI INC_DEC
retlw 0x0
;_____ _______ ______ ____________SUBRUTINA MODIFICARE T_DELAY__________ ______ ____ __________
;_____ _______ ______ ____________SUBRUTINA CRESTERE T_DELAY__________ ______ ____ ____________
; ------SE EXECUTA LA APASAREA TASTEI 'DOWM' A TELECOMENZII
; CA URMARE SE VA CRESTE T_DELAY CU 0X0A
L_INCD btfss RFLAG,ON_LIGHT ; DACA LUMINA ESTE OFF NU SE MODIFICA T_DELAY
retlw 0x0
bsf RFLAG,FL_SOFTST ; DACA LUMINA ESTE ON SE INVALIDEAZA SOFT START
movlw 0xA ; SI SE ADUNA 0X0A LA T_DELAY
addwf T_DELAY,1
movlw 0x83
subwf T_DELAY,0 ; DACA T_DELAY DEPASESTE 0X83
btfss STATUS,C
retlw 0x0
movlw 0x82
movwf T_DELAY ; SE INCARCA T_DELAY CU 0X83
retlw 0x0
;_____ _______ ______ ____________SUBRUTINA CRESTERE T_DELAY__________ ______ ____ ____________
;_____ _______ ______ ____________SUBRUTINA DESCRESTERE T_DELAY__________ ______ ____ _________
; ------SE EXECUTA LA APASAREA TASTEI 'UP' A TELECOMENZII
; CA URMARE SE VA DESCRESTE T_DELAY CU 0X0A
L_DECD btfss RFLAG,ON_LIGHT ; DACA LUMINA ESTE OFF NU SE MODIFICA T_DELAY
retlw 0x0
bsf RFLAG,FL_SOFTST ; DACA LUMINA ESTE ON SE INVALIDEAZA SOFT START
movlw 0x0A ; SI SE SCADE 0X0A DIN T_DELAY
subwf T_DELAY,1
movlw 0x28 ; DACA T_DELAY SCADE SUB 0X28
subwf T_DELAY,0
btfsc STATUS,C
retlw 0x0
movlw 0x28 ; SE INCARCA T_DELAY CU 0X28
movwf T_DELAY
retlw 0x0
;_____ _______ ______ ____________SUBRUTINA DESCRESTERE T_DELAY__________ ______ ____ _________
;_____ _______ ______ ____________SUBRUTINA COMUTARE ON/OFF__________ ______ ____ _____________
; ------SE EXECUTA LA APASAREA TASTEI ON/OFF A TELECOMENZII
L_ONOFF btfss RFLAG,ON_LIGHT
goto L_SW1
bcf RFLAG,ON_LIGHT ; DACA LUMINA ESTE ON SE COMUTA OFF
bcf GPIO,COM_LED ; SI SE APRINDE LED-ULPREZENTA
movlw 0x82 ; SE INCARCA T_DELAY CU VALOAREA MAXIMA
movwf T_DELAY
bcf RFLAG,FL_SOFTST ; PREGATIRE PENTRU SOFTSTART FL_SOFTST=0 - ACTIVAT
retlw 0x0
L_SW1 bsf RFLAG,ON_LIGHT ; DACA LUMINA ESTE STINSA O APRIND SI
bsf GPIO,COM_LED ; STING LED PREZENTA
retlw 0x0
;_____ _______ ______ ____________SUBRUTINA COMUTARE ON/OFF__________ ______ ____ _____________
;_____ _______ ______ ____________SUBRUTINA VERIFICARE EGALITATE DURATA BIT RECEPTOR INFRAROSU_________
; SE EXECUTA LA APARITIA UNUI FRONT CRESCATOR DE LA RECEPTORUL IR
; ------LA APARITIA FRONTULUI DESCRESCATOR SE SALVEAZA IN OLD_TMR0IR VALOAREA LUI TMR0
; ------IAR LA APARITIA FRONTULUI CRESCATOR SE DEPUNE TMR0 IN TEMP1
; ------SUBRUTINA FACE DIFERENTA LOR SI VERIFICA EGALITATEA CU CONSTANTA DE COMPARAT DEPUSA
; ------IN TEMP. SE IA O ABATERE +-3 (ADICA PLUS MINUS 192uS)
L_ISTB movf OLD_TMR0IR,0
subwf TEMP1,0
movwf TEMP2
movlw 0x03 ; CONDITIA DE INDEPLINIT ESTE:
subwf TEMP,0 ; TEMP-3<=TEMP2<TEMP+4
subwf TEMP2,0
btfss STATUS,C
retlw 0x0
movlw 0x04
addwf TEMP,0
subwf TEMP2,0
btfsc STATUS,C
retlw 0x0
bsf RFLAG,IS_COND
retlw 0x0
;_____ _______ ______ ____________SUBRUTINA VERIFICARE EGALITATE DURATA BIT RECEPTOR INFRAROSU_________
;_____ _______ ______ ____________SUBRUTINE TRATARE TASTA APASATA__________ ______ ____ _______
; ------A APARUT PRIMUL IMPULS DE LA SENZOR TASTA
L_REGT0 clrf N_PERT ; SE INITIALIZEAZA VARIABILELE
clrf N_PERL
incf REGIM_T,1 ; SE INCREMENTEAZA VARIABILA REGIM_T
bsf RFLAG,FL_TASTA ; SE PUNE FLAG-UL FL_TASTA: IN PERIOADA RETEA CURENTA A FOST CITIT
; IMPULS DE LA SENZOR TASTA
bsf RFLAG,FL_CONTIN ; SE PUNE FLAG-UL FL_CONTIN: VA FI STERS IN SUBRUTINA DE SINCRONIZARE
; DACA IN PERIOADA ANTERIOARA NU A FOST DETECTAT UN IMPULS (DACA
; FLAG-UL FL_TASTA NU ESTE PUS)
goto L_FAZA
; ------SE TESTEAZA DACA APAR IMPULSURI DE LA SEZONR TASTA TREI PERIOADE RETEA IN MOD CONTINUU
L_REGT1 btfsc RFLAG,FL_TASTA ; DACA FL_TASTA=1 INSEAMNA CA IN ACEEASI PERIOADA AM MAI
; RECEPTIONAT UN IMPULS, DECI PE URMATOARELE NU LE MAI TRATEZ
goto L_FAZA
btfss RFLAG,FL_CONTIN ; DACA FL_CONTIN=0 INSEAMNA CA IMPULSURILE NU AU VENIT CONTINUU,
; PERIOADA DE PERIOADA, DECI RESETEZ TOATE VARIABILELE
goto CLR_RT ; SALT LA SUBRUTINA STERGERE VARIABILE LEGATE DE SENZOR TASTA
bsf RFLAG,FL_TASTA ; FLAG-UL ESTE SETAT LA APARITIA PRIMULUI IMPULS IN PERIOADA
; CURENTA, PENTRU A FI TESTAT LA INCEPUTUL PERIOADEI URMATOARE IN
; SUBRUTINA DE SINCRONIZARE
clrf N_PERL
incf N_PERT,1 ; SE INCREMENTEAZA CONTORUL DE PERIOADE RETEA IN CARE AU FOST
; DETECTATE IMPULSURI DE LA SENZOR TASTA
movlw 0x03
xorwf N_PERT,0 ; A AJUNS ACEST CONTR LA 3?
btfss STATUS,Z
goto L_FAZA
clrf N_PERT
incf REGIM_T,1 ; DACA DA, SE INCREMENTEAZA REGIMUL SI SE MODIFICA T_DELAY
call L_MDDEL ; DEOARECE S-A DETECTAT TASTA APASATA
goto L_FAZA
; ------SE TESTEAZA DACA TIMP DE 0X14 PERIOADE RERTEA (ADICA 400ms) SE PRIMESC
; ------CONTINUU IMPULSURI DE LA SENZORUL TASTA APASATA. DACA DA, INSEAMNA CA TASTA ESTE APASATA
; ------CONTINUU SI SE MODIFICA T_DELAY LA FIECARE ASTFEL DE 400ms.
; ------IN CAZUL DETECTARII UNEI DISCONTINUITATI SE TESTEAZA DACA S-A APASAT TASTA DE DOUA ORI
; ------CONSECUTIV, CAZ IN CARE SE DEORESTE SA SE COMUTE OFF LUMINA.
L_REGT2 btfsc RFLAG,FL_TASTA ; ACELASI TEST - DOAR PRIMUL IMPULS ESTE LUAT IN CONSIDERARE
goto L_FAZA
bsf RFLAG,FL_TASTA ; FL_TASTA SETAT: A APARUT IMPULS DE LA SENZOR TASTA IN PERIOADA
; CURENTA
btfss RFLAG,FL_CONTIN ; IMPULSUL A APARUT CONTINUU (PERIOADA DE PERIOADA)
goto L_RGT21 ; DACA NU, SALT
clrf N_PERL ; DACA DA, SE STERGE N_PERL
incf N_PERT,1 ; SE INCREMENTEAZA N_PERT SI SE TESTEAZA
movlw 0x14 ; DACA N_PERT=0X14=400ms ADICA UTILIZATORUL TINE TASTA APASATA
xorwf N_PERT,0 ; CONTINUU
btfss STATUS,Z
goto L_FAZA
clrf N_PERT ; DACA DA, SE STERGE CONTORUL N_PERT
call L_MDDEL ; SI SE MODIFICA T_DELAY - SE APELEAZA L_MDDEL
goto L_FAZA
L_RGT21 movlw 0x09 ; DACA APARE O DISCONTINUITATE A IMPULSURILOR
subwf N_PERL,0 ; SE VERIFICA DACA CONTORUL DE PERIOADE (N_PERL) SCURSE DE LA IMPULSUL
btfsc STATUS,C ; APARUT ANTERIOR ESTE MAI MIC DE 0X09 (ADICA TIMP MAI MIC DE 180ms)
goto CLR_RT ; ACEASTA INSEMANA CA
clrf N_PERT ; TASTA A FOST RELAXATA SI TIMPUL PANA LA URMATOAREA APASARE
incf REGIM_T,1 ; ESTE MAI MIC DE 0X09=180ms. IN ACEST CAZ UTILIZATORUL APASA DE DOUA
bsf RFLAG,FL_CONTIN ; RAPID SI INSEAMNA CA SE DORESTE SA SE COMUTE OFF LUMINA
goto L_FAZA
; ------IN ACEST REGIM SE TESTEAZA DACA IMPULSUL APARUT CU DISCONTINUITATEA DE SUB 180ms
; ------REPREZINTA O APASARE VALIDA DE TASTA. PENTRU ACEASTA SE TESTEAZA DACA MAI VIN ASTFEL DE
; ------IMPULSURI SI URMATOARELE TREI PERIOADE RETEA, IN MOD CONTINUU
; ------DACA DA, SE COMUTA OFF LUMINA
L_REGT3 btfsc RFLAG,FL_TASTA ; ACELASI TEST - DOAR PRIMUL IMPULS ESTE LUAT IN CONSIDERARE
goto L_FAZA
btfss RFLAG,FL_CONTIN ; IMPULSURI APARUTE CONTINUU?
goto CLR_RT ; DACA NU, SE RESETEAZA TOATE VARIABILELE REFERITOARE LA TASTA
bsf RFLAG,FL_TASTA ; ESTE PUS FLAG-UL FL_TASTA
incf N_PERT,1 ; SE INCREMENEAZA CONTORUL DE PERIOADE IN CARE APAR CONTINUU
movlw 0x03 ; IMPULSURI DE LA TASTA SI SE COMPARA CU 3
xorwf N_PERT,0
btfss STATUS,Z
goto L_FAZA
clrf N_PERL
incf REGIM_T,1
bcf RFLAG,ON_LIGHT ; DACA DA, SE COMUTA OFF LUMINA
bcf GPIO,COM_LED ; SE APRINDE LED-UL PREZENTA
movlw 0x82
movwf T_DELAY ; SE INCARCA T_DELAY CU VALOAREA MAXIMA
bcf RFLAG,INC_DEC ; SE VA PORNI PE DECREMENTARE
bcf RFLAG,FL_SOFTST ; SI CU SOFT START
goto L_FAZA
; ------NUMAI DUPA 50*20=1s SE MAI IA IN CONSIDERARE O NOUA APASARE DE TASTA
L_REGT4 movlw 0x32
subwf N_PERL,0
btfss STATUS,C
goto L_FAZA
; -----RESETARE VARIABILE TASTA APASATA
CLR_RT clrf REGIM_T
goto L_FAZA
;_____ _______ ______ ____________SUBRUTINE TRATARE TASTA APASATA__________ ______ ____ _______
;_____ _______ ______ ____________SUBRUTINA SINCRONIZARE RETEA__________ ______ ____ __________
; ------ACEASTA PARTE DE PROGRAM SE EXECUTA LA APARITIA UNUI FRONT CRESCATOR,
; ------PRIN CARE CIRCUITUL SE SINCRONIZEAZA CU RETEAUA
L_SY movf TMR0,0 ; SALVARE TMR0 IN VARIABILA TEMP1
movwf TEMP1
movf TEMP,0 ; actualizare registru old_gpio
movwf OLD_GPIO
btfss GPIO,LINE_SYNC ; SE IA IN CONSIDERARE NUMAI FRONTUL CRESCATOR
goto L_ENDSY ; SINCRONIZAREA SE FACE DOAR PE ALTERNANTA POZITIVA
BSF GPIO,0X00 ; TEST
movf REGIM_F,0 ; SI DOAR DACA REGIM_F ESTE ZERO
btfss STATUS,Z
goto L_ENDSY
incf REGIM_F,1 ; SE FACE REGIM_F=1 - ADICA INTARZIERE COMANDA IN FAZA ALT +
movf OLD_TMR0F,0 ; SE CALCULEAZA JUMATATEA PERIOADEI RETEA
subwf TEMP1,0 ; SE FACE DIFERENTA DINTRE TMR0 LA INCEPUTUL A DOUA PERIOADE
movwf TEMP ; SUCCESIVE
bsf STATUS,C ; IAR VALOAREA SE IMPARTE LA 2. SE STIE CA BITUL 7 ESTE 1.
rrf TEMP,0
movwf T_SPER
movf TEMP1,0 ; SE ACTUALIZEAZA OLD_TMR0F PENTRU SINCRONIZAREA LA PERIOADA URMAT.
movwf OLD_TMR0F
addwf T_DELAY,0 ; LA ACTUALA VALOARE A TMR0 SE ADAUGA T_DELAY PENTRU A FORMA
movwf T_FINAL ; TIMPUL FINAL LA CARE SE DA COMANDA IN FAZA PE ALTERNANTA POZITIVA
; ------ACEASTA PARTE DE PROGRAM ESTE FOLOSITA PENTRU ACTUALIZARE VARIABILE TASTA APASATA
btfss RFLAG,FL_TASTA ; DACA FLAG-UL FL_TASTA NU ESTE SETAT ATUNCI SE STERGE FLAG-UL
bcf RFLAG,FL_CONTIN ; FL_CONTIN - NU MAI EXISTA CONTINUITATE A IMPULSURILOR DE LA SENZOR
bcf RFLAG,FL_TASTA ; SE STERGE FL_TASTA PENTRU A-L ARMA LA INCEPUTUL UNEI NOI PERIOADE
movlw 0xF0 ; REGISTRUL N_PERL ESTE INCREMENTAT PANA AJUNGE LA MAXIM 0XF0
xorwf N_PERL,0 ; EL ESTE INDICATORUL DE PERIOADE SCURSE
btfss STATUS,Z
incf N_PERL,1
; ------ACEASTA PARTE DE PROGRAM ESTE FOLOSITA PENTRU ACTUALIZARE VARIABILE RECEPTIE INFRAROSU
movlw 0xF0 ; N_IRPER ESTE FOLOSIT PENTRU CONTOR TIMP TOTAL DE RECEPTIE IR
xorwf N_IRPER,0
btfss STATUS,Z
incf N_IRPER,1
; ------SFARSIT SINCRONIZARE. DACA S-A SCHIMBAT SIMULTAN SI INTRAREA DE RECEPTIE IR
; ------SE TRECE TRATEAZA SI RECEPTIA IR
L_ENDSY BCF GPIO,0X00
btfss RFLAG,IN2_CHG
goto L_LOOP
goto L_IR
;_____ _______ ______ ____________SUBRUTINA SINCRONIZARE RETEA__________ ______ ____ __________
;_____ _______ ______ ____________SUBRUTINE COMANDA IN FAZA__________ ______ ____ _____________
; ------REGIMUL 1 COMANDA IN FAZA - SE ASTEAPTA PENTRU COMANDA PE ALTERNANTA POZITIVA
L_REGI1 movf TMR0,0 ; TMR0 SE SALVEAZA IN TEMP
movwf TEMP ; SI SE COMPARA CU T_FINAL
movf T_FINAL,0
xorwf TEMP,0
btfsc STATUS,Z
goto L_DRV
incf T_FINAL,0 ; SE IA IN CALCUL O EROARE DE 1
xorwf TEMP,0 ; DE ACEEA SE COMPARA SI CU T_FINAL+1
btfss STATUS,Z
goto L_LOOP ; DACA SUNT EGALE,
L_DRV incf REGIM_F,1 ; URMEAZA SA SE DEA COMANDA IN FAZA
movf T_SPER,0
addwf T_FINAL,1 ; SE PREGATESTE COMANDA IN FAZA PE ALTERNANTA NEGATIVA
goto L_LOOP
; ------REGIM 2 COMANDA IN FAZA - SE DAU PATRU IMPULSURI SCURTE DE COMANDA PE ALTERNANTA POZITIVA
L_REGI2 incf REGIM_F,1
btfss RFLAG,ON_LIGHT ; NUMAI DACA LUMINA ESTE ON
goto L_LOOP
bcf GPIO,COM_FAZA
movlw 0x0D
movwf TEMP
L_BACK decfsz TEMP,1 ; DURATA FIECARUI IMPULS ESTE DE 0X0D*3us+2us=41us
goto L_BACK
bsf GPIO,COM_FAZA
goto L_LOOP
; ------REGIM 6 COMANDA IN FAZA - SE ASTEAPTA COMANA PE ALTERNANTA NEGATIVA
L_REGI6 movf TMR0,0 ; SE SALVEAZA TMR0 IN TEMP
movwf TEMP
movf T_FINAL,0 ; SE COMPARA CU T_FINAL SI T_FINAL+1
xorwf TEMP,0
btfsc STATUS,Z
goto L_DRV1
incf T_FINAL,0 ; DACA SUNT EGALE, SE VA DA COMANDA IN FAZA
xorwf TEMP,0 ; PE ALTERNANTA NEGATIVA - REGIMUL URMATOR
btfss STATUS,Z
goto L_LOOP
L_DRV1 incf REGIM_F,1
goto L_LOOP
; ------REGIM 7 - SE DAU PATRU IMPULSURI SCURTE PE ALTERNANTA NEGATIVA + IMPLEMENTARE SOFT START
L_REGI7 incf REGIM_F,1 ; SE INCREMENTEAZA VARIABILA REGIM_F
movlw 0x0B ; DACA S-A AJUNS LA 0X0B SE RESETEAZA
xorwf REGIM_F,0
btfsc STATUS,Z
clrf REGIM_F
btfss RFLAG,ON_LIGHT ; DACA LUMINA ESTE ON SE DA COMANDA IN FAZA
goto L_LOOP
bcf GPIO,COM_FAZA ; SE TINE COM_FAZA IN 0 PE DURATA COMENZII
movlw 0x0D
movwf TEMP
L_BACK1 decfsz TEMP,1
goto L_BACK1
bsf GPIO,COM_FAZA
movf REGIM_F,0 ; DACA REGIM_F ESTE 0 SE PUNE PROBLEMA SOFTSTART
btfss STATUS,Z
goto L_LOOP ; IN REGIMUL 0B=00 SE TESTEAZA DACA SE FACE SOFT START
btfsc RFLAG,FL_SOFTST ; FL_SOFTST=0 REZULTA CA SE FACE SOFTSTART
goto L_LOOP
decf T_DELAY,1 ; SE SCADE T_DELAY CU O UNITATE, CONTINUU, DE LA MAXIM (0X82)
movlw 0x82 ; LA 0X46
subwf T_DELAY,0
movlw 0x82
btfsc STATUS,C
movwf T_DELAY ; DACA DIN INTAMPLARE T_DELAY>0X82 SE INCARCA T_DELAY CU 0X82
movlw 0x47 ; !!!!! modificare, pe pic este 0x46
subwf T_DELAY,0 ; DACA T_DELAY A DEVENIT MAI MIC DE 0X47 se termina softst
btfsc STATUS,C ; T_DELAY TREBUIE SA FIE IN GAMA 0X82 - 0X46
goto L_LOOP
bsf RFLAG,FL_SOFTST ; SE INACTIVEAZA REGIM DE SOFTSTART PRIN PUNERE FL_SOFTST=1
goto L_LOOP
;_____ _______ ______ ____________SUBRUTINE COMANDA IN FAZA__________ ______ ____ _____________
;_____ _______ ______ ____________SUBRUTINE RECEPTIE IR__________ ______ ____ _________________
; ------REGIM 0 RECEPTIE IR - PRIMUL IMPULS (CAZATOR) DETECTAT
L_REIR0 btfsc GPIO,IR_REC ; PRIMUL FRONT TREBUIE SA FIE CAZATOR
goto L_FAZA
clrf N_IRPER
movf TEMP1,0
movwf OLD_TMR0IR
incf REGIM_IR,1
goto L_FAZA
; REGIM 1 RECEPTIE IR - AL DOILEA IMPULS (CRESCATOR) DETECTAT
L_REIR1 btfss GPIO,IR_REC
goto CLR_IR
movlw 0x03
subwf N_IRPER,0
btfsc STATUS,C ; INTREAGA TRANSMISIE IR NU TREBUIE SA DUREZE MAI MULT DE 3 PERIOADE RETEA (60ms)
goto CLR_IR
movlw T_BIT1 ; DETECTIE ESTE TRANSMIS BIT 1
movwf TEMP
call L_ISTB
btfsc RFLAG,IS_COND
goto L_RIR11
movlw T_BIT0
movwf TEMP
call L_ISTB
btfss RFLAG,IS_COND
goto CLR_IR
bcf RFLAG,IS_COND
clrf COD_IR ; S-A TRANSMIS BIT 0
incf REGIM_IR,1
goto L_FAZA
L_RIR11 bcf RFLAG,IS_COND
movlw 0x02
movwf COD_IR
incf REGIM_IR,1
goto L_FAZA
; REGIM 2 RECEPTIE IR - AL TREILEA IMPULS (CAZATOR) DETECTAT
L_REIR2 btfsc GPIO,IR_REC
goto CLR_IR
movlw 0x03
subwf N_IRPER,0
btfsc STATUS,C
goto CLR_IR
movf TEMP1,0
movwf OLD_TMR0IR
incf REGIM_IR,1
goto L_FAZA
; REGIM 3 RECEPTIE IR - AL PATRULEA IMPULS (CRESCATOR) DETECTAT
L_REIR3 btfss GPIO,IR_REC
goto CLR_IR
movlw 0x03
subwf N_IRPER,0
btfsc STATUS,C
goto CLR_IR
movlw T_BIT1
movwf TEMP
call L_ISTB
btfsc RFLAG,IS_COND
goto L_RIR32
movlw T_BIT0
movwf TEMP
call L_ISTB
btfss RFLAG,IS_COND
goto CLR_IR
bcf RFLAG,IS_COND
goto L_RIR31
L_RIR32 bcf RFLAG,IS_COND
incf COD_IR,1
L_RIR31 movf COD_IR,0
btfsc STATUS,Z ; DACA COD_IR=00 SE DECREMENEAZA T_DELAY
call L_DECD
movlw 0x01
xorwf COD_IR,0
btfsc STATUS,Z
call L_INCD ; DACA COD_IR=01 SE INCREMENTEAZA T_DELAY
movlw 0x02
xorwf COD_IR,0
btfsc STATUS,Z
call L_ONOFF ; DACA COD_IR=10 SE COMUTA ON/OFF
CLR_IR clrf REGIM_IR
clrf N_IRPER
bcf RFLAG,IS_COND
goto L_FAZA
END
; ultima varianta
; rca.asm
; PROGRAM VARIATOR PUTERE BEC CU INCANDESCENTA: EMITATOR INFRAROSU
; VARIANTA FINALA
LIST P=12C509A
#include 'C:PROGRA~1MPLABP12C509A.INC'
;____________________CONSTANTE__________ ______ ____ __________ ______ ____ _____
T_BIT0 EQU 0X6C ; DURATA SEMNAL PENTRU TRANSMITERE BIT 0 LOGIC
T_BIT1 EQU 0X9C ; DURATA SEMNAL PENTRU TRANSMITERE BIT 1 LOGIC
T_PAUS EQU 0XC0 ; DURATA PAUZA SEMNAL
T_DEB EQU 0XFA ; DURATA TIMP DEBOUNCE
;____________________CONSTANTE__________ ______ ____ __________ ______ ____ _____
;____________________LINII DE PORT INTRARI/IESIRI__________ ______ ____ _________________
TAST_UP EQU 0X00 ; INTRARE TASTA APASATA UP
TAST_DOWN EQU 0X01 ; INTRARE TASTA APASATA DOWM
TAST_ONOF EQU 0X03 ; INTRARE TASTA APASATA ON/OFF
;____________________LINII DE PORT INTRARI/IESIRI__________ ______ ____ _________________
;____________________VARIABILE__________ ______ ____ __________ ______ ____ _____
T_FINAL EQU 0X0E ; TIMPUL FINAL CALCULAT PRIN ADAUGAREA LA TMR0 A DURATEI
; SEMNALULUI/PAUZEI/DEBOUNCE
TEMP EQU 0X0F ; VARIABILA TEMPORARA DE UZ GENERAL
;____________________VARIABILE__________ ______ ____ __________ ______ ____ _____
;____________________INITIALIZARI__________ ______ ____ __________ ______ ____ __
ORG 0
movwf OSCCAL ; CALIBRARE OSCILATOR
movlw B'00000100' ; SETARE PRESCALARE TMR0 LA 32 SI PULL UPS PENTRU GPIO
option
movlw B'11001011' ; SETARE GPIO 5,4,2 CA IESIRE DE COMANDA LED IR
tris GPIO
CLRF GPIO
;____________________INITIALIZARI__________ ______ ____ __________ ______ ____ __
GOTO L_MAIN
;____________________SUBRUTINA GENERARE SEMNAL CU FRECVENTA DE 36 khz FACTOR UMPLERE 1/2_________
GENSIGN addwf TMR0,0 ; IN W ESTE DEPUS TIMPUL CAT SE GENEREAZA SEMNALUL
movwf T_FINAL ; CARE POATE FI T_BIT 1 SAU T_BIT0
L_SET COMF GPIO,1 ; DURATA SEMNAL DE 14*1us=14us
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
CLRF GPIO ; DURATA PAUZA 14*1us=14us
nop ; REZULTA IN TOTAL O PERIOADA DE 28us
nop ; ADICA O FRECVENTA DE 35.7khz
nop
nop
nop
nop
nop
nop
movf TMR0,0
xorwf T_FINAL,0
btfss STATUS,Z
goto L_SET
retlw 0x0
;____________________SUBRUTINA GENERARE SEMNAL CU FRECVENTA DE 36 khz FACTOR UMPLERE 1/2_________
;____________________SUBRUTINA GENERARE PAUZA CU DURATA T_PAUS__________ ______ ____ ____
GENPAUS movlw T_PAUS ; SE FACE O TEMPORIZARE T_PAUS
addwf TMR0,0
movwf T_FINAL
L_BK1 movf TMR0,0
xorwf T_FINAL,0
btfss STATUS,Z
goto L_BK1
retlw 0x0
;____________________SUBRUTINA GENERARE PAUZA CU DURATA T_PAUS__________ ______ ____ ____
;____________________SUBRUTINA TEMPORIZARE 400ms__________ ______ ____ __________________
L_TMP movlw 0x32
movwf TEMP
L_BK3 movlw T_DEB
addwf TMR0,0
movwf T_FINAL
L_BK2 movf TMR0,0
xorwf T_FINAL,0
btfss STATUS,Z
goto L_BK2
decfsz TEMP,1
goto L_BK3
retlw 0x0
;____________________SUBRUTINA TEMPORIZARE 400ms__________ ______ ____ __________________
;____________________PROGRAM PRINCIPAL__________ ______ ____ _____ _______ ______ _____________
;____________________TEMPORIZARE 8ms LA IESIREA DIN SLEEP__________ ______ ____ _________
L_MAIN movlw T_DEB
addwf TMR0,0
movwf T_FINAL
L_BK4 movf TMR0,0
xorwf T_FINAL,0
btfss STATUS,Z
goto L_BK4
;____________________TEMPORIZARE 8ms LA IESIREA DIN SLEEP__________ ______ ____ _________
;____________________TEST DETECTIE TASTA APASATA__________ ______ ____ __________________
btfss GPIO,TAST_UP
goto COD_UP ; A FOST APASATA TASTA UP
btfss GPIO,TAST_DOWN
goto COD_DN ; A FOST APASATA TASTA DOWN
btfsc GPIO,TAST_ONOF ; A FOST APASATA TASTA ON/OFF
goto L_END
;____________________TEST DETECTIE TASTA APASATA__________ ______ ____ __________________
;____________________TASTA ON/OFF APASATA__________ ______ ____ _____ _______ ______ __________
COD_OF movlw T_BIT1 ; SE GENEREAZA UN BIT CU DURATA T_BIT1 PENTRU 1 LOGIC
call GENSIGN
call GENPAUS ; SE GENEREAZA PERIOADA DE PAUZA
movlw T_BIT0 ; SE GENEREAZA UN BIT CU DURATA T_BIT0 PENTRU 0 LOGIC
call GENSIGN
L_BK5 btfss GPIO,TAST_ONOF ; NU SE MERGE MAI DEPARTE PANA CAND TASTA NU SE RELAXEAZA
goto L_BK5 ; PENTRU A NU DA COMUTARI ON/OFF FALSE
goto L_END
;____________________TASTA ON/OFF APASATA__________ ______ ____ _____ _______ ______ __________
;____________________TASTA DOWN APASATA__________ ______ ____ _____ _______ ______ ____________
COD_DN movlw T_BIT0 ; SE GENEREAZA UN BIT CU DURATA T_BIT0 PENTRU 0 LOGIC
call GENSIGN
call GENPAUS ; SE GENEREAZA PERIOADA DE PAUZA
movlw T_BIT1 ; SE GENEREAZA UN BIT CU DURATA T_BIT1 PENTRU 1 LOGIC
call GENSIGN
goto L_END
;____________________TASTA DOWN APASATA__________ ______ ____ _____ _______ ______ ____________
;____________________TASTA UP APASATA__________ ______ ____ _____ _______ ______ ____________
COD_UP movlw T_BIT0 ; SE GENEREAZA UN BIT CU DURATA T_BIT0 PENTRU 0 LOGIC
call GENSIGN
call GENPAUS ; SE GENEREAZA PEROADA DE PAUZA
movlw T_BIT0
call GENSIGN ; SE GENEREAZA UN BIT CU DURATA T_BIT0 PENTRU 0 LOGIC
;____________________TASTA UP APASATA__________ ______ ____ _____ _______ ______ ____________
;____________________FINAL SUBRUTINA__________ ______ ____ _____ _______ ______ ______________
L_END call L_TMP ; TEMPORIZARE 400ms
btfss GPIO,TAST_UP ; TEST DACA VREUNA DIN TASTE ESTE INCA APASATA
goto L_MAIN ; SAU DACA TASTA ON/OFF ESTE DIN NOU APASATA
btfss GPIO,TAST_DOWN
goto L_MAIN
btfss GPIO,TAST_ONOF
goto L_MAIN
movf GPIO,0
sleep ; SE CITESTE GPIO SI SE TRECE IN SLEEP
nop ; AICI VA RAMANE BLOCAT PROGRAM COUNTER
;____________________FINAL SUBRUTINA__________ ______ ____ _____ _______ ______ ______________
END
Copyright © 2024 - Toate drepturile rezervate