Ir ao conteúdo

Problemas com o portA no PIC16F628A


LEOPUENA

Posts recomendados

Postado

olá a todos, estou com um grande problema já há algum tempo.

Tenho programado varios PICs e todos funcionam perfeitamente, mas quando se trata do 16F628A só funciona o portB.

os dados no portA têm um valor fixo e nunca variam, estando ele definido como entrada ou saida.

tenho a cereza qie os programas estão a ser bem feitos - pelo menos a rotina principal - não sei se falta alguma configuração.

agradecia muito se alguem me esclarecesse isso.

Postado
os dados no portA têm um valor fixo e nunca variam, estando ele definido como entrada ou saida

Não se esqueça que o portA não tem todos pinos como saida (16F628)!

RA5 só pode ser entrada.

Postado
os dados no portA têm um valor fixo e nunca variam, estando ele definido como entrada ou saida.
Não se esqueça que o portA não tem todos pinos como saida (16F628)! RA5 só pode ser entrada.

Digo também que o portA tem seus pinos multiplexados com os comparadores.

E quando a alimentação é ligada ou mesmo depois de um reset, os comparadores são conectados ao portA.

Portanto antes de configurar os TRIS, deve desativar os comparadores, com isso o portA pode ser usado como i/o digital (respeitando o que o amigo vtrx também citou).

O registrador responsavel pelos comparadores é o CMCON. Em C do mikroC, fica assim:

CMCON |= 0x07;

Assembly:


CLRF PORTA ;Limpa o portA

MOVLW 0x07 ;7 desabilita os comparadores (ver datasheet)
MOVWF CMCON ;Escreve o Valor 7 no reg. CMCON
BCF STATUS, RP1
BSF STATUS, RP0
MOVLW 0x10 ;PORTA RA5 = entrada, o restante saidas.
MOVWF TRISA ;Seta o trisA com o valor 16 dec ou 10hex.

Postado

Eu acho q o problema não tem a ver com o RA5, talves com o cmcon. Mas para melhor esclarecer a minha duvida vou postar um trecho de um dos programas, é uma fechadura codificada onde usaria o portB para o teclado e o portA para o motor, testei com leds e nada:


LIST P=16F628A ;INFORMA AO COMPILADOR O TIPO DE PIC USADO
RADIX DEC ;TODO NÚMERO NAO ESPECIFICADO SERA DECIMAL
#INCLUDE<P16F628A.INC> ; INCLUI A BIBLIOTECA PADRÃO DO PIC USADA
__CONFIG _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_CLKOUT

;-------------------- difiniçao de variaveis e constantes ------------------------------
CBLOCK 20H
CODIGO1
ATRASO
TEMPO
ENDC
;------------------------ MACRO PARA MUDANÇA DE BANCO ----------------------------------
BANCO0 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANCO1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANCO3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM

;------------------------------------------------------------------------------------
ORG 0H
GOTO INICIO ; VAI PARA O INICIO DO PROGRAMA
;------------------------------------------------------------------------------------
ORG 4H
RETFIE ; AS INTERRUPÇOES NÃO SERÃO UTILIZADAS
;------------------------------------------------------------------------------------

INICIO
BANCO0
CLRF PORTA
CLRF PORTB

MOVLW 7
MOVWF CMCON ; DEFINIMOS TODOS OS PINOS DO PORTA COMO DIGITAIS.

BANCO1
BSF PCON,3 ; OSCILADOR A 4MHZ
MOVLW B'00111111'
MOVWF TRISB
CLRF TRISA
MOVLW B'10000111'
MOVWF OPTION_REG

BANCO0
CLRF INTCON

..............
..............
depois vem a rotina principal.

Postado

Você ligou um resistor de 10K entre o pino 4 (RA5/MCLR/VPP) e o VDD, já que o Master Clear Reset está ativado? (_MCLRE_ON)

O RA6 está configurado para fornecer a saída do sinal de clock. (_INTOSC_OSC_CLKOUT) e desta forma não está disponível como pino de I/O.

Postado
você precisa desligar os comparadores ,o ra5 nao pode ser usado como saida ,e os pinos do oscilador pode ,porém tem q ativar os resistores de pull up

Eu acho q é por aí, alguem já me falou nos pull up, só não sei se são pull up externos (resistores de 10k) ou pull up interno no PIC. seria bom se pudesse postar um trecho de um programa para fzr essa cofuguração.

Você ligou um resistor de 10K entre o pino 4 (RA5/MCLR/VPP) e o VDD, já que o Master Clear Reset está ativado? (_MCLRE_ON)

O RA6 está configurado para fornecer a saída do sinal de clock. (_INTOSC_OSC_CLKOUT) e desta forma não está disponível como pino de I/O.

como configurar o RA6 para I/O?

Postado

Oi pessoal, estive por em pratica as dicas que deram, criei um simples programa que faz os led piscarem e testei no proteus (versão 7.1 SP4), e nada, tudo na mesma. O RA6 e 7 ficam senpre a 1 os restantes fiam a 0. coloquei RA4 e 5 como entrada. Mas o portb funciona na perfeição.

Já deu pra ver que não era erro de fabrica porque até no proteus o problema persiste. Vou postar o codigo fonte pra facilitar.

LIST P=16F628A ;INFORMA AO COMPILADOR O TIPO DE PIC USADO

RADIX DEC ;TODO NÚMERO NAO ESPECIFICADO SERA DECIMAL

#INCLUDE<P16F628A.INC> ; INCLUI A BIBLIOTECA PADRÃO DO PIC USADA

__CONFIG _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTOSC_OSC_NOCLKOUT

;-------------------- difiniçao de variaveis e constantes ------------------------------

CBLOCK 20H

ATRASO ;VARIAVEL PARA CRIAÇAO DE DELAY

VEZES ;VARIAVEL PARA CRIAÇAO DE DELAY

DADOS ;VARIAVEL PARA CRIAÇAO DE DELAY

ENDC

#DEFINE LED1 PORTB,0 ;O LED SERÁ CONTROLADO PEL0 PINO RB0

#DEFINE LED2 PORTB,1 ;O LED SERÁ CONTROLADO PELO PINO RB1

;------------------------ MACRO PARA MUDANÇA DE BANCO ----------------------------------

BANCO0 MACRO

BCF STATUS,RP0

BSF STATUS,RP1

ENDM

BANCO1 MACRO

BSF STATUS,RP0

BCF STATUS,RP1

ENDM

BANCO2 MACRO

BCF STATUS,RP0

BSF STATUS,RP1

ENDM

BANCO3 MACRO

BSF STATUS,RP0

BSF STATUS,RP1

ENDM

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

ORG 0H

GOTO INICIO ; VAI PARA O INICIO DO PROGRAMA

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

ORG 4H

RETFIE ; AS INTERRUPÇOES NÃO SERÃO UTILIZADAS

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

INICIO

BANCO0

CLRF PORTA

CLRF PORTB

MOVLW d'7'

MOVWF CMCON ; DEFINIMOS TODOS OS PINOS DO PORTA COMO DIGITAIS.

BANCO1

BSF PCON,3 ; OSCILADOR A 4MHZ

CLRF TRISB ; TODOS OS PINOS DO PORT B SERÃ SAIDA

MOVLW 0X30

MOVWF TRISA ; RA4 e RA5 serão entrada

movlw b'10000111'

movwf option_reg

BANCO0

CLRF INTCON

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

MAIN

MOVLW B'11111111'

MOVWF PORTB

MOVLW B'11111111

MOVWF PORTA

CALL PAUSA

CLRF PORTB

CLRF PORTA

CALL PAUSA

GOTO MAIN

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

PAUSA

MOVLW D'100'

MOVWF ATRASO

PAUSA1

CALL DELAY

DECFSZ ATRASO

GOTO PAUSA1

RETURN

;---------------------------------DELAY de 10ms------------------------------

DELAY

movlw d'217'

movwf Tmr0

bcf intcon,T0if

btfss intcon,t0if

goto $-1

return

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

end

Postado

CLRF INTCON 

INTCON é no banco 1.

Experimente começar com;

__CONFIG  _BODEN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT ;SEM CRISTAL,SEM MCLRE(RA5)

Para mudança de banco,voce pode usar a configuração clássica,que acho mais 'limpa';

#DEFINE	BANK0	BCF STATUS,RP0	;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MEMÓRIA

Então;

	BANK1			;ALTERA PARA O BANCO 1
CLRF OPTION_REG ;DESABILITA PULLUPS NO PORT-B
CLRF INTCON
...
BANK0

Experimente um NOP aqui;

MOVLW B'11111111'
MOVWF PORTB
NOP
MOVLW B'11111111
MOVWF PORTA

Postado
ola a todos nao sei se ajuda ja resolvi esse problema em c da ccs se ajudar era so dezabilitar os comparadores conparator nc,nc,nc nao me lembro mas mas talves possa ajudar

oi Caroline, não entendo muito de linguagem C mas tenho o CCS, será que podias postar o codigo pra isso? Será que tem a ver com o CMCON?

Postado

O registrador INTCON pode ser acessado de qualquer banco.

Experimente mudar isto:

De:

DECFSZ ATRASO

Para:

DECFSZ ATRASO,1

Ou seja, coloque ,1 depois do nome do registrador, para que o resultado seja gravado nele mesmo, pois, pode ser que deixando em branco ele atribua o valor 0 o que faz o resultado ser gravado no registrador W e, então, o registrador ATRASO nunca chegará a zero.

Postado
O registrador INTCON pode ser acessado de qualquer banco.

Sim,é que como para se gravar na Eeprom do 16F628 voce só pode acessar através do banco 1 e GIE é zerado,não reparei no datasheet os 4 endereços disponíveis.

  • 4 semanas depois...
  • 2 meses depois...
Postado

Bom pessoal, primeiro quero pedir desculpas àqueles que ajudarão nesse topico. Segundo dou a mão à palmatoria. Isso porque cometi um erro banal que se repitiu por quase 8 meses. :wacko::(:o

O erro estava nas macros, configurei mal a macro do banco 0

BANCO0 MACRO

BCF STATUS,RP0

BSF STATUS,RP1

ENDM

Asim acessava o banco 2 e não o banco0, mas no banco também possui o registro PORTB por isso só o PORTB funcionava. ontem por acaso descubri isso.

Portanto agradeço a ajuda que deram e desculpa pelo esforço que fizeram.

Mas aí fica a lição, cuidado com os COPY/PASTE .

O tpico pode fechar.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!