programarea microcontrolerului

11
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 bidirecţional. Asta poate fi configurat ca o intrare sau ca o ieşire. Următorul număr dupa “RA” este numărul de biţi (0-4). Deci, avem un port cu 5 biţi direcţionali unde fiecare bit poate fi configurat ca bit de intrare sau de ieşire. De la RB0 la RB7 RB este un al doilea port bidirecţional. Se comportă în exact acelaşi mod ca RA, cu excepţia ca există 8 biţi. 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 puteţi folosi este 6V, iar cea minimă este de 2V. OSC1/CLK IN şi OSC2/CLKOUT Aici conectam un ceas extern, astfel încât microcontrolerul are un fel de sincronizare. MCLR Acest pin este folosit pentru a şterge locatii de memorie din interiorul PIC (adică atunci când vrem să -l re-program). În condiţii normale de utilizare este conectat la linia de alimentare pozitiv.

Upload: seitancalin

Post on 16-Apr-2015

35 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: programarea microcontrolerului

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 bidirecţional. Asta poate fi configurat ca o intrare sau ca o ieşire. Următorul număr

dupa “RA” este numărul de biţi (0-4). Deci, avem un port cu 5 biţi direcţionali unde fiecare bit poate fi

configurat ca bit de intrare sau de ieşire.

De la RB0 la RB7

RB este un al doilea port bidirecţional. Se comportă în exact acelaşi mod ca RA, cu excepţia ca există 8

biţi.

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 puteţi folosi este 6V, iar cea minimă este de 2V.

OSC1/CLK IN şi OSC2/CLKOUT

Aici conectam un ceas extern, astfel încât microcontrolerul are un fel de sincronizare.

MCLR

Acest pin este folosit pentru a şterge locatii de memorie din interiorul PIC (adică atunci când vrem să -l

re-program). În condiţii normale de utilizare este conectat la linia de alimentare pozitiv.

Page 2: programarea microcontrolerului

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ă funcţie dorim. Nu vom folosi asta foarte mult.

TOCK1

Acesta este un alt ceas de intrare, care opereaza un temporizator intern. Acesta funcţionează î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.

Page 3: programarea microcontrolerului

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

Page 4: programarea microcontrolerului

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

; *

; Nume proiect: 16F84A.asm *

; Data: 19/05/2011 *

; Autor: Gramada Ciprian *

; 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

;

Page 5: programarea microcontrolerului

#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 off

; Watch Dog timer off

; 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

Page 6: programarea microcontrolerului

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

--------

; 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 ; setam PORTB ca iesire

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

Page 7: programarea microcontrolerului

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

---------

; 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 ; adauga aceasta variabila in registrul

W

movwf PORTB ; si scrie din W in iesirea portului B

return ; apoi se intoarce

Page 8: programarea microcontrolerului

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

----------

;functia DELAY

DELAY

movlw .1 ; Aceasta valoare este timpul de intarziere de

100mS

;(pentru 4Mhz)

; numarul trebuie sa fie intre 1 si

255

goto _Ldelay

_Delay movwf dtime ; Apelare pentru W x 1mS

__Dcall call __1mS

decfsz dtime,F

goto __Dcall

__DlyEnd return

_Ldelay movwf ltime ; Apelare pentru W x 100mS

__Dlcall movlw d'100'

call _Delay

decfsz ltime,F

goto __Dlcall

return

__1mS movlw 0xC6

_next nop

addlw 0xFF

btfss STATUS,Z

goto _next

nop

nop

Page 9: programarea microcontrolerului

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.