Sunteți pe pagina 1din 9

Cum programam un microcontroler PIC

Ciprian 24 mai 2011 PIC, Tutoriale 29 comentarii 41,637 Vizualizri

Zilele acestea am primit mai multe mail-uri in legatura cu acest subiect, multi nu au stiut cum pot
programa un microcontroler. Programarea unui microcontroler este destul de simpla, necesita putina
atentie si cunostinte minime in electronica si informatica. Am folosit pentru acest tutorial un microcontroler
destul de renumit care poate fi gasit cu usurinta in orice magazin de specialitate, este vorba despre
PIC16F84. Pentru inceput este recomandat a se citi foaia de lucru (datasheet-ul) microcontrolerului.
Mai jos este o diagram care arat pini microcontrolerului. Voi incerca sa explic rolul fiecarui pin.

De la RA0 la RA4
RA este un port bidirecional. Asta poate fi configurat ca o intrare sau ca o ieire. Urmtorul numr dupa
RA este numrul de bii (0-4). Deci, avem un port cu 5 bii direcionali unde fiecare bit poate fi configurat
ca bit de intrare sau de ieire.
De la RB0 la RB7
RB este un al doilea port bidirecional. Se comport n exact acelai mod ca RA, cu excepia ca exist 8
bii.
VSS si VDD
Acestia sunt pinii de alimentare. VDD este borna pozitiva, i VSS este borna negativa, sau 0V. Tensiunea
de alimentare maxim pe care o putei folosi este 6V, iar cea minim este de 2V.

OSC1/CLK IN i OSC2/CLKOUT
Aici conectam un ceas extern, astfel nct microcontrolerul are un fel de sincronizare.
MCLR
Acest pin este folosit pentru a terge locatii de memorie din interiorul PIC (adic atunci cnd vrem s-l reprogram). n condiii normale de utilizare este conectat la linia de alimentare pozitiv.
INT
Acesta este un pin de intrare care poate fi folosit pentru monitorizare. Dac PIN-ul primeste tensiune
programul se poate reporni, opri sau orice alt funcie dorim. Nu vom folosi asta foarte mult.
TOCK1
Acesta este un alt ceas de intrare, care opereaza un temporizator intern. Acesta funcioneaz n
independent fata de ceasul microcontrolerului. Din nou, nu vom folosi aceasta functie foarte mult.
Sa presupunem ca dupa cele spuse mai sus am realizat o schema ca in modelul prezentat mai jos:

Pentru a introduce programul in microcontroler avem nevoie de doua programe, unul este MPLAB IDE si
PonyProg.
Deschidem MPLAB IDE selectam microcontrolerul.

Dupa ce am selectat microcontrolerul creem un proiect nou si incepem editarea programului.


;******************************************************************

Nume proiect:

Data:

19/05/2011

Autor:

Gramada Ciprian

16F84A.asm

*
*
*

www.electrodb.ro

;**********************************************************************
;
;
;
;

*
Note:

1. PIC 16F84A datasheet-ul poate fi gasit la:

http://ww1.microchip.com/downloads/en/DeviceDoc/35007b.pdf *

; PENTRU A PROGRAMA MICROCONTROLERUL


; ------------------------------

*
*

; Instaleaza MPLAB IDE

; Deschide acest fisier in programul MPLAB IDEO

; din meniul de sus alege: Configure - Select Device

; in casuta 'device' selecteaza PIC16F84A, si apoi "Ok"

; din meniul de sus alege: Project - Quickbuild 16F84A.asm


;

; In acelas director ca si cel in care se gaseste acest fisier


; vei gasi un fisier cu numele 16F84A.HEX

*
*

; Acesta trebuie deschis cu programul in care se face programarea *


; si introdusa in microcontroler

;**********************************************************************
list

p=16F84A

; Directiva 'list' defineste numele procesorului

;
#include <p16F84A.inc>

; include <fisier> este o directiva standard

; defineste specificatiile procesorului


;-----------------------------------------------------------------------------------; directiva '__CONFIG' este folosita pentru configurarea microcontrolerului.
; Tabelul cu configurarea este afisat in fisierul '.inc' respectiv.
; Sau poate fi gasit si in foaia de lucru a microcontrolerului(datasheet).
;
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
; Aici setam biti de configurare

; Code protect of
; Watch Dog timer of
; Power-up timer delay on
; Setam tipul de oscilator in HS - High speed crystal/resonator >3.5Mhz
; schimba in _RC_OSC pentru rezistor/capacitor
; schimba in _XT_OSC pentru cristal/rezonator <3.5Mhz
;-----------------------------------------------------------------------------------; definim variabilele in 'General Purpose Register' (GPR)
; nota: memoria GPR a 16F84A incepe la 0x0C dar in alte PIC-uri incepe la 0x20
; Aici folosim 0x20 pentru compatibilitate cu noile PIC-uri
cblock 0x20
copiePORTB

; variabila pentru a copia PORTB

ltime

; folosit pentru functia de intarziere

dtime

; folosit pentru functia de intarziere

endc
;-----------------------------------------------------------------------------------; Definim selectarea bankului
#define bank0

bcf

STATUS,RP0

; Sel Bank 0

#define bank1

bsf

STATUS,RP0

; Sel Bank 1

;----------------------------------------------------------------------------------; Definim o constanta pentru bit-ul din partea stanga si alta pentru bit-ul din dreapta
BitStanga equ 7 ;|_______________PORTB
BitDreapta

equ 0 ;_______________|PORTB

; ---------------------------------------------------------------------------------; Programul incepe aici


RESET_VECTOR

org

0x000

; In aceasta sectiune initializam porturile I/O si variabilele


;
START

bank1

; selectam registrul bank 1


; asta este o pseudoinstructiune definita mai sus

clrf

TRISB

bank0

; setam PORTB ca iesire


; selectam registrul bank 0

; asta este o pseudoinstructiune definita mai sus


movlw

7<<BitDreapta

; insereaza in W, 7(111) in dreapta

movwf

copiePORTB

; apoi initializez variabila

;------------------------------------------------------------------------------------; Codul principal


MUTASTANGA

clrc

rlf

copiePORTB,F

; roteste variabila spre stanga

call

OUTPUT

; apeleaza functia de afisare

call

DELAY

; apeleaza functia de intarziere

btfss

copiePORTB, BitStanga

; verifica daca s-a ajuns la bit-ul din stanga

goto

MUTASTANGA

; daca nu se intoarce la eticheta MUTASTANGA

MUTADREAPTA

clrc

rrf

copiePORTB,F

; roteste varibila spre dreapta

call

OUTPUT

; apeleaza functia de afisare

call

DELAY

; apeleaza functia de intarziere

btfss

copiePORTB, BitDreapta

; verifica daca s-a ajuns la bit-ul din dreapta

goto

MUTADREAPTA

; daca nu se intoarce la eticheta MUTADREAPTA

goto

MUTASTANGA

; altfel se intoarce inapoi la MUTASTANGA

;--------------------------------------------------------------------------------;Functia OUTPUT
OUTPUT

movfw

copiePORTB

movwf

PORTB

return

; adauga aceasta variabila in registrul W


; si scrie din W in iesirea portului B
; apoi se intoarce

;-------------------------------------------------------------------------------------;functia DELAY
DELAY
movlw

.1

; Aceasta valoare este timpul de intarziere de 100mS


;(pentru 4Mhz)
; numarul trebuie sa fie intre 1 si 255

goto
_Delay

movwf

__Dcall

call
decfsz
goto

_Ldelay
dtime

; Apelare pentru W x 1mS

__1mS
dtime,F
__Dcall

__DlyEnd return
_Ldelay

movwf

__Dlcall

movlw
call
decfsz
goto
return

ltime
d'100'
_Delay
ltime,F
__Dlcall

; Apelare pentru W x 100mS

__1mS

movlw

_next

nop
addlw

0xC6
0xFF

btfss

STATUS,Z

goto

_next

nop
nop
nop
return
end

Programul in format ASM si HEX le gasiti aici.

Dupa ce a fost scris, programul trebuie asamblat (in MPLAB IDE) si apoi introdus in microcontroler,
pentru asta putem folosi PonyProg.

Ataat acestui articol :

S-ar putea să vă placă și