- DANIEL
- MESAJE : 13258MEMBRU DIN : 02/06/2017LOCATIE : BucurestiPROFESIE : Electronist
#1 PROIECT CU PIC16F684 - Circuit avertizare cadere tensiune retea
Lun Iul 10, 2017 6:37 pm
Circuitul de mai jos da un impuls de 5 secunde pe un releu la caderea tensiunii de rete, iar la revenirea tensiunii de retea da alt impuls de 5 secunde pe alt releu. Mai jos gasiti programul scris in MPlab care trebuie compilat si scris in microcontroler.
[Trebuie sa fiti înscris şi conectat pentru a vedea această imagine]
;PIC16F684 - Circuit avertizare cadere tensiune retea :
PROCESSOR 16F684; se declara tipul procesorului
INCLUDE; se incarca in compilator numele si adresele registrilor de functii speciale SFR
__CONFIG _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_ON & _FCMEN_ON & _HS_OSC; directiva pentru definirea configuratiei de pornire: watchdo=off, reset extern=off, code protect=off, oscilatorul=cristal quatz.
#define in PORTA,2; pinul 10, R0, adica bitul 0 al portului C va mai avea si numele led1
#define out1 PORTC, 0
#define out2 PORTC, 1
UDATA; aceasta directiva declara inceputul de memorie RAM nefolosita
LOCNT RES 1 ; se rezerva un octet(byte) pentru variabila LOCNT
HICNT RES 1
LOOPCNT RES 1
MEM res 1
#define memin MEM, 0
ORG 0; vectorul reset, de aici incepe executia programului
GOTO main001; instructiunea de salt neconditionat la adresa etichetei main001
ORG 4; vectorul intrerupere. Cand are loc o intrerupere, aici sare si incepe executia rutinei de intrerupere
CODE ; se defineste inceputul programului propriuzis, pentru cod relocabil
main001; eticheta main001, se scrie din coloana 0,
;restul codului poate fi scris din urmatoarele coloane (se lasa un spatiu inainte)
;In continuare se vor configura porturile A si C
BCF STATUS, RP0; se selecteaza primul banc de registri
MOVLW 0x00; se incarca in acumulator cifra zero
MOVWF PORTC; se copiaza continutul acumulatorului in registru portc
MOVWF PORTA; se copiaza continutul acumulatorului in registru porta
MOVLW 0X07 ; se incarca in acumulator 7 hexa = 00000111 in binar
MOVWF CMCON0 ; se copiaza continutul acumulatorului in CMCON0
;BIT 210=111 COMPARATORS OFF, CXIN PINS = DIGITAL I/O
BSF STATUS, RP0 ; se selecteaza bancul al doilea de registri
MOVLW b'00000001' ; se copiaza in acumulator numarul 1 in binar
MOVWF ANSEL; BIT 7-0 intrare analogica sau I/O digitala 1=ANALOG INPUT 0=DIGITAL I/O
MOVLW B'00100100'
MOVWF TRISA ; configuratia portului A, 1=intrare, 0=iesire
MOVLW B'00000000'
MOVWF TRISC ; configuratia portului C, 1=intrare, 0=iesire
BCF STATUS, RP0 ; se selecteaza bancul 1 cu registri
; sfarsitul configurarii porturilor A si C
goto main002
;GENERATING PAUSE IN MILISECONDS (1~65535MS)
;PURPOSE OF THIS MACRO IS TO PROVIDE EXACT TIME DELAYS IN PROGRAM.
PAUSEMS MACRO PAR1 ; Se defineste un macro. De fiecare daca cand apare in program "pausems" ca functie, la compilare "pausems" este inlocuit cu urmatoarele cinci instructiuni de mai jos
MOVLW HIGH PAR1 ; HIGHER BYTE OF PARAMETER 1 GOES TO HICNT
MOVWF HICNT
MOVLW LOW PAR1 ; LOWER BYTE OF PARAMETER 1 GOES TO LOCNT
MOVWF LOCNT ;compilatorul imparte numarul respectiv in 2 octeti si nu microcontrolerul
CALL PAUSEMS1
ENDM ;sfarsit macro
PAUSEMS1
LOOP1
MOVF LOCNT, F ; DECREASE HICNT AND LOCNT NECESSARY
BTFSC STATUS, Z ; NUMBER OF TIMES AND CALL SUBPROGRAM DELAY1MS
GOTO DECHI
CALL DELAY1MS
DECF LOCNT, F
GOTO LOOP1
DECHI
MOVF HICNT, F
BTFSC STATUS, Z
GOTO END1
CALL DELAY1MS
DECF HICNT, F
DECF LOCNT, F
GOTO LOOP1
DELAY1MS: ; DELAY1MS PRODUCES A ONE MILISECOND DELAY
MOVLW .100 ; 100*10us=1ms@4MHZ; MOVLW .200 ; 200*5us=1us@8MHZ
MOVWF LOOPCNT ; LOOPCNT<-100
LOOP2:
NOP
NOP
NOP
NOP
NOP
CLRWDT
DECFSZ LOOPCNT, F
GOTO LOOP2 ; TIME PERIOD NECESSARY TO EXECUTE LOOP LOOP2
RETURN ; EQUALS 10US
END1
RETURN
main002 ; eticheta main002
pausems .3000
bsf memin ; se seteaza memoria initiala ca fiind 1
testend1 ; se verifica starea tensiunii
pausems .100 ; pauza 100ms
btfss in ;verifica tensiunea
goto ina0
ina1 ; tensiunea = 1
btfss memin ;verifica memoria
goto memin0
memin1 ;memoria initiala = 1
goto testend1 ;sare la inceput
memin0 ;memoria initiala = 0
bsf memin ;se seteaza memoria
bsf out1 ; se activeaza iesirea 1
pausems .5000 ; pauza 5 secunde
bcf out1 ; se dezactiveaza iesirea 1
goto testend1 ; sare la inceput
ina0 ; tensiunea = 0
btfss memin ; verifica memoria
goto memim0
memim1 ;memoria initiala = 1
bcf memin ; se sterge memoria
bsf out2 ;se activeaza iesirea 1
pausems .5000 ; pauza 5 secunde
bcf out2 ; se dezactiveaza iesirea 1
goto testend1 ; sare la inceput
memim0 ;memoria initiala = 0
goto testend1 ; sare la inceput
end; indica sfarsitul programului. Ce urmeaza dupa nu va fi luat in considerare de compilator.
[Trebuie sa fiti înscris şi conectat pentru a vedea această imagine]
;PIC16F684 - Circuit avertizare cadere tensiune retea :
PROCESSOR 16F684; se declara tipul procesorului
INCLUDE
__CONFIG _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_ON & _FCMEN_ON & _HS_OSC; directiva pentru definirea configuratiei de pornire: watchdo=off, reset extern=off, code protect=off, oscilatorul=cristal quatz.
#define in PORTA,2; pinul 10, R0, adica bitul 0 al portului C va mai avea si numele led1
#define out1 PORTC, 0
#define out2 PORTC, 1
UDATA; aceasta directiva declara inceputul de memorie RAM nefolosita
LOCNT RES 1 ; se rezerva un octet(byte) pentru variabila LOCNT
HICNT RES 1
LOOPCNT RES 1
MEM res 1
#define memin MEM, 0
ORG 0; vectorul reset, de aici incepe executia programului
GOTO main001; instructiunea de salt neconditionat la adresa etichetei main001
ORG 4; vectorul intrerupere. Cand are loc o intrerupere, aici sare si incepe executia rutinei de intrerupere
CODE ; se defineste inceputul programului propriuzis, pentru cod relocabil
main001; eticheta main001, se scrie din coloana 0,
;restul codului poate fi scris din urmatoarele coloane (se lasa un spatiu inainte)
;In continuare se vor configura porturile A si C
BCF STATUS, RP0; se selecteaza primul banc de registri
MOVLW 0x00; se incarca in acumulator cifra zero
MOVWF PORTC; se copiaza continutul acumulatorului in registru portc
MOVWF PORTA; se copiaza continutul acumulatorului in registru porta
MOVLW 0X07 ; se incarca in acumulator 7 hexa = 00000111 in binar
MOVWF CMCON0 ; se copiaza continutul acumulatorului in CMCON0
;BIT 210=111 COMPARATORS OFF, CXIN PINS = DIGITAL I/O
BSF STATUS, RP0 ; se selecteaza bancul al doilea de registri
MOVLW b'00000001' ; se copiaza in acumulator numarul 1 in binar
MOVWF ANSEL; BIT 7-0 intrare analogica sau I/O digitala 1=ANALOG INPUT 0=DIGITAL I/O
MOVLW B'00100100'
MOVWF TRISA ; configuratia portului A, 1=intrare, 0=iesire
MOVLW B'00000000'
MOVWF TRISC ; configuratia portului C, 1=intrare, 0=iesire
BCF STATUS, RP0 ; se selecteaza bancul 1 cu registri
; sfarsitul configurarii porturilor A si C
goto main002
;GENERATING PAUSE IN MILISECONDS (1~65535MS)
;PURPOSE OF THIS MACRO IS TO PROVIDE EXACT TIME DELAYS IN PROGRAM.
PAUSEMS MACRO PAR1 ; Se defineste un macro. De fiecare daca cand apare in program "pausems" ca functie, la compilare "pausems" este inlocuit cu urmatoarele cinci instructiuni de mai jos
MOVLW HIGH PAR1 ; HIGHER BYTE OF PARAMETER 1 GOES TO HICNT
MOVWF HICNT
MOVLW LOW PAR1 ; LOWER BYTE OF PARAMETER 1 GOES TO LOCNT
MOVWF LOCNT ;compilatorul imparte numarul respectiv in 2 octeti si nu microcontrolerul
CALL PAUSEMS1
ENDM ;sfarsit macro
PAUSEMS1
LOOP1
MOVF LOCNT, F ; DECREASE HICNT AND LOCNT NECESSARY
BTFSC STATUS, Z ; NUMBER OF TIMES AND CALL SUBPROGRAM DELAY1MS
GOTO DECHI
CALL DELAY1MS
DECF LOCNT, F
GOTO LOOP1
DECHI
MOVF HICNT, F
BTFSC STATUS, Z
GOTO END1
CALL DELAY1MS
DECF HICNT, F
DECF LOCNT, F
GOTO LOOP1
DELAY1MS: ; DELAY1MS PRODUCES A ONE MILISECOND DELAY
MOVLW .100 ; 100*10us=1ms@4MHZ; MOVLW .200 ; 200*5us=1us@8MHZ
MOVWF LOOPCNT ; LOOPCNT<-100
LOOP2:
NOP
NOP
NOP
NOP
NOP
CLRWDT
DECFSZ LOOPCNT, F
GOTO LOOP2 ; TIME PERIOD NECESSARY TO EXECUTE LOOP LOOP2
RETURN ; EQUALS 10US
END1
RETURN
main002 ; eticheta main002
pausems .3000
bsf memin ; se seteaza memoria initiala ca fiind 1
testend1 ; se verifica starea tensiunii
pausems .100 ; pauza 100ms
btfss in ;verifica tensiunea
goto ina0
ina1 ; tensiunea = 1
btfss memin ;verifica memoria
goto memin0
memin1 ;memoria initiala = 1
goto testend1 ;sare la inceput
memin0 ;memoria initiala = 0
bsf memin ;se seteaza memoria
bsf out1 ; se activeaza iesirea 1
pausems .5000 ; pauza 5 secunde
bcf out1 ; se dezactiveaza iesirea 1
goto testend1 ; sare la inceput
ina0 ; tensiunea = 0
btfss memin ; verifica memoria
goto memim0
memim1 ;memoria initiala = 1
bcf memin ; se sterge memoria
bsf out2 ;se activeaza iesirea 1
pausems .5000 ; pauza 5 secunde
bcf out2 ; se dezactiveaza iesirea 1
goto testend1 ; sare la inceput
memim0 ;memoria initiala = 0
goto testend1 ; sare la inceput
end; indica sfarsitul programului. Ce urmeaza dupa nu va fi luat in considerare de compilator.
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum
|
|