sâmbătă, 10 decembrie 2011

Circuit avertizare cadere tensiune retea cu PIC16F684

      Circuitul de mai jos trimite un impuls de 5 secunde pe un releu la caderea tensiunii de retea, iar la revenirea tensiunii de retea transmite alt impuls de 5 secunde pe alt releu. 


      Mai jos este programul scris in MPlab care trebuie compilat si scris in microcontroler.

;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.

0 comentarii:

Trimiteți un comentariu