FORUMUL ELECTRONISTILOR

Vezi subiectul anteriorIn josVezi subiectul urmator
DANIEL
DANIEL
DANIEL
Fondator
MESAJE : 13258
MEMBRU DIN : 02/06/2017
LOCATIE LOCATIE : Bucuresti
PROFESIE : Electronist

#1INFORMATIV 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.


Vezi subiectul anteriorSusVezi subiectul urmator
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum