tecla

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

tecla

Mensagempor likio » 16 Out 2011 23:43

Bom dia Pessoal, fiz um programa para ler uma tecla, que ao ser pressionada, fará com que um led fique piscando na PORTB do PIC16F628A, que está com uma configuração em pull up. Mas o programa não tem funcionado da forma que foi programado, automaticamente ele entra na rotina de piscar o led. Será que alguem pode me dizer por que isto está acontecendo. Estou trabalhando com a placa Mclab da Mosaico, junto com seu programador. Segue o trecho do programa que está com problemas:

tempo

movlw D'7'
movwf A_t
movlw D'47'
movwf B_t
movlw D'3'
movwf C_t
nop
decfsz C_t
goto $-2
decfsz B_t
goto $-6
decfsz A_t
goto $-8
return

trata_tecla

movlw D'10'
movwf debouce
decfsz debouce
goto $-1
nop
btfss PORTA,1
goto led_on
return

tecla

btfss PORTA,1
call trata_tecla
goto tecla
likio
Bit
 
Mensagens: 9
Registrado em: 06 Fev 2007 21:18

Mensagempor fabim » 17 Out 2011 07:17

BHRÍMÃ, ai onte tu testa a tecra, e da um goto antes do return.
Veja que houve um CALL, e tu desviou em um goto led-on.
La dentro do led-on, voce colocou o return ? Ou deixou a pilha ficar sendo sobre escrita ?
Sobre o teste que ta fazendo, tu disse que que o programa ja entra tumaticamente dentro do led on.

Questões.
Tu configurou o pino do bt como entrada ?
Tu confirmou se não existe nenhuma outra função multiplexada com esse pino, e caso exista, tu desligou essa função e deixou o pino só como IO ?
La em baixo no loop, eu costumo fazer isso aqui, pra ter um ciclo sem nada antes de chamadas, ou reentrancias.

label tecla:
btfss PORTA,1; // o pino foi precionado ?
call trata_tecla;//Sim, ele foi a zero.
nop;//não, ainda é um fica em um loop
goto tecla;
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

tecla

Mensagempor likio » 17 Out 2011 18:31

Boa noite Fabio, acho que não fui muito claro no programa que passei, pois coloquei apenas parte do código. Mas vamos aos fatos, ja fiz esta programação em outras ocasiões e sempre funcionou, exceto nesta ocasião. mesmo que eu substitua os call por goto acontece o mesmo efeito, então o problema de sobrescrever a pilha não é o motivo. já configurei o PORTA, para entrada em todos os pinos, além disso não estou usando nenhuma outra configuração para o PIC em questão. Este programa ja utlizei para um pic16f84A, e apenas copiei para o novo pic, e não funcionou.
likio
Bit
 
Mensagens: 9
Registrado em: 06 Fev 2007 21:18

Re: tecla

Mensagempor EvandrPic » 17 Out 2011 20:22

likio escreveu:Boa noite Fabio, acho que não fui muito claro no programa que passei, pois coloquei apenas parte do código. Mas vamos aos fatos, ja fiz esta programação em outras ocasiões e sempre funcionou, exceto nesta ocasião. mesmo que eu substitua os call por goto acontece o mesmo efeito, então o problema de sobrescrever a pilha não é o motivo. já configurei o PORTA, para entrada em todos os pinos, além disso não estou usando nenhuma outra configuração para o PIC em questão. Este programa ja utlizei para um pic16f84A, e apenas copiei para o novo pic, e não funcionou.



As vezes fica difícil ajudar se você coloca as informações em doses homeopáticas, mas vamos lá...
Se você diz que apenas copiou para o novo PIC então você não fez as alterações necessárias para essa migração ne?
Se funciona no PIC 16F84A e não funciona no 16F628A, pode ser alguma configuração que você deveria alterar para essa migração e não alterou.
Você colocou o include do 16F628A né?
Em qual pino estão a tecla e o LED?
Porque você não coloca o programa inteiro? Se for só uma tecla e 1 LED, não deve ser grande.



Imagem

- A memória RAM do 16F84 começa na posição 0Ch, no 16F628 começa em 20h.
- No 16f628 os comparadores vem habilitados, verificar se colocou CMCON 0x07 para entrada digitais.
- O 16F628A dispõe de 4 bancos de memória RAM, o 16F84 apenas 2.

http://www.microcontroladorespic.com/tu ... 6f628.html
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor EvandrPic » 17 Out 2011 20:37

Convertendo os Programas p/ a placa McLab1
Para que os programas desenvolvidos para o PIC16F84 possam ser utilizados na família PIC16F62x na placa McLab 1 é importante observar os seguintes pontos:
�� Gravar o microcontrolador com a opção Brown-Out Reset (bor) ligada.
�� Gravar o microcontrolador com a opção Power-on Reset (por) ligada.
�� Gravar o microcontrolador com a opção Watchdog Timer (WDT) desligada.
�� Nunca gravar o microcontrolador com a opção Low Voltage Programer (LVP) ligada, pois o pino de I/O RA5/MCLR será gravado com a opção de MCLR_ON. (tome cuidado com esta opção).
Utilize a seguinte linha de comando para o config.
_CONFIG_BODEN_ON &_CP_OFF &_PWRTE_ON &_WDT_OFF &_LVP_OFF &_MCLRE_ON & _XT _ OSC.

http://www.mosaico.com.br/Midias/Docume ... McLab1.pdf
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

tecla

Mensagempor likio » 19 Out 2011 19:32

Boa noite pessoal

Segue o programa completo que foi desenvolvido para realizar um pisca pisca com um led utilizando a placa MCLAB1 da Mosaico, após ser pressionada uma tecla. E ao pressionar outra tecla o led desliga.

list p=16f628A
#include <P16f628A.inc>
__CONFIG _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
;
;********************************************************************************************
;* Definição da Memória Ram *
;********************************************************************************************
;
A_t equ H'20'
B_t equ H'21'
C_t equ H'22'
D_t equ H'23'
debouce equ H'24'
; equ 25
; equ 26
; equ 27
; equ 28
; equ 29
; equ 2A
; equ 2B
; equ 2C
; equ 2D
; equ 2E
; equ 2F
; equ 30
;
;********************************************************************************************
;* Início do Programa *
;********************************************************************************************
;
org 0 ; define que o programa irá começar no endereço 0
nop ; função sem operação
nop
nop
nop
nop
;********************************************************************************************
;* Parametrização dos Registradores *
;********************************************************************************************
start
clrf PORTA ; inicializa a porta A
clrf PORTB ; inicializa a porta C
bsf STATUS,RP0 ; seleciona o banco 1
movlw B'11111111' ; w=256
movwf OPTION_REG ; Pull-ups desabilitado, Prescaler 1:256
movlw B'00000000' ; w=0
movwf INTCON ; desabilita todas as interrupções
movlw B'00000000'
movwf TRISB ;
movlw B'11111111'
movwf TRISA
bcf STATUS,RP0
goto teclas
;********************************************************************************************
;* Programa Principal *
;********************************************************************************************
led_on
nop
bsf PORTB,1
nop
goto tempo
led_off
nop
bcf PORTB,1
nop
goto tempo
;********************************************************************************************
;* Rotina de Tempo *
;********************************************************************************************
tempo
movlw D'7'
movwf A_t
movlw D'47'
movwf B_t
movlw D'3'
movwf C_t
nop
decfsz C_t
goto $-2
decfsz B_t
goto $-6
decfsz A_t
goto $-8
return

;********************************************************************************************
;* Leitura das teclas *
;********************************************************************************************
trata_tecla1
movlw D'10'
movwf debouce
decfsz debouce
goto $-1
nop
btfsc PORTA,1
return
goto led_on
trata_tecla2
movlw D'10'
movwf debouce
decfsz debouce
goto $-1
nop
btfss PORTA,2
goto led_off
teclas
btfss PORTA,1
goto trata_tecla1
btfss PORTA,2
goto trata_tecla2
goto teclas
tempo1
movlw D'4'
movwf A_t
movlw D'10'
movwf B_t
movlw D'25'
movwf C_t
decfsz C_t
goto $-1
decfsz B_t
goto $-5
decfsz A_t
goto $-9
return


end
likio
Bit
 
Mensagens: 9
Registrado em: 06 Fev 2007 21:18

Mensagempor EvandrPic » 19 Out 2011 23:00

likio, você é novo no fórum então aquí vão algumas dicas:
- Coloque o código com a opção código... facilita a leitura, indentação... Isso fará com que mais pessoas se sintam motivadas a ler o teu código e tentar ajudá-lo.
- Procure usar letras maiúsculas nos Labels e nomes de variáveis. Facilita a leitura do código.
- Procure comentar o seu código. Se já é difícil pra você entender o que você queria fazer em determinada linha ou trecho do código, imagina pra quem está lendo o teu código. Tudo bem que esse é um programa simples mas se acostume mesmo no simples.
- Você está pedindo ajuda, então nada mais natural que você seja o mais claro possível quanto ao que você fez e quanto as suas dúvidas.
- Não ignore respostas às suas dúvidas. Eu respondi e você não fez nenhuma referência as dicas que eu te dei. Não disse se tinha feito ou não o que sugeri. Fica parecendo que você não leu ou simplesmente ignorou. Lembre-se que você tem um problema e está pedindo ajuda, então seja atencioso com os que estão te ajudando.
- Usuários que postam dúvidas e somem acabam desestimulando os outros usuários a ajudá-los. Não é o seu caso mas procure frequentar o tópico onde você postou sua dúvida algumas vezes ao dia. Tem usuários que postam uma dúvida e voltam 20 dias depois pra ver o que responderam. Se ele não foi claro na primeira postagem, provavelmente haverá um monte de perguntas sobre a dúvida dele e é sempre bom que as esclareça rapidamente, afinal o problema é dele (a pressa também).


Segue o código de uma forma mais legível.

Código: Selecionar todos
list p=16f628A
#include <P16f628A.inc>
__CONFIG _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
;
;********************************************************************************************
;* Definição da Memória Ram                                                                 *
;********************************************************************************************
;
A_t             equ H'20'
B_t             equ H'21'
C_t             equ H'22'
D_t             equ H'23'
DEBOUNCE        equ H'24'
;
;********************************************************************************************
;* Início do Programa                                                                       *
;********************************************************************************************
;
org 0                                   ; define que o programa irá começar no endereço 0
nop                                     ; função sem operação
nop
nop
nop
nop
;********************************************************************************************
;* Parametrização dos Registradores                                                         *
;********************************************************************************************

INÍCIO
    clrf       PORTA                     ; inicializa a porta A
    clrf       PORTB                     ; inicializa a porta C
    bsf        STATUS,RP0                ; seleciona o banco 1
    movlw      B'11111111'               ; w=256
    movwf      OPTION_REG                ; Pull-ups desabilitado, Prescaler 1:256
    movlw      B'00000000'               ; w=0
    movwf      INTCON                    ; desabilita todas as interrupções
    movlw      B'00000000'
    movwf      TRISB ;
    movlw      B'11111111'
    movwf      TRISA
    bcf        STATUS,RP0
    goto       TECLAS

;********************************************************************************************
;* Programa Principal                                                                       *
;********************************************************************************************

LED_ON
    nop
    bsf        PORTB,1
    nop
    goto       TEMPO

LED_OFF
    nop
    bcf        PORTB,1
    nop
    goto       TEMPO
 
;********************************************************************************************
;* Rotina de Tempo                                                                          *
;********************************************************************************************

TEMPO
    movlw      D'7'
    movwf      A_t
    movlw      D'47'
    movwf      B_t
    movlw      D'3'
    movwf      C_t
    nop
    decfsz     C_t
    goto       $-2
    decfsz     B_t
    goto       $-6
    decfsz     A_t
    goto       $-8
    return

;********************************************************************************************
;* Leitura das teclas                                                                       *
;********************************************************************************************

TRATA_TECLA 1
    movlw      D'10'
    movwf      DEBOUNCE
    decfsz     DEBOUNCE
    goto       $-1
    nop
    btfsc      PORTA,1
    return
    goto       LED_ON

TRATA_TECLA 2
    movlw      D'10'
    movwf      DEBOUNCE
    decfsz     DEBOUNCE
    goto       $-1
    nop
    btfss      PORTA,2
    goto       LED_OFF

TECLAS
    btfss      PORTA,1
    goto       TRATA_TECLA 1
    btfss      PORTA,2
    goto       TRATA_TECLA 2
    goto       TECLAS

TEMPO 1
    movlw      D'4'
    movwf      A_t
    movlw      D'10'
    movwf      B_t
    movlw      D'25'
    movwf      C_t
    decfsz     C_t
    goto       $-1
    decfsz     B_t
    goto       $-5
    decfsz     A_t
    goto       $-9
    return


end
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor rona123 » 20 Out 2011 16:47

Likio

O colega Evandropic está coberto de razão.

A coisa começa a complicar quando se vai para processadores mais avançados e se usa compiladores C. Acho fundamental informar as ferramentas e revisões aplicadas. Muitas vezes se compila um codigo e aparecem avisos ou erros em versões diferentes pelas mudanças nas bibliotecas.

Em muitos códigos existem sutilezas, que se forem informadas, ajudam ao próprio programador a lembrar do que ele fez e se for o caso de manutenção de firmware, ajuda os colegas a ganhar tempo na análise e entendimento do código. Acho que as informações incluidas tem que ter curtas e objetivas e a aparencia estimula o trabalho - são detalhes que ajudam ...

A questão respostas e interação entre usuários é meio de fazer com que atividade do fórum seja produtiva e valorosa para todos. Existem muitos colegas que valorizam o forum e contam com respeito e admiração.

Abraço
rona123
rona123
Byte
 
Mensagens: 214
Registrado em: 07 Mai 2009 20:01

Mensagempor likio » 20 Out 2011 17:52

Boa noite pessoal

Desculpe por não ter lhes respondido antes, é que so estou tendo tempo a noite ou durante o dia por volta das 6 horas até umas 6:30 quando é possível, quantas as alterações acabei fazendo. Mas não resultou no problema que estava tendo.
Ainda não consegui resolver o problema.
O programa ainda continua não funcionando indo diretamente para a função de pisca sem ser pressioando o botão.
likio
Bit
 
Mensagens: 9
Registrado em: 06 Fev 2007 21:18

Re: tecla

Mensagempor chipselect » 21 Out 2011 16:28

EvandrPic escreveu:- No 16f628 os comparadores vem habilitados, verificar se colocou CMCON 0x07 para entrada digitais.


Isso é muito importante e passei por isso no primeiro projeto que fiz com o 628 depois do 16f84 a alguns anos.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor likio » 21 Out 2011 20:10

Boa noite, pessoal, vou fazer os testes e amanha coloco os resultados.
likio
Bit
 
Mensagens: 9
Registrado em: 06 Fev 2007 21:18

Mensagempor likio » 22 Out 2011 12:52

Boa tarde pessoal

Acabei de realizar os testes, e tudo funcionou corretamente. Gostaria de lhes agradecer a respeito da informação do CMCON.
likio
Bit
 
Mensagens: 9
Registrado em: 06 Fev 2007 21:18


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x