Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Meseria se fura, ingineria se invata.Telecomunicatii, comunicatiile la distanta, Retele de, telefonie, VOIP, TV, satelit




Aeronautica Comunicatii Constructii Electronica Navigatie Pompieri
Tehnica mecanica

Electronica


Index » inginerie » Electronica
» PROIECTAREA SOFTWARE A VARIATORULUI DE PUTERE PENTRU SURSE DE INCALZIRE


PROIECTAREA SOFTWARE A VARIATORULUI DE PUTERE PENTRU SURSE DE INCALZIRE


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

modulatoare = 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

Kirk Zurell - C programming for EMBEDDED SYSTEMS - Apply C to 8 bit Microprocessor for Efficient Development - Publishers Group West - 2000

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





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate