FORUMUL ELECTRONISTILOR

Distribuiţi
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

la data de 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.




Educaţia este ceea ce rămâne după ce ai uitat ceea ce ai fost învăţat în şcoală!
Vezi subiectul anteriorSusVezi subiectul urmator
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum