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