PIC16F684 - Lectia 2, cum se citeste o intrare si cum se face pauza (ms) Email
Scris de gigitreid   
Luni, 20 Octombrie 2008 18:15

Utilizand acelasi circuit ca data trecuta, cand se inchide butonul SW1, ledul D1 incepe sa clipeasca. Cand se deschide butonul SW1 ledul D1 se va stinge si va ramane stins pana se va inchide butonul SW1.

PIC16F684 circuit de test v2
Aveti mai jos sau aici programul care trebuie compilat si scris in microcontroler:

;Alt exemplu de program scris in asamblare :
    PROCESSOR 16F684; se declara tipul procesorului

    INCLUDE <P16F684.INC>; se incarca in compilator numele si adresele registrilor de functii speciale SFR

    __CONFIG _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _FCMEN_ON & _HS_OSC; directiva pentru definirea configuratiei de pornire: watchdo=off, reset extern=off, code protect=off, oscilatorul=cristal quatz.

    #define led1 PORTC,0; pinul 10, R0, adica bitul 0 al portului C va mai avea si numele led1

    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


    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'00100000'
    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     
      NOP     
      DECFSZ LOOPCNT, F     
      GOTO LOOP2     ; TIME PERIOD NECESSARY TO EXECUTE LOOP LOOP2
      RETURN       ; EQUALS 10US          
END1
      RETURN



main002 ; eticheta main002
    BTFSC PORTA, 5; se testeaza intrarea, daca e 0 logic sare peste urmatoarea instructiune
    GOTO main002 ; 1 logic la intrare; sare la eticheta main002
    NOP; nici o operatie, se consuma aiurea un timp de procesor
    ; ledul va clipi doar cand intrerupatorul este inchis.
    BSF led1; se seteaza 1 bitul led1 definit mai sus (PORTC, RC0)
    ; intructiunea se executa intr-un timp de procesor = 1/4 * frecventa de lucru
    ;   NOP ; no operation, un timp de procesor
    PAUSEMS .500 ;pauza 500ms
    BCF led1; se seteaza 0 bitul led1, un timp de procesor
    ;  NOP ; no operation, un timp
    PAUSEMS .500 ;pauza 500ms
    GOTO main002;(9,10) 2 timpi. Programul sare la eticheta main002
    ; in total 10 timpi de procesor. ledul va clipi cu frecventa de 1/4*10,
    ;deci daca microcontrolerul lucreaza la 4MHZ, ledul va clipi cu 100khz.
    ; Daca masurati cu un frecventmetru la pinul 10 veti observa acest lucru.

    end; indica sfarsitul programului. Ce urmeaza dupa nu va fi luat in considerare de compilator.

 

Comments
Doar utilizatorii inregistrati pot scrie comentarii.!
LAST_UPDATED2
 
 
Statistici vizitatori: [+/-]
Azi:
Ieri:
Alaltaieri:
1239
1242
1310

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

-1129
Luna asta:
Luna trecuta:
Acum doua luni:
26638
23363
0

+23363
Anul asta:
Anul trecut:
50001
0
+50001
Avem 46 vizitatori online