Acasă / Atelier / Microcontroler / PIC / Cum programam un microcontroler PIC

Cum programam un microcontroler PIC

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

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

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

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

; 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 

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

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

Atașat acestui articol :

PIC16F84A
Filename : pic16f84a.rar (2 KB)

Despre Ciprian

Am dezvoltat o pasiune pentru acest domeniu de cand eram foarte mic, cred ca aveam 6-7 ani, din cate imi amintesc, am invatat sa citesc din revistele Tehnium, cam astea erau preferatele mele la varsta respectiva. In plus, aveam o atractie pentru informatica fapt ce a dus la inscrierea mea la un liceu de informatica, iar pentru a continua cu pasiunea mea m-am inscris apoi la facultatea de electrotehnica...

31 Comentarii

  1. dar placa de dezvoltare ?de unde o iau ?

  2. Pai cred ca gasesti in orice magazin de electronice 🙂

  3. S-or găsi la orice magazin dar mi se par slabe. Îs scumpe, merg prost, necesită port serial, care astăzi printre USB şi Firewire, nu mai există. Cumpără un PICKIT. Sau măcar o clonă Pickit.

  4. Salut.Am o întrebare cu privire la copierea programului dintr-un microcontroler PIC-18F2525-I/SP,dacă acest lucru este posibil.Am un detector de metale puls induction Mikron,made in Bulgaria și aș dori să-l „clonez” pentru că montajul electronic este relativ simplu de reprodus,dar fără softul din microcontroler nu are nici o valoare.

  5. Nu stiu sigur daca il poti copia, e posibil sa fie protejat la scriere. Dar ai putea sa incerci.

  6. salut. programatorul ala merge adaptat si pentru portul paralel? La laptop am numai paralel si nu as vrea sa renunt la programator.

  7. Va salut, va rog sa imi spuneti si mie de unde pot sa descarc programele MPLAB IDE v8.43 si Pony Prog.

    Va multumesc.

  8. Pentru MPLAB 8 IDE gasiti aici un link: http://www.microchip.com/forums/m568375.aspx
    Pentru Pony Prog gasiti aici: http://www.lancos.com/ppwin95.html

    dar din cate vad site-ul celor de la mplab ide e cazut 🙁

  9. eu am un fisier in notepad si ce este in el este :0111110000…:10001100…
    cum il fac fisier hex? ce program trebuie sa folosesc?
    desi el este salvat xxx.hex .
    va multumesc.

  10. Draga Ciprian,
    Te rog sa ma contactezi la marianpetre1@yahoo.com. Vreau sa-mi programezi si mie contra cost un microcontroler PIC.

  11. Cristi71 :

    eu am un fisier in notepad si ce este in el este :0111110000…:10001100…
    cum il fac fisier hex? ce program trebuie sa folosesc?
    desi el este salvat xxx.hex .
    va multumesc.

    Ai putea sa imi trimiti acel fisier si incerc sa te ajut.

    Marian Petre :

    Draga Ciprian,
    Te rog sa ma contactezi la marianpetre1@yahoo.com. Vreau sa-mi programezi si mie contra cost un microcontroler PIC.

    V-am trimis un e-mail!

  12. Salutare,
    Un ajutor in a programa un PIC si sa faca cateceva, mai exact:
    Eu am ales PIC16f84, si vreau sa-l configurez sa aibe 8 iesiri, care sa-mi comande 8 leduri.
    Exemplu:
    Cand primeste comanda de pe RS232. 5ON – sa mi se aprinda ledul, iar cand 5OFF ledul sa mi se stinga. Ledurile sa nu fie conditionate, starea unuia pentru celelalte. Adica daca 5 e aprins, sa le mai pot aprinde si pe celelalte.
    Astept un raspuns va rog

    • Pentru asta trebuie sa folositi portul A ca port de intrare pentru RS232 si B port de iesire.
      O sugestie ar fi:
      RA0 RA1 RA2 RA3
      1 0 0 0 – RB0=1
      0 0 0 0 – RB0=0
      1 0 0 1 – RB1=1
      0 0 0 1 – RB1=0

      1 1 1 1 – RB7=1
      0 1 1 1 – RB7=0

      Deci in functie de comanda primita pe portul A (RS232) trebuie setat portul B. Primul bit din A este valoarea de ON sau OFF.

  13. Buna ziua
    M-ar interesa daca ar fi posibil de realizat un montaj de termometru dual cu PIC care sa afiseze simultan ambele temperaturi cu doi senzori diferiti si sa se poata programa separat,bineinteles cu elemente (relee) de executie diferite. Important ar fi sa fie un singur afisaj.
    Multumesc

  14. Salut Ciprian, m-ar interesa sa ma ajuti sa programez un pic 18f46k20..contra cost desigur..e un programel foarte foarte simplu..daca esti interesat, da-mi un mail..vlad.pecingina@yahoo.com. Salut

  15. Pandrea Gheorghe

    Caut urgent un electronist care este dispus a realiza un montaj electronic privind un „amplificator pentru casti audio”. Multumesc ! Mailul meu : g_pandrea@yahoo.com

  16. Vizireanu Jenica

    Ciprian,soarta m-a adus in Spania,unde locuiesc de ceva timp·In acest moment lucrez la o firma care inchiriaza echipamente pentru spectacole de muzica si lumina,cum ar fi amplificatoare audio,mese de mixaj,spoturi luminoase,etc,toate comandate digital·Unele dintre acaste spoturi sunt echipate,printre alta CI-uri,cu PIC18F242·Ti-as fi profund indatorat daca ai putea sa-mi trimiti la aceasta adresa de mail cat mai multe informatii despre acest circuit,preferabil in limba romana·Am observat cu satisfactie ca esti bine informat in domeniu·In ceea ce ma priveste,sunt un elecronist de hard,de moda veche·Cand vine vorba de soft ma cam pierd·De aceea iti cer sprijinul·Unul din defectele cele mai ciudate pe care le-am intalnit la aceste proiectoare mobile consta in incurcarea comenzilor-ii ceri sa schimbe culoarea si actioneaza irisul sau vrei sa corectezi focalizarea si in loc de asta masina incepe o rotatie in jurul propriei axe,etc·Eu banui ca este vorba de un defect la aceste microcontrolere·Multumesc anticipat,Jan·

    • Ati putea sa imi spuneti ce fel de dmx folositi? Cel mai probabil adresele nu sunt setate corect, verificati fiecare aparat sa fie configurat corect. Varianta cu incurcatul comenzilor o exclud. Am sa scriu un tutorial in legatura cu acest subiect.

  17. Vizireanu Jenica

    In aceste masinasinarii au umblat si persoane care nu au nici o legatura cu electronica·Este posibil sa fi inversat intre ele microcontrolerele·Problema mea este ca seful meu nu vrea sa cumpere un copiator sau un programator de PIC-uri·Nu stiu cum voi putea rezolva aceasta problema,dar,Ciprian,iti raman dator si pentru atat·
    Cu stima,Jan·

    • Se pare ca nu ne intelegem prea bine….
      VERIFICATI DACA ADRESELE APARATELOR SUNT CONFIGURATE CORECT!
      E posibil ca adresa sa fie decalata cu o pozitie si atunci apar aceste probleme spuse de dnv. mai sus. Deci inainte sa desfaceti bietele aparatele incercati totusi sa va asigurati ca problema nu e din cauza unei setari…

  18. Raciulete Aurel

    Salutare tuturor.Si eu ma chinui sa programez un PIC 16F88,care face parte dintr-un proiect de vu-metru cu afisaj LCD.Am realizat un programator JDM pe serial si pauza.Am citit in datasheet-ul microcontrolerului ca suporta LVP(low voltage programming),dar imi da eroare cand citeste dupa programare la o adresa 000h.Nu mai stiu ce sa mai fac.Cred ca ar trebui sa realizez un programator cu alimentare externa.Programatorul l-am realizat de la bobtech.Multumiri anticipate.

  19. Salut. La multi ani!!!
    Am asamblat un vu-metru cu PIC16F88, care trebuie programat.
    Ma poate ajuta cineva sa-mi programeze pic-ul contracost???
    Pe site-ul de unde am luat schema sunt toate instructiunile de programare si fisierele necesare.
    Astept un raspuns.
    Multumesc f mult
    gaby_nicula@yahoo.com

  20. Doresc sa te intreb cum fac sa pun in functiune un pin la un compiuter de masina (ecu)
    Masina nu era prevazuta cu turbo asa ca eu am adaugat unul dar problema este ca tre buie sa activez un pin pentru un senzor cum fac ?

  21. Va salut domnule Ciprian Gramada. Ma confrunt cu o problema de cateva saptamani. Am un circuit de comanda a unui motor de CC, ce foloseste un PIC16F690. Acest Microchip actioneaza 2 relee si fac ca motorul sa aiba un sens de rotatie sau celalat sens. E putin mai complicat sa va explic aici pe site (scris). Am sa va las adresa mea de mail si poate ma puteti ajuta in programarea PIC-ului pas cu pas. Binenteles nu gratis. Va multumesc.

    • GFP Master a inceput saptamana (28.07.2016) asta cursuri de microcontrolere. Daca esti interesast poti veni si tu.
      in afara de asta poate te pot ajuta si cu proiectul tau sa-l termini. Suntem fani procesoare nu afaceristi. ( am facut si porti si bariere cu 16F690 si merg).
      Stefan Martin 0722207997 sau stefan.martin@radacini.ro sau pe site-ul GFPMASTER

  22. Din 15 ianuarie 2016 incepe serie noua de „Electronist aparate si echipamente de automatizari”;
    Aceasta este denumirea oficiala de pe diploma ; in realitate incepem cu familiarizarea cu principalele componente electronice; rezistente; condensatori; diode; tranzistori; si intram in UTILIZARE si programare microcontrolere PIC. Este un curs de 5 luni cu inplicare puternica in latura practica NU TEORIE fara aplicatii directe.De multe ori in scoala de dragul de a se da mare sau ca sa ne dovedeasca nivelul stiintific al unui curs , profesorii s-au pierdut in teoria „chibritului” pierzind esenta: utilizarea in practica a cunostiintelor transmise.
    In final (pe linga o diploma recunoscuta european) veti avea capacitatea si sprijinul dea realiza o schema de reglaj; actionare; etc cu un „PIC” avand in interior propriul dumneavoastra program.
    Nu uitati Lucrurile complicate sunt facute din mai multe lucruri simple”
    Va astept
    Stefan Martin 0722207997 sau stefan.martin@radacini.ro sau pe site-ul GFPMASTER

  23. Va salut , cum generez fisierul .asm , am un fisier scris in micro.C , cum fac sa-l scriu in microcontroler ?,
    trebuie generat fisieru hex dar cum ? multumesc

Lasă un răspuns la Raciulete Aurel Anulează răspunsul

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*