PIC16F684 - Circuit avertizare cadere tensiune retea Email
Scris de gigipatrud   
Joi, 23 Octombrie 2008 14:06

 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.

scheme electronica circuit avertizare cadere tensiune retea

 

;PIC16F684 - Circuit avertizare cadere tensiune retea :
    PROCESSOR 16F684; se declara tipul procesorului

    INCLUDE <P16F684.INC>; 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.

 

Comments
Doar utilizatorii inregistrati pot scrie comentarii.!
sica20  - cateva intrebari |2009-03-17 14:36
Buna seara!
In zona in care locuiesc sunt fluctuatii mari pe retea...si as dori sa pun in
aplicare schema asta...
as vrea sa stiu ce este modulul CONN1 si rolul sau.
Cele 2 relee ce caracteristici au?

Schema nu merge adaptata si pentru supratensiuni?
Ma gandesc la o dioda zenner conectata la un pin al microcontrolerului (unde si
cum, nu ma pricep :unsure: )

Multumesc anticipat!
admin  - circuit avertizare cadere revenire tensiune retea |SAdministrator |2009-03-17 16:19
- CONN1 este un conector pentru programarea microcontrolerului. ICSP = in
circuit serial programming. Practic de la programator vin 5 fire care au
denumirea scrisa in chenar.

- Releele au bobina alimentata la 12V iar contactele sa suporte sarcina pe care
o vei comanda (220V)

- Daca vrei avertizare la supratensiune, pe care sa o folosesti la decuplarea
unui consumator, de exemplu, circuitul mai are nevoie de inca un releu si
tranzistorul care il comanda. Pentru asta trebuie modificat doar soft-ul care se
va scrie in microcontroler astfel incat intrarea de la pinul 11 sa fie
considerata intrare analogica si sa se verifice nivelul tensiunii la acel pin.
Cand depaseste o anumita valoare sa dea comanda mai departe la releu.
 
 
Statistici vizitatori: [+/-]
Azi:
Ieri:
Alaltaieri:
1241
1242
1310

-68
Saptamana asta:
Saptamana trecuta:
Cu 2 sapt. in urma:
3793
8387
9516

-1129
Luna asta:
Luna trecuta:
Acum doua luni:
26640
23361
0

+23361
Anul asta:
Anul trecut:
50001
0
+50001
Avem 70 vizitatori online