Programando PIC16F628A para piscar um LED - MakerHero

Programando PIC16F628A para piscar um LED 88

Agora que você já sabe como conectar o seu Gravador de PIC USB 40 ZIF ao computador, usando as informações do post Como utilizar o Gravador de PIC USB 40 ZIF, vamos mostrar neste projeto um tutorial passo-a-passo de como programar o PIC16F628A para piscar um LED.

PIC16F628A

Ao final deste tutorial, você terá programado o seu microcontrolador PIC16F628A com um pequeno programa que pisca um led ligado à porta 1 (pino 18 do PIC). Vamos dividir este tutorial em 5 passos:

  1. Instalação do compilador C CCS
  2. Instalação e configuração do MPLAB
  3. Criação do programa e geração do arquivo HEX
  4. Gravação do microcontrolador usando MicroBRN
  5. Teste do microcontrolador na protoboard

As informações deste post foram testadas em um computador com Windows 7 64 bits, mas servem de base para outras versões do Windows e também outros sistemas operacionais, como Linux e Mac. O tutorial é um pouco extenso e recomendamos não pular passos e seguir o tutorial conforme é apresentado, pois algumas tarefas dependem das anteriores.

1 – Instalação do compilador C CCS

O primeiro passo é a instalação do Compilador C, que será utilizado juntamente com o MPLAB para gerar o arquivo HEX. É importante que a instalação do compilador seja feita antes da instalação do MPLAB.

O compilador C CCS é uma versão demo, mas totalmente funcional, que pode ser baixada neste link. É necessário o preenchimento de um pequeno cadastro para liberação do download, que irá gerar o arquivo DEMOUPD.EXE no seu computador.

A instalação é simples e não requer configuração adicional. No final da instalação, permita que o instalador configure os plugins para o MPLAB X:

Compilador C - Plugins

2 – Instalação do MPLAB

O MPLAB é um software da Microchip, fabricante do microcontrolador PIC16F628A, que iremos utilizar nesse experimento. A versão que utilizamos é a MPLAB X IDE 2.0 e pode ser baixada nesse link. Note que o pacote de instalação tem 358 Mb e que o tempo de download vai variar de acordo com a sua conexão de internet:

MPLAB X Pagina download

O arquivo baixado tem o formato ZIP, e ao descompactar temos um único arquivo chamado MPLABX-V2.00-windows-installer.exe. Execute este arquivo e terá início o processo de instalação.

Na tela inicial, clique em NEXT :

MPLab Install - Tela inicial

A tela seguinte apresenta os termos da licença de software. Clique em I accept the agreement :

MPLab Install - License Agreement

Escolha o local de instalação do programa. No nosso caso, o MPLAB foi instalado na pasta C:Program Files (x86)MicrochipMPLABX :

MPLab Install - Pasta

Clique em Next na próxima tela para iniciar a instalação :

MPLab Install - Pronto para instalacao

Terá início o processo de instalação e cópia dos arquivos :

MPLab Install - Instalando

Antes do final da instalação, o Windows emitirá um alerta dizendo que o Sistema Operacional não pôde verificar a assinatura digital do driver. Clique em Instalar este software de driver mesmo assim. Não há risco de danificar o computador pois estamos utilizando o software de uma fonte confiável :

MPLab Install - Driver - Aviso

A tela final de instalação do MPLAB será apresentada. Mantenha a opção XC compilers are not installed with the IDE desativada e clique em FINISH :

MPLab Install - Instalacao finalizada

Antes de iniciarmos a compilação do projeto, vamos finalizar a configuração do plugin do CCS que instalamos anteriormente. Inicie o MPLAB :

MPLab - Tela inicial

No menu Tools, clique em Plugins. Na tela de configuração de plugins, escolha o plugin CCS C Compiler e clique em install :

MPLab - Plugins CCS Install

O plugin do CCS será instalado e, ao final, permita que o instalador reinicie o MPLAB para que as alterações tenham efeito.

3 – Criação do programa e geração do arquivo HEX

Na tela inicial do MPLAB você irá criar um novo projeto. Selecione FILE > NEW PROJECT :

MPLab - File New Project

Na próxima tela, em CATEGORIES, selecione Microchip Embedded e, em Projects, selecione Standalone Project, depois clique em NEXT :

MPLab - Selecionando projeto

Vamos agora selecionar a familia e o microcontrolador que iremos utilizar no projeto. No nosso caso, a familia será Mid-Range 8-bit MCUs (PIC12/16/MCP), e o dispositivo (device) será PIC16F628A :

MPLab - Selecionando microcontrolador

A próxima tela, SELECT HEADER, é opcional, deixe o valor em None e clique em NEXT :

MPLab -Select Header

Na tela Select Tool, também não altere nada e clique em NEXT :

MPLAB - Select Tool

Na próxima tela, iremos selecionar o compilador, e utilizaremos o CCS C Compiler, que instalamos e configuramos anteriormente :

MPLab - Selecionando compilador

Agora, dê um nome ao projeto, e selecione a sua localização no disco.  Criamos no disco C: uma pasta chamada PIC Projetos :

MPLAB - Selecionando Project Name and folder

Clique em Finish e a estrutura do projeto será criada no MPLAB :

MPLab -Estrutura do projeto

No lado esquerdo da tela, clique com o botão direito em SOURCE FILES, depois, em NEW, e finalmente em C Source File. Na tela que será apresentada, digite o nome do arquivo que será criado. Usamos o nome : PIC_LED. Após escolher o nome, clique em Finish :

MPLab - New C source File

Repare agora que no lado esquerdo da tela, abaixo de Source Files, há o nome PIC_LED.c, e à direita, uma área em branco para edição do programa :

MPLab - Tela de edicao

No lado direito, na área de edição, digite ou copie o programa abaixo :

//Programa : Pisca LED com PIC16F628A
//Autor : MakerHero

//Carrega a biblioteca para o microcontrolador PIC16F628A
#include <16F628A.h>

//Configuracao FUSES
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOMCLR
#FUSES NOLVP
#FUSES NOCPD

//Define a utilização do clock interno de 4 Mhz
#use delay(clock=4000000)

#define PINOLED PIN_A1 //Pino ao qual o led esta ligado

void main()
{
while (1)
 {
  output_bit(PINOLED, TRUE); // Liga o Led
  delay_ms(5000); // Aguarda 3 segundos
  output_bit(PINOLED, FALSE); // Desliga o Led
  delay_ms(2000); // Aguarda 2 segundos
 }
}

Com o programa pronto, aperte o botão correspondente à opção Clean and Build Main Project (em azul). O projeto será compilado e o arquivo HEX gerado na pasta C:PIC ProjetosProjeto_PIC_LED_PISCA.Xdistdefaultproduction. Lembre-se que esta pasta foi a que usamos para os testes. No seu computador, essa informação pode ser diferente :

MPLab - Build successful

É esse arquivo HEX que iremos utilizar no passo seguinte, para finalmente gravarmos o programa no microcontrolador.

4 – Gravação do PIC16F628A usando MicroBRN

Conecte o seu Gravador de PIC USB 40 ZIF ao computador e abra o software MicroBRN. No menu FILE, escolha a opção LOAD e navegue até a pasta onde o arquivo HEX foi gravado, carregando-o. Sua tela ficará parecida com essa :

MicroBRN - Tela principal

Observe no lado direito da tela que ao selecionar o chip 16F628A, o programa já informa a maneira como o microcontrolador deve ser encaixado no gravador. O círculo amarelo em cima do chip indica o pino 1.

PIC16F628A no Gravador

Clique no botão PROGRAM e o programa será transferido para o microcontrolador. Se não houver nenhum erro, esse será o resultado final :

MicroBRN - Gravacao completada

Pronto.  Agora é só montar o circuito e testar o PIC !

5 – Teste do microcontrolador na protoboard

Monte o circuito abaixo, e conecte-o à uma fonte de 5v. O pino 14 do PIC vai ligado ao Vcc, e o pino 5 deve ser ligado ao GND. Para ligação do led ao pino 18, utilizamos um resistor de 1 K. Confira o datasheet do PIC16F628A para maiores informações e pinagem do CI :

PIC16F628A Pisca Led

O led ligado ao pino 18 começará a piscar, indicando que a gravação do microcontrolador foi feita com sucesso. Você pode utilizar pilhas para alimentar o circuito, como fizemos nos nossos testes:

Circuito PIC16F628A e led

 Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

88 Comentários

  1. Como adiciono o programa salvo na área de trabalho no MPLAB

  2. Alguém pode me mandar o programa de configuração e test do LCD 16X20
    E O CIRCUITO PARA EU MONTAR NO PROTEUS
    NAO ENTENDI O CODIGO
    NAO ESTAR COMPLETO DO COMEÇO AO FIM .

  3. Como configurar o timer0 do pic 12f1822 para piscar um led na frequencia de um segundo usando CCS Compiler? fiz desse jeito mas não sei se está correto, a frequência nãoestá ok. Se alguém puder me ajudar.

    #include
    int time = 0;//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    #INT_TIMER0
    void TIMER0_isr(void)

    {
    time ++;//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    //}
    //set_timer0(6);
    set_timer0(0);
    clear_interrupt(int_timer0);
    //set_timer0( 15369 + get_timer0()); //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    //Inicialização da contagem para o proximo ciclo de interrupcao com 15369
    //get_timer_0() compensa o tempo de execucao das operacoes do timer ( delay_ms(50) )
    }
    void main()
    {
    setup_adc_ports(sAN1|sAN2|sAN3);
    setup_adc(ADC_CLOCK_INTERNAL);

    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit); //65,5 ms overflow
    clear_interrupt(int_timer0); //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    enable_interrupts(INT_TIMER0);
    enable_interrupts(GLOBAL);
    //set_timer0( 15369); //;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    //set_timer0(6);
    set_timer0(0); //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    while(TRUE)
    {
    if (time 7)
    {
    output_low(pin_a5);
    output_low(pin_a0);
    }
    if (time > 14 )
    { time = 0;

    }
    }
    }

    1. Ola Amanda,

      Você pode lançar a sua dúvida na nossa comunidade do Facebook, por lá o pessoal Maker está compartilhando conhecimento e projetos. Veja só: https://www.facebook.com/groups/272908123918982

      Abraços!
      Vinícius – Equipe MakerHero

  4. Pessoal alguém pode me informar posso usar pic microcontrolador para uso comercial crial algum circuito próprio e software e vender alguém tem informações texto tutorial,Adilson você que é formado me oriente.

    1. Olá Antônio!

      É possível sim embarcar um PIC em um produto comercial, inclusive há algum produtos que usam o PIC sim.

      Abraço!
      Rosana – Equipe MakerHero

  5. baixei o c ccs no link instalei e já veio expirado…….

    parabéns pelas dicas, obrigado.

  6. Gostaria de saber quanto custa o gravador de pic

  7. Alguém pode me ajudar nessa questão:

    Analise o código fonte abaixo:

    #include

    #FUSES NOWDT, NOBROWNOUT, NOLVP, NOMCLR

    #use delay(crystal=20000000)
    #use FIXED_IO( A_outputs=PIN_A1 )
    #define LED PIN_A1

    void main()
    {
    while (1)
    {
    output_bit(LED, TRUE);
    delay_ms(5000);
    output_bit(LED, FALSE);
    delay_ms(2000);
    }
    }

    Explique o seu funcionamento e anexe o desenho do circuito para o funcionamento da lógica

  8. Excelente,rápido e objetivo.

  9. Utilizando um gravador JDM também funciona?

    1. Olá Antônio,

      Acredito que o procedimento será diferente.

      Abraço!
      Rosana – Equipe MakerHero

  10. olá, gostaria de saber se voce disponibiliza o arquivo de dominio .h?

  11. BOM DIA GOSTARIA QUE SE FOR POSSÍVEL ENTRAR EM CONTATO
    TENHO UM CÓDIGO ASM RECEPTOR RX COM PIC 12F675 DE 1 CANAL
    E NÃO CONSIGO GRAVAR UM PIC
    OU MELHOR SE CONSEGUE FAZER UM PROGRAMA PARA PIC 12F629 OU 675 GOSTARIA MUITO DA SUA AJUDA
    E AO MESMO TEMPO COMO TODO TRABALHO TEM SEU PREÇO ESTOU DISPOSTO A PAGAR POR ISTO
    POR FAVOR ENTRAR EM CONTATO

  12. Boa tarde, me desculpe sou leigo no assunto.
    Para usar esse microcontrolador tem programar os arquivos hex para que ele funcione. Pensei que era só montar os circuito.

    Grato.

  13. Quais mudanças neste codigo são necessárias para usar o pic16f676?

  14. Bom dia amigos! Preciso de uma ajuda, segui passo o passo o tutorial acima para criar o arquivo .HEX para um PIC12F675, mas não deu certo, alguem poderia de dar um HELP? Grato! Segue abaixo o código:

    ;**********************************************************************
    ; This file is a basic code template for assembly code generation *
    ; on the PIC12F675. This file contains the basic code *
    ; building blocks to build upon. *
    ; *
    ; Refer to the MPASM User’s Guide for additional information on *
    ; features of the assembler (Document DS33014). *
    ; *
    ; Refer to the respective PIC data sheet for additional *
    ; information on the instruction set. *
    ; *
    ;**********************************************************************
    ; *
    ; Filename: xxx.asm *
    ; Date: *
    ; File Version: *
    ; *
    ; Author: *
    ; Company: *
    ; *
    ; *
    ;**********************************************************************
    ; *
    ; Files Required: P12F675.INC *
    ; *
    ;**********************************************************************
    ; *
    ; Notes: *
    ; *
    ;**********************************************************************

    list p=12f675 ; list directive to define processor
    #include ; processor specific variable definitions

    #define motorDir 7
    #define motorOff 6
    #define motorOn 5
    #define motorState 4

    #define motorOnLow 206
    #define motorOnRange 206
    #define pulseShortL 0x07
    #define pulseShortH 0x02
    #define pulseLongL 0xd5
    #define pulseLongH 0x03
    #define pulseDead 25
    #define pulseRange 231 ;plus and minus

    #define RDrivePin GPIO5
    #define FDrivePin GPIO4

    errorlevel -302 ; suppress message 302 from list file

    __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

    ; ‘__CONFIG’ directive is used to embed configuration word within .asm file.
    ; The lables following the directive are located in the respective .inc file.
    ; See data sheet for additional information on configuration word settings.

    ;***** VARIABLE DEFINITIONS
    w_temp EQU 0x20 ; variable used for context saving
    status_temp EQU 0x21 ; variable used for context saving
    PWM_reg EQU 0x22 ;dir,off,on,state,x,x,x,x
    PWM_CountON EQU 0x23
    PWM_CountOFF EQU 0x24
    TestReg EQU 0x25

    TempTH EQU 0x26
    TempTL EQU 0x27
    AH EQU 0x26
    AL EQU 0x27
    BH EQU 0x28
    BL EQU 0x29
    PulseCentreL EQU 0x3a
    PulseCentreH EQU 0x3b

    ;**********************************************************************
    ORG 0x000 ; processor reset vector
    goto main ; go to beginning of program

    ORG 0x004 ; interrupt vector location
    movwf w_temp ; save off current W register contents
    movf STATUS,w ; move status register into W register
    movwf status_temp ; save off contents of STATUS register

    ; isr code can go here or be located as a call subroutine elsewhere
    ;
    btfss INTCON,T0IF
    goto IntNotTimer0
    ;Timer over flow
    btfss PWM_reg,motorState
    goto IntMotorStateLow
    ;Set state low
    bcf PWM_reg,motorState
    movf PWM_CountOFF,w
    bcf STATUS,RP0
    movwf TMR0
    bcf INTCON,T0IF
    btfsc PWM_reg,motorOn
    goto IntNotTimer0
    ;Switch off output as always on flag not set
    bcf GPIO,FDrivePin
    bcf GPIO,RDrivePin
    goto IntNotTimer0
    IntMotorStateLow
    ;Else Set state high
    bsf PWM_reg,motorState
    movf PWM_CountON,w
    bcf STATUS,RP0
    movwf TMR0
    bcf INTCON,T0IF
    btfsc PWM_reg,motorOff
    goto IntNotTimer0
    ;Switch on output as always on flag not set
    btfsc PWM_reg,motorDir
    goto IntMotorOnRev
    ;Switch motor on forward
    bcf GPIO,RDrivePin
    bsf GPIO,FDrivePin
    goto IntNotTimer0
    IntMotorOnRev
    ;else switch motor on reverse
    bcf GPIO,FDrivePin
    bsf GPIO,RDrivePin
    ;goto IntEnd

    IntNotTimer0
    BTFSS INTCON,INTF
    goto IntEnd
    ;input pin change
    bsf STATUS,RP0
    btfss OPTION_REG,INTEDG ;Test for up or down edge
    goto IntDownEdge
    ;Start of pulse so start timer
    bcf OPTION_REG,INTEDG
    bcf STATUS,RP0
    bsf T1CON,TMR1ON
    bcf INTCON,INTF
    goto IntEnd
    IntDownEdge
    ;End of Pulse read timer and set PWM parameters
    bsf OPTION_REG,INTEDG
    bcf STATUS,RP0
    bcf T1CON,TMR1ON
    bcf INTCON,INTF
    ;Read time
    movf TMR1L,w
    movwf TempTL
    movf TMR1H,w
    movwf TempTH
    ;Test for viable range
    andlw b’11111000′
    btfss STATUS,Z
    goto IntPulseInvalid ;Pulse too long
    movf TempTH,w
    andlw b’00000111′
    btfsc STATUS,Z
    goto IntPulseInvalid ;Pulse too short
    ;Decode time
    movf PulseCentreL,w
    movwf BL
    movf PulseCentreH,w
    movwf BH
    call Sub16Bit
    btfss TempTH,7
    goto IntPulseForward
    ;Motion is reverse
    bsf PWM_reg,motorDir
    ;Invert time
    movlw 0x01
    movwf BL
    clrf BH
    call Sub16Bit
    movlw 0xff
    xorwf TempTL,f
    xorwf TempTH,f
    goto IntPulseMagMeasurement
    IntPulseForward
    ;Motion is forward
    bcf PWM_reg,motorDir
    IntPulseMagMeasurement
    ;Subtract dead zone
    movlw 0x19
    movwf BL
    clrf BH
    call Sub16Bit
    btfss TempTH,7
    goto IntPulseMagGTDZ
    ;Pulse in dead zone
    bcf PWM_reg,motorOn
    bsf PWM_reg,motorOff
    goto IntPulseComplete
    IntPulseMagGTDZ
    ;Subtract variable range
    movlw 0xCE
    movwf BL
    clrf BH
    call Sub16Bit
    btfsc TempTH,7
    goto IntPulseMagLTM
    ;Pulse greater than variable range
    bcf PWM_reg,motorOff
    bsf PWM_reg,motorOn
    goto IntPulseComplete
    IntPulseMagLTM
    bcf PWM_reg,motorOff
    bcf PWM_reg,motorOn
    movf TempTL,w
    xorlw 0xff
    movwf PWM_CountON
    movlw 0x02
    subwf TempTL,w
    movwf PWM_CountOFF

    IntPulseInvalid
    IntPulseComplete
    ;Clr tmr1 ready for next pulse
    clrf TMR1H
    clrf TMR1L

    IntEnd
    movf status_temp,w ; retrieve copy of STATUS register
    movwf STATUS ; restore pre-isr STATUS register contents
    swapf w_temp,f
    swapf w_temp,w ; restore pre-isr W register contents
    retfie ; return from interrupt

    ; these first 4 instructions are not required if the internal oscillator is not used
    main
    call 0x3FF ; retrieve factory calibration value
    bsf STATUS,RP0 ; set file register bank to 1
    movwf OSCCAL ; update register with factory cal value
    bcf STATUS,RP0 ; set file register bank to 0

    ; remaining code goes here

    ;Initialise bridge control
    bsf STATUS,RP0
    bcf TRISIO,FDrivePin
    bcf STATUS,RP0
    bcf GPIO,FDrivePin ;Make FDrivePin output and set low
    bsf STATUS,RP0
    bcf TRISIO,RDrivePin
    bcf STATUS,RP0
    bcf GPIO,RDrivePin ;Make RDrivePin output and set low

    ;initialize other port pins

    bsf STATUS,RP0
    clrf ANSEL
    bsf TRISIO,GPIO2
    bcf STATUS,RP0
    ;bsf GPIO,GPIO2
    ;Initialize variables
    clrf PWM_reg
    bsf PWM_reg,motorOff ;Set motor off state
    movlw 0x7f ;set to 256-minium number so true tmr0 overflow is caught
    movwf PWM_CountON
    movlw 0x7f ;Set to max count before overflow
    movwf PWM_CountOFF

    ;timer0 initialize
    bsf STATUS,RP0
    bcf OPTION_REG,T0CS ;timer 0 set to trigger on instruction clk
    bcf OPTION_REG,PSA ;timer 0 set to trigger on instruction clk
    bcf OPTION_REG,PS2 ;timer 0 set to trigger on instruction clk
    bsf OPTION_REG,PS1 ;timer 0 set to trigger on instruction clk
    bsf OPTION_REG,PS0 ;timer 0 set to trigger on instruction clk
    bcf STATUS,RP0

    ;timer1 initialization
    bsf T1CON,T1CKPS0
    clrf TMR1H
    clrf TMR1L

    ;Test pulse
    ;wait a while
    clrf TempTL
    clrf TempTH
    DLoop1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    decf TempTL,F
    btfss STATUS,Z
    goto DLoop1
    decf TempTH,F
    btfss STATUS,Z
    goto DLoop1
    Timefalse
    ;wait for int pin low
    btfsc GPIO,GPIO2
    goto Timefalse
    ;wait for up on int pin
    PinNotHigh
    btfss GPIO,GPIO2
    goto PinNotHigh
    ;Start timer
    bsf STATUS,RP0
    bcf OPTION_REG,INTEDG
    bcf STATUS,RP0
    bsf T1CON,TMR1ON
    ;wait for int pin low
    PinNotLow
    btfsc GPIO,GPIO2
    goto PinNotLow
    ;Test pulse length measurement
    ;End of Pulse read timer and set PWM parameters
    bsf STATUS,RP0
    bsf OPTION_REG,INTEDG
    bcf STATUS,RP0
    bcf T1CON,TMR1ON
    ;Read time
    movf TMR1L,w
    movwf TempTL
    movf TMR1H,w
    movwf TempTH
    ;Test for viable range
    andlw b’11111000′
    btfss STATUS,Z
    goto Timefalse ;Pulse too long
    movf TempTH,w
    andlw b’00000111′
    btfsc STATUS,Z
    goto Timefalse ;Pulse too short
    ;Place time in reg
    movf TempTL,w
    movwf PulseCentreL
    movf TempTH,w
    movwf PulseCentreH

    ;interupt configuration
    ;interupt config on tmr0 for pwm motor control
    bsf INTCON,T0IE
    bcf INTCON,T0IF
    bsf INTCON,INTE
    bcf INTCON,INTF
    bsf INTCON,GIE

    ;loop
    ; movlw 0xc0
    ; movwf PWM_CountON
    ; movlw 0x3f
    ; movwf PWM_CountOFF
    ; bcf PWM_reg,motorOff
    ; bcf PWM_reg,motorOn
    ; bcf PWM_reg,motorDir
    MainLoop
    ; btfsc GPIO,0x03;GPIO4
    ; bsf PWM_reg,motorDir
    ; btfss GPIO,0x03;GPIO4
    ; bcf PWM_reg,motorDir
    nop
    goto MainLoop

    Sub16Bit ;Subtracts one 16bit number from another A-B ALow AHigh BLow BHigh
    movf BL,W
    subwf AL,F
    movf STATUS,W
    xorlw b’1′
    andlw b’00000001′
    addwf BH,W
    subwf AH,F
    return
    Add16Bit ;Adds A+B
    movf BL,W
    addwf AL,F
    movf STATUS,W
    andlw b’00000001′
    addwf BH,W
    addwf AH,F
    return
    ;Test time and set PWM regs accordingly
    TestPWMSig
    ;remove 1000 counts
    ;if less that zero set full reverse
    ;limit to 1000 counts
    ;if more than 100 set to full forward
    ;divide by 2
    ;subtract 250
    ;if negative set to reverse and subtract 1 and invert to obtain posiyive number
    ;else set to forward
    ;if time less than 16 set to off
    ;if time greater than 240 set to on
    ;Else set pwm_on count to time and pwm_off count to ff-time

    ; initialize eeprom locations

    ORG 0x2100
    DE 0x00, 0x01, 0x02, 0x03

    END ; directive ‘end of program’

  15. Ola, boa tarde. Eu gostaria de saber se para programar um robo explorador, este tipo este mesmo exemplo serve para ser executado.

    1. Como assim robô explorador?

  16. Boa tarde.
    Estou com muita dificuldade em conseguir gravar e extrair o fonte do microcontrolador 16F883, poderia me ajudar….

  17. Boa tarde Felipe estou fazendo um carrinho de carga elétrico mais não consigo fazer a placa de controle de velocidade do motor, o motor e um de corrente cc mais a sua corrente e muito alta aproximando aí uns 30 amperes. eu gostaria de saber se vocês fazem e quanto eu tenho que pagar.

  18. Boa tarde, Felipe estou fazendo um carrinho de carga elétrico mais não consigo fabricar a placa de controle de velocidade, o motor e um de corrente cc 12 a 24v mais a corrente e alta aproximado aí de uns 30 Amper, o potenciômetro será o acelerador e será instalado no carrinho como um acelerador de moto.

  19. Obrigado, ajudou um pouco na minha pesquisa.

    Parabéns pela iniciativa.

  20. Boa noite..
    Pediria uma ajude se possivel, tenho compilador versão 4.78..Bom fiz programa ,compilei até ai tudo bem.
    Mas nos arquivos gerados na compilação não aparece o arquivo hex,só nomes diferentes.Por favor qual arquivo
    certo?? Por ex: apareçe arquivos gerados de nome; C.SOUCE FILE,C OBJET FILE,C OUTPUT FILE.
    QUAL USAR?
    Fico grato por resposta.
    josue…

  21. O programa funciona corretamente, mas acho estranho não haver explicitamente a programação do registro TRISA. Pergunto então por que não precisou.

  22. Olá, onde eu encontro para comprar um case de pilhas AA com switch igual a este utilizado no tutorial.
    Obrigado

  23. Eu queria saber o motivo do erro que aparece no mpla ide quando eu tento compilar o programa e criar o arquivo hex. Estou testando o programa para funcionar num microcontrolador pic16f628a no MPLAB IDE v.8.63
    O erro em fazer o BUILD é:

    Debug build of project `C:UsersalunoDesktopteste2.mcp’ started.
    Language tool versions: MPASMWIN.exe v5.39, mplink.exe v4.38, mplib.exe v4.38
    Preprocessor symbol `__DEBUG’ is defined.
    Tue Apr 19 18:21:29 2016
    ———————————————————————-
    Build aborted. The project contains no source files.
    ———————————————————————-
    Debug build of project `C:UsersalunoDesktopteste2.mcp’ failed.
    Language tool versions: MPASMWIN.exe v5.39, mplink.exe v4.38, mplib.exe v4.38
    Preprocessor symbol `__DEBUG’ is defined.
    Tue Apr 19 18:21:29 2016
    ———————————————————————-
    BUILD FAILED

    Porque ocorre este erro?

    1. Talvez vc nao tenha adicionado uma “source file” em “add new file to project” para digitar o arquivo “.c” ou pode ser que o programa foi feito para compilar somente com o mplabx

  24. Olá! Comprei o gravador 40 ZIF há um tempo. Funcionava certinho com programas em linguagem assembly, porém quando tentei programar em linguagem C surgiram alguns problemas no circuito. Eu segui exatamente todos os desse tutorial, porém o LED não consegue se manter aceso e fica acendendo e apagando. Ele apaga no momento certo, porém oscila quando deve ficar aceso. Preciso muito começar a programar em C, gostaria da ajuda de vocês. Obrigado.

  25. Link da biblioteca .h?

    1. Bom dia Tadeu,

      Se você utilizar o procedimento do post, já está incluída no compilador.

      Abraço.

      Adilson – Equipe MakerHero

  26. Ola bom dia sou novo com pic o agradei muito de sua explicação, porem preciso fazer um projeto com esse tempo de oscilação do led com regulagem, através de dois potenciômetros um que deixa o led acionado e outro em espera, sera que tem como voces me ajudarem por favor!!!

    1. Cara, vc precisa ter um conversor A/D para poder receber e interpretar o sinal, coisa que o 16F628A não tem. Porem existe muitos truques que fazem com o PIC para medir a tensão, uns usam o próprio comparador com Vref (que da pra configura , veja VRCON no datasheet) [O comparador mede, se a entrada for menor que Vref, aumenta Vref. Fazendo isso até que Vref Seja menor ou igual que a entrada. A Parte boa é que da pra selecionar várias entradas,portanto testa Ent1, testa Ent2 e por ai vai…].

      Também há outros métodos, de uma boa olhada no site do Microchip. (Y)

  27. Boa noite

    Já instalei a versão demo do controlador mais a mesma expirou ai quando tento compilar aparece esse erro alguém poderia me ajudar grato.

    Att Israel

  28. Bem peguei o seu código e descarreguei no PIC! e não funcionou! qual foi o osciliador que vc colocou na interface do MicroBRN ? Eu botei IRCIO e não funciona! por favor me ajuda! creio que só seja o clock ! 🙁

    1. Funcionou ! vlw man! kkkkkkkk era o fio de alimentação do PIC estava mau conectado na protoboard!

  29. Boa tarde !
    Segui os passos conforme escritos porém uso o gravador winpic, pois meu gravador é simples… Faço tudo certo, mas quando chega na ora de gravar aparece a seguinte mensagem:
    Strange line in HEX-file (11): ;PIC16F628A
    Programming…
    Erasing (“bulk” or “chip”) …
    Programming CODE, 0x000000..0x000039
    Verifying 0x000000..0x000039
    Verify Error: 000000: read 000000, wanted 003000
    Verify Error: 000001: read 000000, wanted 00008A
    Verify Error: 000002: read 000000, wanted 002819
    Verify Error: 000004: read 000000, wanted 003022
    More Verify Errors, unable to list all (total=57)
    Programming CONFIG, 0x002000..0x002007
    Verifying 0x002000..0x002007
    Verify Error: 002007: read 000000, wanted 002118
    ERROR: Programming FAILED !

    Será que alguém poderia me ajudar por favor ?

    Att

  30. Caros Amigos – comprei o gravador e fiz tudo como no post.
    – gravei o pic16f628a montei o circuito, porém não fincionou.
    fiz um load do pic e salvei no pc, abri o arquivo e comparei com o que gravei inicialmente, tudo ok, tirando a duvida sobre se tinha gravado o pic ou não.
    testei os arquivos no isis do proteus 8 tudo funcionou perfeitamente.
    porem ainda não consegui fazer o maldito led piscar.

    pesso um help para vcs, pois ja estava disistindo de fazer esse projeto.
    comprei um programador wellon vp280. gravei o maldito arquivo, pensando assim resolver o problema.
    porém continuo na mesma, nada do led piscar…
    esse 16f628a esta me deixando louco.
    pensei que seria fácil pois tenho conhecimento vasto em eletrônica e programo facilmente o arduino!

    pesso um socorro….
    pois já não sei o que fazer.

  31. Boa noite. Fiz conforme o que foi explicado porém na protoboard o led não acende. já testei os jumpers e o led e estão funcionando corretamente. Utilizei vários resistores com voltagens diferentes mas sem sucesso. É possível que o pic tenha queimado por inversão de polaridade ou algo parecido? Teria alguma dica?
    Obrigado.

    1. Bom dia Rafael,

      A gravação do programa foi feita corretamente ? Apareceu algum erro ?

      Abraço

      Adilson – Equipe MakerHero

      1. Filipe,tem como você disponibilizar o arquivo .hex já pronto no 4shared?

        1. Bom dia Junior,

          Tem sim. Coloquei o arquivo neste link:
          http://www.makerhero.com/img/files/download/LED_Blink.X.production.zip

          Abraço!

          Adilson – Equipe MakerHero

          1. Muito obrigado amigo.Se não for pedir muito queria ver se tem o projeto com dois leds piscando.Forte abraço.

  32. Oque fazer se o programa Expirou???
    Grato desde ja!!

  33. O Cristal não se faz necessário?

    1. Boa tarde Rafael,

      No caso, estamos utilizando o oscilador interno do processador.

      Abraço

      Adilson – Equipe MakerHero

      1. Vdd, agora que vi no programa!
        Obrigado.

  34. voce sabe onde posso encontrar a biblioteca do virtual wire para o pic26f628a ?????

    preciso dela urgente para um trabalho

    1. Boa tarde Fernando,

      Infelizmente não temos essa informação.

      Abraço

      Adilson – Equipe MakerHero

  35. boa tarde, estou com um problema, comprei o kit de gravação k150 e tampem uso o microbrn para grava; ao fazer esta programação que você pois no blog , na protoboard não funciona, sera que estou fazendo algo errado na hora de gravar no pic ao alterar o fuse?
    ou sera que o pic esta queimado, sera que vc poderia me ajudar.

    1. Boa tarde Thiago,

      Ele apresenta alguma mensagem de erro na hora de gravar o PIC ?

      Adilson – Equipe MakerHero

  36. Recomenda esse gravador pra quem usa osx, os programas usados sao compativeis?
    Grande Abraco!

    1. Boa tarde Victor,

      Testamos esse gravador somente com Windows 7 e Windows 8, junto com o microBrn. De qualquer forma, existem outros softwares no mercado para gravação de PIC, apenas confirme se são compatíveis com o gravador K150 vendido pela MakerHero.

      Abraço

      Adilson – Equipe MakerHero

  37. Olá, eu segui o tutorial exatamente como esta descrito acima, mas eu ja tinha instalado no meu computador o CCS Demo. Não estou conseguindo compilar pois aparece uma mensagem dizendo que a verão demo expirou. Vocês tem alguma solução pra isso?

    1. Olá Rafael, tente baixar do site downtronica. eles tem uma versão para download juntamente com o vídeo.
      Caso precisar, estude pelo youtube que será mais rápido. Pelo canal MrAppleBr você aprenderá bem mais rápido.
      É muito bom e utilizo desta ferramenta faz anos. Espero que seja útil para você!

      http://www.downtronica.net/2011/05/ccs-c-compiler-478-ultima-versao-crack.html
      https://www.youtube.com/playlist?list=PL4DE4A7AD9EE36E77

  38. E uma mensagem de erro “Invalid option: out=build/default/production”

    1. O meu caso é o mesmo que o seu!
      Tentei rodar outros programas e não estava conseguindo, então resolvi fazer um exemplo básico e também não consegui.

  39. Boa Noite!
    No meu caso deu esse erro, “unable to resolve identifier output_bit” e não e não compilou. É meu primeiro projeto!

  40. boa noite,

    o meu esta apresentando esse erro e nao consigo encontra o arquivo .HEX, a minha vida e quando aparece esse erro mesmo assim ele cria o arquivo?

    nbproject/Makefile-default.mk:99: recipe for target ‘build/default/production/PIC_LED.o’ failed
    make[2]: Leaving directory ‘C:/Users/anaerubens/Desktop/tcc/mplab/PISCA LED.X’
    nbproject/Makefile-default.mk:78: recipe for target ‘.build-conf’ failed
    make[1]: Leaving directory ‘C:/Users/anaerubens/Desktop/tcc/mplab/PISCA LED.X’
    mv: target `LED.X.production.cof’ is not a directory
    make[2]: *** [build/default/production/PIC_LED.o] Error 1
    make[1]: *** [.build-conf] Error 2
    nbproject/Makefile-impl.mk:39: recipe for target ‘.build-impl’ failed
    make: *** [.build-impl] Error 2

    BUILD FAILED (exit value 2, total time: 7s)

  41. Comprei esse gravador, segui todos os passos das instruções e funcionou. Gravei um programa nele e tá rodando tranquilo.

    Só tenho a elogiar!

  42. ola ,tudo bem. Gostaria de saber se quando eu faço um programa para um pic qualquer
    e ele funciona bem,grava tudo certinho no pic. É necessario usar o mplab ou o fixhex para reformular o arquivo hexa?? ,ou se eu nao fizer isso o programa no pic ira rodar ,mas com algum bug???

  43. Prezado Felipe(flop):
    Você poderia postar um link para fazer o download dos arquivos .hex ?
    Só para adiantar o teste do gravador de PIC que comprei contigo e ainda não usei…
    Antecipadamente grato.

    1. Boa noite,

      Não temos esses arquivos disponíveis. De qualquer forma, no tutorial você tem todas as informações para gerar os arquivos.

      Grato.

      Adilson – Equipe MakerHero

  44. Boas!
    Muito obrigado pelos tutoriais, recebi hoje o meu programador e consegui meter a funcionar! Até compilei a pic do programador para ter firmware mais recente. So tenho um problema de dizer qe nao encontrou porta COM mas dspois de ir a port e colocar, ela lá aparece. Mas no reset do programa dá sempre o erro :/

    Exiate mais algum circuito simples e porreiro com pic16f628a ? Comprei 4 e como sou novo nisto nao sei o que inventar ou que tutoriais consigo seguir com essa pic!

    Obrigado!
    Bruno A.

    1. (Já encontrei o circuito do display e dos push buttons! Se conhecer mais, agradeceria)

  45. Ola a todos leitores deste blog.
    Com este este gravador de Gravador de PIC USB 40 ZIF mas até hoje 30-12-2014 nunca gravou nada faz uns 2 anos que comprei. Nada funciona no meu Not .

  46. Maravilha!
    Comprei o de PIC USB 40 ZIF e estou utilizando para programar o PIC16F628A e PIC16F648A. Esta conforme o esperado, logicamente que fiz alguns ajustes mas isso depende do pc e também do S.O. No meu caso estou utilizando Windows 7 Ultimate SP1, CPU Intel i3 32 Bits.
    Obrigado pelos esclarecimento sobre o PIC USB 40 ZIF quando liguei, valeu equipe FELIPEFLOP, vou recomentar para todos os meus alunos.

    1. Bom dia Odair,

      Obrigado, qualquer dúvida, estamos à disposição.

      Abraços.

      Equipe MakerHero

      1. Boa tarde, sim gostei , deu certo segui todos os passos , onde está o arquivo pra simular no Proteus?

        1. Olá, João,

          A qual arquivo você se refere?

          Abraços!
          Diogo – Equipe MakerHero

  47. Parabens! Otimo post, fiz tudo conforme o tutorial e funcionou! já é um começo, vou aprimorar e entender tudo o que foi feito pra fazer as programações originais no CI, abraço!

    1. Obrigado Marlon !

      Abraço.

      Adilson – Equipe MakerHero

  48. Pergunto qual é a linguagem de programação utilizado no artigo Programando PIC 16F628A e mais, existe algum SITE que ensine a programar nesta linguagem???

    1. Boa noite Geronimo,

      A linguagem é C. Não podemos recomendar nenhum site especificamente para programar o PIC, mas na internet existem vários arquivos de exemplo que você pode usar como base para os seus programas.

      Abraço.

      Adilson – Equipe MakerHero

  49. Boa tarde,
    Como consigo o para instalar na minha máquina.

    Valmir

    1. Boa noite Valmir,

      Parece que a mensagem veio incompleta. O que está precisando ?

      Grato.

      Adilson – Equipe MakerHero

  50. Boa Tarde,

    Não estou conseguindo instalar o CCS C. Quando eu entro no MPLAB ele dá uma mensagem de que o compilador não foi instalado. Meu PC é 64 bits.

    1. Tive o mesmo problema, mas solucionei alterando a pasta C:Program Files (x86) para C:Program Files

  51. Fiz todos os procedimentos presente neste post e não consigo selecionar o compilador CCS C Compiler. Em minha tela aparece (NONE FOUND) ao lado do compilador. O que pode ser?

    1. Tive o mesmo problema, mas solucionei alterando a pasta “C:Program Files (x86)” para “C:Program Files” do instalador do CCS.

  52. Caros, eu tenho o MPLAB instalado, e nas linhas a seguir, ele não reconhece os comandos informados.

    output_bit(PINOLED, TRUE); // Liga o Led
    delay_ms(5000); // Aguarda 3 segundos
    output_bit(PINOLED, FALSE); // Desliga o Led
    delay_ms(2000); // Aguarda 2 segundos

    Ele informa que “output_bit” e “delay_ms” não existem, e da erro ao compilar.
    alguem pode dizer o que pode ser?
    Obrigado!

    1. Boa tarde Magnaldo,

      No nosso MPLAB essas linhas também apresentam erro, mas compilam normalmente. Talvez o erro esteja relacionado à algum outro problema durante a compilação.

      Abraço.

      Adilson – Equipe MakerHero