Ir ao conteúdo

Ligar e acender um LED no PIC16F628A


ewpreis

Posts recomendados

Postado

Boa Noite Amigos,

Preciso fazer um programa em assembly onde quando eu pressionar o botão o LED acende e quando soltar o LED apaga. O problema é que eu nao estou entendendo nada, ainda não consegui me encontrar. Ja procurei na internet o programa pronto para ver se eu entendo e configurar de acordo com o que foi passado. Eu não estou entendendo os comandos. Preciso definir a port A0 com saida e a Porta B4 como entrada

Segue o programa que encontrei na net:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PROGRAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;UM BOTAO E UM LED
;ARQUIVOS E DEFINIÇÕES

#INCLUDE <P16F628A.INC>

__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC

;PAGINAÇÃO DE MEMORIA

#DEFINE BANK0 BCF STATUS,RP0
#DEFINE BANK1 BSF STATUS,RP0

;VARIAVEIS

CBLOCK 0X20
ENDC

;ENTRADAS

#DEFINE BOTAO PORTB,4

;SAIDAS

#DEFINE LED PORTA,0

;VETOR RESET

ORG 0X00
GOTO INICIO

;INTERRUPÇÃO

ORG 0X04
RETFIE

;INICIO DO PROGRAMA

INICIO

CLRF PORTA
CLRF PORTB
BANK1
MOVLW B'00000011'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'10000000'
MOVWF OPTION_REG
MOVLW B'00000000'
MOVWF INTCON
BANK0
MOVLW B'00000111'
MOVWF CMCON

;ROTINA PRINCIPAL DO PROGRAMA

MAIN

BTFSC BOTAO
GOTO BOTAO_ON
GOTO BOTAO_OFF

BOTAO_ON
BSF LED
GOTO MAIN

BOTAO_OFF
BCF LED
GOTO MAIN


END

Queria poder entender o que cada instrução dessa faz e como posso fazer a programação que preciso

Obrigado

Postado


;...
#DEFINE BOTAO PORTB,4
#DEFINE LED PORTA,0
;...
INICIO
CLRF PORTA ;LIMPA OS REGISTRADORES DE PORT'A' E PORT'B'
CLRF PORTB
BANK1 ;ACESSA OS BANCO DE MEMÓRIA 1
MOVLW [B][COLOR="red"]B'11111110'[/COLOR][/B] ;TODOS OS VALORES DEVEM SER INSERIDOS PRIMEIRAMENTE
;NO ACUMULADOR W E DEPOIS PASSADO PARA O RESPECTIVO REGISTRADOS
MOVWF[B][COLOR="Red"] TRISA[/COLOR][/B] ;TRISA CONFIGURA OS PINOS QUE DEVEM SER ENTRADA OU SAÍDA
;NESTE CASO APENAS O BIT 0 (PORTA,0) SERÁ SAÍDA, QUANDO O BIT
;FOR =1 SERÁ UM PINO DE ENTRADA E QUANDO =0 SERÁ SAÍDA
MOVLW [B][COLOR="red"]B'00010000'[/COLOR][/B] ;O MESMO ACONTECE AQUI
MOVWF [B][COLOR="red"]TRISB[/COLOR][/B]
MOVLW B'00000000' ;TODAS AS DEMAIS CONFIGURAÇÕES ACONTECEM DO MESMO JEITO
;PARA SABER O QUE CADA COISA FAZ, CONSULTE O DATASHEET E VEJA
;AS DESCRIÇÕES DO FABRICANTE
MOVWF OPTION_REG
MOVLW B'00000000'
MOVWF INTCON
BANK0
MOVLW B'00000111'
MOVWF CMCON

;ROTINA PRINCIPAL DO PROGRAMA

MAIN
BTFSC BOTAO ;TESTA PARA VER SE O BOTÃO MANDA NÍVEL ZERO
;CALL LIGA_LED ;SE MANDAR NÍVEL LÓGICO 0(0V), VOCÊ PODE CHAMAR UMA SUBROTINA, OU,
BSF LED ;SE NÃO MANDAR NÍVEL LÓGICO 0(0V), LIGA O LED (BOTÃO PRESSIONADO)
BCF LED ;SE MANDAR NÍVEL LÓGICO 1(5V), DESLIGA O LED
GOTO MAIN ;LOOP INFINITO TESTANDO A CHAVE

;LIGA_LED
; BSF LED ;LIGA O LED
; RETURN ;RETORNA DA SUBROTINA

END. ;FIM DO PROGRAMA

AQUI tenho postado mais dois exemplos de códigos, simples. (16F84/12F629)

Postado

Na hora de compilar o programa me apareceu os seguintes erros:

Release build of project `C:\Users\Ewerton Reis\Downloads\Pisca LED 16F628A.disposable_mcp' started.

Language tool versions: MPASMWIN.exe v5.50, mplink.exe v4.48, mplib.exe v4.48

Sun Jul 07 23:54:34 2013

----------------------------------------------------------------------

Clean: Deleting intermediary and output files.

Clean: Deleted file "C:\Users\Ewerton Reis\Downloads\Pisca LED 16F628A.mcs".

Clean: Done.

Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F628A "Pisca LED 16F628A.asm" /l"Pisca LED 16F628A.lst" /e"Pisca LED 16F628A.err"

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 6 : Symbol not previously defined (PORTA)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 7 : Symbol not previously defined (PORTB)

Warning[207] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 8 : Found label after column 1. (BANK1)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 11 : Symbol not previously defined (TRISA)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 15 : Symbol not previously defined (TRISB)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 19 : Symbol not previously defined (OPTION_REG)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 21 : Symbol not previously defined (INTCON)

Warning[207] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 22 : Found label after column 1. (BANK0)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 24 : Symbol not previously defined (CMCON)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 29 : Symbol not previously defined (PORTB)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 31 : Symbol not previously defined (PORTA)

Error[113] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 32 : Symbol not previously defined (PORTA)

Error[129] C:\USERS\EWERTON REIS\DOWNLOADS\PISCA LED 16F628A.ASM 41 : Expected (END)

Halting build on first failure as requested.

----------------------------------------------------------------------

Release build of project `C:\Users\Ewerton Reis\Downloads\Pisca LED 16F628A.disposable_mcp' failed.

Language tool versions: MPASMWIN.exe v5.50, mplink.exe v4.48, mplib.exe v4.48

Sun Jul 07 23:54:36 2013

----------------------------------------------------------------------

BUILD FAILED

Postado

ewpreis, meu tutorial talvez possa ajudá-lo:

http://forum.clubedohardware.com.br/tutorial-pic-programacao/919942

No código que você postou, foi definido que o botão está ligado no pino RB4, mas, na configuração dos pinos do PORTB, feita no registrador TRISB, esse pino foi configurado como saída (valor 0 escrito no bit 4 do registrador TRISB).

O LED está ligado no pino RA0, mas, esse pino foi configurado como entrada no registrador TRISA (valor 1 do bit 0).

É necessário uma rotina de de-bouncing para o botão.

Nos bits de configuração está definido que será usado cristal, mas, você pode usar o oscilador interno.

Nesse tópico, postei um programa para comandar dois LEDs com um botão:

http://forum.clubedohardware.com.br/ajuda-algoritimo-relativamente/1136485

Postado

Espero que não tenhas tentado copiar e colar o exemplo no mplab e então compilou.

PS: Multer, muito bom seus materiais.

Postado
ewpreis, meu tutorial talvez possa ajudá-lo:

http://forum.clubedohardware.com.br/tutorial-pic-programacao/919942

No código que você postou, foi definido que o botão está ligado no pino RB4, mas, na configuração dos pinos do PORTB, feita no registrador TRISB, esse pino foi configurado como saída (valor 0 escrito no bit 4 do registrador TRISB).

O LED está ligado no pino RA0, mas, esse pino foi configurado como entrada no registrador TRISA (valor 1 do bit 0).

É necessário uma rotina de de-bouncing para o botão.

Nos bits de configuração está definido que será usado cristal, mas, você pode usar o oscilador interno.

Nesse tópico, postei um programa para comandar dois LEDs com um botão:

http://forum.clubedohardware.com.br/ajuda-algoritimo-relativamente/1136485

O seu material é muito bom, bem explicativo e fácil de entender. Fiz a programação de novo e simulei no Proteus, quando inicio o simulador o LED fica piscando direto e quando pressiono o botão o LED fica apagado e quando solto volta a piscar. Bom ele esta quase do jeito que eu quero, o problema é que ele está fazendo a operação inversa e o fato do led piscar creio que seja por causa do oscilador. Eu estou usando um cristal, pois o projeto que o professor pediu inclui um cristal. Segue abaixo o programa:


;*********************************************************
; PROGRAMA: Botão Lig/Des LED
; VERSÃO 1.0
; DESENVOLVIDO POR: Ewerton Reis
; DATA DE CONCLUSÃO:08/07/2013
;*********************************************************

;*********************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO padrão MICROCHIP PARA O PIC16F628A
;*********************************************************

;*********************************************************
; BITS DE CONFIGURAÇÃO
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
;*********************************************************

;*********************************************************
;PAGINAÇÃO DE MEMORIA
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANCO 0 DE MEMORIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANCO 1 DE MEMORIA
;*********************************************************

;*********************************************************
;ENTRADAS
#DEFINE BOTAO PORTB,4
;*********************************************************
;SAIDAS
#DEFINE LED PORTA,0
;*********************************************************

;*********************************************************
;INICIO DO PROGRAMA
INICIO
CLRF PORTA ;LIMPA OS REGISTRADORES DE PORT'A' E PORT'B'
CLRF PORTB

BANK1 ;ACESSA OS BANCO DE MEMÓRIA 1
MOVLW B'00000000' ;TODOS OS VALORES DEVEM SER INSERIDOS PRIMEIRAMENTE
;NO ACUMULADOR W E DEPOIS PASSADO PARA O RESPECTIVO REGISTRADOS
MOVWF TRISA ;TRISA CONFIGURA OS PINOS QUE DEVEM SER ENTRADA OU SAÍDA
;NESTE CASO APENAS O BIT 0 (PORTA,0) SERÁ SAÍDA, QUANDO O BIT
;FOR =1 SERÁ UM PINO DE ENTRADA E QUANDO =0 SERÁ SAÍDA
MOVLW B'00010000' ;O MESMO ACONTECE AQUI
MOVWF TRISB
MOVLW B'00001000'

MOVWF OPTION_REG
MOVLW B'00000000'
MOVWF INTCON
BANK0
MOVLW B'00000111'
MOVWF CMCON
;*********************************************************

;*********************************************************
;ROTINA PRINCIPAL DO PROGRAMA

MAIN
BTFSC BOTAO ;TESTA PARA VER SE O BOTÃO MANDA NÍVEL ZERO
;CALL LIGA_LED ;SE MANDAR NÍVEL LÓGICO 0(0V), VOCÊ PODE CHAMAR UMA SUBROTINA, OU,
BSF LED ;SE NÃO MANDAR NÍVEL LÓGICO 0(0V), LIGA O LED (BOTÃO PRESSIONADO)
BCF LED ;SE MANDAR NÍVEL LÓGICO 1(5V), DESLIGA O LED
GOTO MAIN ;LOOP INFINITO TESTANDO A CHAVE

;LIGA_LED
;BSF LED ;LIGA O LED
;RETURN ;RETORNA DA SUBROTINA

END ;FIM DO PROGRAMA
;*********************************************************


Postado

Poste uma imagem do circuito.

Creio que você tenha ligado o botão entre o pino e o VSS e um resistor entre o pino e o VCC, que é o convencional. Com a instrução BTFSC a próxima linha é pulada se o nível do pino for baixo. O LED está piscando porque enquando o botão está solto há nível alto no pino e, então, a próxima linha, onde está a instrução BSF, é executada e, em seguida, a instrução BCF.

Isso é resolvido com uma instrução GOTO após a instrução que testa o pino, desviando o programa e evitando que as duas instruções sejam executadas.

Mas repare que se você ligou o botão no VSS e quer que o LED seja aceso quando o botão é pressionado, usando a instrução BTFSC, você deve inverter as posições das instruções BSF e BCF, ou usar a instrução BTFSS.

O MCLR está ativado e, portando, você precisa ligar um resistor, que pode ser de 10 k, entre o pino 4 e o VCC.

Postado

Colega me perdoe pelo erro que postei anteriormente para você, quanto tentei setar o bit responsável pelo RB4, acabei setanto um bit do option_reg por engano (PSA). Já arrumei na postagem, corrija isso!

Postado

Complementando o que escrevi, o LED só pisca porque a simulação não está sendo feita em tempo real, porque na realidade, o LED piscaria tão rápido que daria a impressão de que está aceso direto, embora com menos brilho.

Postado

Obrigado [Daniel] e Mulder_Fox fiz as alterações que vocês me disseram e com os materiais que passaram consegui entender um pouco mais de programação de PIC. Acabei de editar o programa e simulei no Proteus e o resultado foi 100%. Muito obrigado mesmo

O programa final ficou assim:


;*********************************************************
; VERSÃO 1.0
; DESENVOLVIDO POR: EWERTON REIS
; DATA DE CONCLUSÃO:08/07/2013
;*********************************************************

;*********************************************************
;*********************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO padrão MICROCHIP PARA O PIC16F628A
;*********************************************************
; BITS DE CONFIGURAÇÃO
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
;*********************************************************
;*********************************************************
;PAGINAÇÃO DE MEMORIA
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANCO 0 DE MEMORIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANCO 1 DE MEMORIA
;*********************************************************

;*********************************************************
;ENTRADAS
#DEFINE BOTAO PORTB,4
;*********************************************************
;SAIDAS
#DEFINE LED PORTA,0
;*********************************************************

;*********************************************************
;INICIO DO PROGRAMA
INICIO
CLRF PORTA
CLRF PORTB

BANK1
MOVLW B'00000000'
MOVWF TRISA
MOVLW B'00010000'
MOVWF TRISB
MOVLW B'00001000'
MOVWF OPTION_REG
MOVLW B'00000000'
MOVWF INTCON

BANK0
MOVLW B'00000111'
MOVWF CMCON
;****************************************************************************

;*********************************************************
;ROTINA PRINCIPAL DO PROGRAMA

MAIN
BTFSC BOTAO
GOTO BOTAO_ON
GOTO BOTAO_OFF

BOTAO_ON
BCF LED
GOTO MAIN

BOTAO_OFF
BSF LED
GOTO MAIN

END
;*********************************************************

Me surgiu uma dúvida, caso eu queria trocar as entradas e saidas como por ex colocar:

1ª Opção:

Porta A0 saída

Porta B0 entrada

2ª Opção:

Porta A2 saída

Porta B2 entrada

3ª Opção:

Porta B6 saída

Porta A1 entrada

Para eu fazer isso eu posso trocar só os valores de TRISA e TRISB?

Postado

Sim, basta alterar o registrador TRISA para o PORTA e o TRISB para o PORTB.

O pino RA5 só pode ser usado como entrada.

O pino RA4 quando usado como saída é do tipo "open drain"

Postado
Sim, basta alterar o registrador TRISA para o PORTA e o TRISB para o PORTB.

O pino RA5 só pode ser usado como entrada.

O pino RA4 quando usado como saída é do tipo "open drain"

OK, super entendido. Muito obrigado, me ajudou muito!!!

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...