|
PIC16F684 - Lectia 2, cum se citeste o intrare si cum se face pauza (ms) |
|
|
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.  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.
|
|
Ultima actualizare ( Joi, 23 Octombrie 2008 13:55 )
|
|
|
Avem 10 vizitatori şi 8 membri online
|