Jump to content
r.santos

PICkit 2 Starter Kit - não consigo meter o SW1 a funcionar

Recommended Posts

r.santos

Bom dia,

Recentemente emprestaram-me o PICkit 2 Starter Kit que consiste num PCB com a PIC 16F690, quatro LEDs (RC0-RC3), um Switch (RA3) e um potenciómetro.

Tenho estado a brincar com isto mas deparei-me com um problema - não consigo meter o switch a funcionar. O LED acende assim que o programa arranca; o que não deveria ser, pois só devia acender quando pressiono o SW1.

Já tentei de várias maneiras (programação) mas sem sucesso. É estranho porque no simulador miSim, com o mesmo código, o switch (plugin) funciona.

O código que estou a usar é o seguinte:

LIST P=16F690
#INCLUDE "p16f690.inc"
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

;;;;;;  Variáveis

CBLOCK	0x20

ENDC

ORG 0x0000

;    Se ocorrer alguma interrupção, começa aqui
GOTO Inicio

Inicio:

	;    Altera para o banco 1
	BSF  STATUS,RP0
	;	 Define o bit 3 do PORTA como input (entrada)
	BSF  TRISA,3
	;    Define todo o PORTC como output (saída)
	BCF  TRISC,0
	;	 Volta ao banco 0
	BCF  STATUS,RP0

    ;    Inicialmente, deixamos o botão a 0 (não pressionado)
	BCF  PORTA,3
    ;	 Inicialmente, deixamos o LED a 0 (apagado)
	BCF  PORTC,0

TesteBotao:

	;     O botaõ está pressionado?
	BTFSC PORTA,3
	;     Se sim, acende o LED
	CALL  BotaoPressionado
	;	  Se não, volta a fazer o teste
	GOTO  TesteBotao

BotaoPressionado:

	;	  Acende o LED
	BSF   PORTC,0
	;	  Volta da rotina, sem afectar o W
	RETURN

END

Estou a fazer alguma coisa mal?

Obrigado, desde já.

Share this post


Link to post
Share on other sites
nunoalves23

Boas pessoal

eu sou mesmo muito novo nisto

e queria saber como se queria um topico

alguem que me possa ajudar

e algo urgente

obrigado a todos

Share this post


Link to post
Share on other sites
asena

Olá,

estou a ver que decidiu aprender Assembly. Os meus parabéns. Normalmente acha-se "esquisito" e dificil, e prefere-se uma linguagem de alto nivel.

Mas, para microcontroladores dessa gama e mais baixa, o Assembly é o melhor.

Ao ver o código, posso concluir que está cheio de dúvidas e incertezas, bem como lhe faltam as bases quase todas.

Convido-o a ler um livro/manual que escrevi, um Curso de Microcontraladores PIC, com exemplos práticos, que o ensina passo-a-passo como escrever um programa para PICmicro.

http://forum.electronicapt.com/index.php/topic,2448.0.html

Quaisquer dúvidas que tenha, pode escrever aqui ou no outro forum.

Por PM não respondo a dúvidas pois, as suas podem ser as dos outros e no forum faz mais sentido.

Sei que lhe podia dar as repostas directas às suas perguntas, mas aí não ía aprender nada. Já ganhava tudo mastigado.

bom trabalho!

Sérgio Sena

http://www.antoniosergiosena.com

Bom dia,

Recentemente emprestaram-me o PICkit 2 Starter Kit que consiste num PCB com a PIC 16F690, quatro LEDs (RC0-RC3), um Switch (RA3) e um potenciómetro.

Tenho estado a brincar com isto mas deparei-me com um problema - não consigo meter o switch a funcionar. O LED acende assim que o programa arranca; o que não deveria ser, pois só devia acender quando pressiono o SW1.

Já tentei de várias maneiras (programação) mas sem sucesso. É estranho porque no simulador miSim, com o mesmo código, o switch (plugin) funciona.

O código que estou a usar é o seguinte:

LIST P=16F690
#INCLUDE "p16f690.inc"
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

;;;;;;  Variáveis

CBLOCK	0x20

ENDC

ORG 0x0000

;    Se ocorrer alguma interrupção, começa aqui
GOTO Inicio

Inicio:

	;    Altera para o banco 1
	BSF  STATUS,RP0
	;	 Define o bit 3 do PORTA como input (entrada)
	BSF  TRISA,3
	;    Define todo o PORTC como output (saída)
	BCF  TRISC,0
	;	 Volta ao banco 0
	BCF  STATUS,RP0

    ;    Inicialmente, deixamos o botão a 0 (não pressionado)
	BCF  PORTA,3
    ;	 Inicialmente, deixamos o LED a 0 (apagado)
	BCF  PORTC,0

TesteBotao:

	;     O botaõ está pressionado?
	BTFSC PORTA,3
	;     Se sim, acende o LED
	CALL  BotaoPressionado
	;	  Se não, volta a fazer o teste
	GOTO  TesteBotao

BotaoPressionado:

	;	  Acende o LED
	BSF   PORTC,0
	;	  Volta da rotina, sem afectar o W
	RETURN

END

Estou a fazer alguma coisa mal?

Obrigado, desde já.

Share this post


Link to post
Share on other sites
r.santos

Em relação às dúvidas e falta de base, foi assim que o professor nos ensinou.

Obrigado pela recomendação. Vou ler de certeza.

Share this post


Link to post
Share on other sites
r.santos

A ver se percebi bem: tenho de configurar a interrupção (INTCON) e meter o código para ver se o botão está pressionado em ORG 0x04?

É isso?

Share this post


Link to post
Share on other sites
r.santos

A partir da página 80, certo?

Referes-te à configuração da porta para digital/analógico (ANSEL(H))?

Share this post


Link to post
Share on other sites
bubulindo

Não... o que o asena refere é a configuracão das portas digitais onde escolhes se queres que um determinado pino seja de entrada ou saída. Não tenho a certeza se os PICs vêm com resistências de pull up internas, mas se vierem, também existirá outro registo para configurar isso.

Não sou grande adepto nem conhecedor dos PIC, mas em menos de 5 minutos vi no manual online como configurar portas. Procura por Initializing PORT e lá deve haver um exemplo.  Se não me engano tens de mexer nos bancos de memória antes de realizares algumas dessas operacões.

Já agora, provavelmente não estás a achar piada nenhuma ao Assembly, principalmente se já programaste com linguagens de nível mais alto, mas acredita que o Assembly vai permitir-te desenvolver de maneira muito mais segura e fácil o desenvolvimento em linguagens como o C para microcontroladores.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
r.santos
Não... o que o asena refere é a configuracão das portas digitais onde escolhes se queres que um determinado pino seja de entrada ou saída.

Não foi o que eu disse? Como entrada já estava configurada, faltava para ser digital e foi isso o que perguntei (ANSEL).

Não tenho a certeza se os PICs vêm com resistências de pull up internas, mas se vierem, também existirá outro registo para configurar isso.

Na que eu estou a usar, tem.

Não sou grande adepto nem conhecedor dos PIC, mas em menos de 5 minutos vi no manual online como configurar portas. Procura por Initializing PORT e lá deve haver um exemplo. Se não me engano tens de mexer nos bancos de memória antes de realizares algumas dessas operacões.

Se o problema fosse só esse. Já tentei vários exemplos e nenhum deles funciona.

Já agora, provavelmente não estás a achar piada nenhuma ao Assembly, principalmente se já programaste com linguagens de nível mais alto, mas acredita que o Assembly vai permitir-te desenvolver de maneira muito mais segura e fácil o desenvolvimento em linguagens como o C para microcontroladores.

Pelo contrário, até estou a gostar, apesar de ser bastante diferente das outras em que tinha mexido.

Share this post


Link to post
Share on other sites
r.santos

Para já estou a tentar configurar as PORTx como disseste.

PROCESSOR 16F690
#include  "p16f690.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x20	
ENDC
ORG 0x00
    GOTO Inicio
ORG 0x04

    GOTO Inicio
    Inicio
		    BCF STATUS,RP0
		    BCF STATUS,RP1
		    CLRF PORTA
		    CLRF PORTB
		    CLRF PORTC
		    BSF STATUS,RP1
		    CLRF ANSEL
					    CLRF ANSELH
		    BSF STATUS,RP0
		    BCF STATUS,RP1
		    MOVLW B'00001000' ; 76543210 RA3 como input
		    MOVWF TRISA
		    CLRF TRISB
		    CLRF TRISC
		    BCF STATUS,RP0
    Loop
		    GOTO Loop
END

Estou a fazer alguma coisa mal? Acho que agora só me falta a parte do INTERRUPT-ON-CHANGE.

Share this post


Link to post
Share on other sites
asena

#

Em vez de usar as instruções: BCF/BSF STATUS, RP0, que estão correctas, mas não é a maneira mais correcta, há uma directiva de Assembly do MPLAB que facilita a mudança de bancos, pois não necessitamos de saber onde está o registo: banksel ANSEL.

Tudo explicado no documento disponivel na Microchip :: http://ww1.microchip.com/downloads/en/devicedoc/30400g.pdf

#

Reparei que vais usar a entrada RA3, que é normalmente o 'MCLR do chip. Esse pino funciona apenas como entrada digital ou como reset.

Como no CONFIG não puseste o _MCLRE_OFF, o PIC assume que o pino está a ser usado como entrada para 'MCLR.

Pode estar aqui o teu problema, ou um deles.

# No fim do "C:\Program Files\Microchip\MPASM Suite\p16f690.inc", está uma lista de FUSIVEIS, para ajudar a configurar o PIC. Devem ser "todos" usados, mesmo que mantenhamos o valor de defeito de fábrica. Ajuda a sabermos o que está a acontencer, e quando lermos o código passado algum tempo, sabemos o que fizemos.

Página 176 do datasheet, o que não for configurado, liga a função por defeito.

;==========================================================================
;
;       Configuration Bits
;
;==========================================================================

_FCMEN_ON                    EQU     H'3FFF'
_FCMEN_OFF                   EQU     H'37FF'
_IESO_ON                     EQU     H'3FFF'
_IESO_OFF                    EQU     H'3BFF'
_BOR_ON                      EQU     H'3FFF'
_BOR_NSLEEP                  EQU     H'3EFF'
_BOR_SBODEN                  EQU     H'3DFF'
_BOR_OFF                     EQU     H'3CFF'
_CPD_ON                      EQU     H'3F7F'
_CPD_OFF                     EQU     H'3FFF'
_CP_ON                       EQU     H'3FBF'
_CP_OFF                      EQU     H'3FFF'
_MCLRE_ON                    EQU     H'3FFF'
_MCLRE_OFF                   EQU     H'3FDF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FEF'
_WDT_ON                     EQU     H'3FFF'
_WDT_OFF                    EQU     H'3FF7'
_LP_OSC                      EQU     H'3FF8'
_XT_OSC                      EQU     H'3FF9'
_HS_OSC                      EQU     H'3FFA'
_EC_OSC                      EQU     H'3FFB'
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_EXTRC_OSC_NOCLKOUT          EQU     H'3FFE'
_EXTRC_OSC_CLKOUT            EQU     H'3FFF'
_INTOSCIO                    EQU     H'3FFC'
_INTOSC                      EQU     H'3FFD'
_EXTRCIO                     EQU     H'3FFE'
_EXTRC                       EQU     H'3FFF'

# como é o teu oscilador? interno ou cristal externo ?

Share this post


Link to post
Share on other sites
r.santos
Em vez de usar as instruções: BCF/BSF STATUS, RP0, que estão correctas, mas não é a maneira mais correcta, há uma directiva de Assembly do MPLAB que facilita a mudança de bancos, pois não necessitamos de saber onde está o registo: banksel ANSEL.

Tudo explicado no documento disponivel na Microchip :: http://ww1.microchip.com/downloads/en/devicedoc/30400g.pdf

Foi assim que me ensinaram, mas vou passar a usar o banksel, como recomendas.

Reparei que vais usar a entrada RA3, que é normalmente o 'MCLR do chip. Esse pino funciona apenas como entrada digital ou como reset.

Como no CONFIG não puseste o _MCLRE_OFF, o PIC assume que o pino está a ser usado como entrada para 'MCLR.

Pode estar aqui o teu problema, ou um deles.

Sim, estou a usar o RA3 porque no PCB que vem no kit, o switch está ligado à PORTA,3.

Vou experimentar isso.

# No fim do "C:\Program Files\Microchip\MPASM Suite\p16f690.inc", está uma lista de FUSIVEIS, para ajudar a configurar o PIC. Devem ser "todos" usados, mesmo que mantenhamos o valor de defeito de fábrica. Ajuda a sabermos o que está a acontencer, e quando lermos o código passado algum tempo, sabemos o que fizemos.

Página 176 do datasheet, o que não for configurado, liga a função por defeito.

Ok, vou passar a ter mais atenção a isso.

# como é o teu oscilador? interno ou cristal externo ?

Como posso ver isso? O PCB trás alguns cristais de quartz.

Share this post


Link to post
Share on other sites
r.santos

Não queria estar a fazer double post mas a verdade é que ainda não consigo 'meter' o switch do PCB do kit a funcionar.

O último código que tentei foi este:

LIST P=PIC16F690
processor 16F690
radix hex
include "p16f690.inc"

__config _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_ON & _CP_ON & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

ORG 0x00

       GOTO principal

ORG 0x04

       GOTO principal

       principal

               banksel PORTA
               clrf PORTA
               clrf PORTB
               clrf PORTC
               banksel ANSEL
               clrf ANSEL
               clrf ANSELH
               banksel TRISA
               movlw 0xFF
               movwf TRISA
               movlw 0x00
               movwf TRISB
               movlw 0x00
               movwf TRISC

       apagar

               clrf PORTB
               clrf PORTC

       inicio

               btfsc PORTA,3
               goto apagar

               movlw 0xFF
               movwf PORTC

               goto inicio

END

Share this post


Link to post
Share on other sites
asena

# o  esquema eléctrico?

# depois de configurares as portas, não mudas de banco. Pensas que estás a mexer nos registos PORTx, mas estás a mexer nos TRISx.

# precisas da PORTA toda como entrada? se sim, tens que ter pull-ups. Se não, configura para já como saída.

Share this post


Link to post
Share on other sites
r.santos
# o esquema eléctrico?

http://ww1.microchip.com/downloads/en/DeviceDoc/41301A.pdf (a partir da página 12).

# depois de configurares as portas, não mudas de banco. Pensas que estás a mexer nos registos PORTx, mas estás a mexer nos TRISx.

Foi um lapso ao copiar o código para aqui. Ele volta ao banco 0 (banksel PORTA) mas mesmo assim não está a funcionar.

# precisas da PORTA toda como entrada? se sim, tens que ter pull-ups. Se não, configura para já como saída.

Não, só preciso do PORTA,3 como input, mas como tenho estado a experimentar várias maneiras para meter isto a funcionar...

Share this post


Link to post
Share on other sites
r.santos

Obrigado pela ajuda. Já está a funcionar :)

Fui pedir ajuda ao fórum da Microchip e disseram que tinha de alterar as definições do programador PICkit 2 caso contrário, o SW1 nunca funcionaria.

Para quem tiver o mesmo problema, basta configurar o PICkit 2 como em baixo:

http://img233.imageshack.us/img233/4889/pk2settings.gif

Obrigado asena à mesma pelas dicas em relação à configuração de portas. Já fiquei a saber mais um pouco. :)

Share this post


Link to post
Share on other sites
r.santos
óptimo! é preciso é que funcione.

Nunca imaginei que estavas com o circuito a funcionar agarrado ao PK2.

Disse logo no primeiro post.

O correcto é alimentar o sistema autonomamente, sempre.

Sim, estou ciente disso. Até prefiro ter a PIC numa breadboard, assim não tenho de andar com o programador atrás, mas como queria meter o switch que vinha no PCB...

vai colocando os teus avanços, é sempre interessante acompanhar!

Obrigado! Ainda te devo chatear mais algumas vezes, visto que vou fazer a minha PAP com PIC (em princípio com suporte TCP/IP).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.