Ir ao conteúdo
  • Cadastre-se
estevaotrp

Problema com simulação: PIC12F675

Recommended Posts

Pessoal, tenho tentado, sem sucesso, simular um programinha com PIC12F675 usando o MPLAB. A compilação é feita sem problemas, mas na hora de simular, a saída não é alterada. Esse programa é bem básico, trata-se de um led que acende e apaga com rotina de atraso. Como não conheço esse pic, acho que pode ser algum erro de configuração ou inicialização. Por outro lado, alguns arquivos-fonte que achei na net não tinha nada demais na inicialização. Quem puder me ajudar... Abaixo, programa:

#INCLUDE "P12F675.INC"

CBLOCK H'20'
CONTADOR
ENDC

#DEFINE LED GPIO,0

ORG H'00'
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISIO
BCF STATUS,RP0

;ROTINA PRINCIPAL
INICIO BTFSS LED
GOTO E_UM
CALL TEMPO
BCF LED
GOTO INICIO
E_UM CALL TEMPO
BSF LED
GOTO INICIO

;SUBROTINA
TEMPO MOVLW D'200'
MOVWF CONTADOR
CONTA DECFSZ CONTADOR,F
GOTO CONTA
RETURN
END

não consegui formatar a mensagem...rs. qq dúvida perguntem.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Pessoal, tenho tentado, sem sucesso, simular um programinha com PIC12F675 usando o MPLAB. A compilação é feita sem problemas, mas na hora de simular, a saída não é alterada. Esse programa é bem básico, trata-se de um led que acende e apaga com rotina de atraso. Como não conheço esse pic, acho que pode ser algum erro de configuração ou inicialização. Por outro lado, alguns arquivos-fonte que achei na net não tinha nada demais na inicialização. Quem puder me ajudar... Abaixo, programa:

#INCLUDE "P12F675.INC"

CBLOCK H'20'
CONTADOR
ENDC

#DEFINE LED GPIO,0

ORG H'00'
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISIO
BCF STATUS,RP0

;ROTINA PRINCIPAL
INICIO BTFSS LED
GOTO E_UM
CALL TEMPO
BCF LED
GOTO INICIO
E_UM CALL TEMPO
BSF LED
GOTO INICIO

;SUBROTINA
TEMPO MOVLW D'200'
MOVWF CONTADOR
CONTA DECFSZ CONTADOR,F
GOTO CONTA
RETURN
END

não consegui formatar a mensagem...rs. qq dúvida perguntem.

ASM não é meu forte, mas... você está configurando o clock como externo, interno com clockout, interno sem clockout, ou como?

Se você não estiver configurando nada, o melhor é deixar o oscilador interno sem clockout, ok?

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ôpa! Finalmente um código em ASM! :lol:

O código me parece correto.

Verifique o que o colega xanok citou.

Se a frequência do oscilador estiver em 4MHz, a frequência do LED será de 2,5KHz, e ele parecerá permanentemente aceso.

Para uma frequência próxima de 1 Hz, poderia alterar para isto:

#INCLUDE "P12F675.INC"

CBLOCK H'20'

CONTADOR

CONTADOR1

CONTADOR2

ENDC

#DEFINE LED GPIO,0

ORG H'00'

BSF STATUS,RP0

MOVLW B'00000000'

MOVWF TRISIO

BCF STATUS,RP0

;ROTINA PRINCIPAL

INICIO

BTFSS LED

GOTO E_UM

CALL TEMPO

BCF LED

GOTO INICIO

E_UM

CALL TEMPO

BSF LED

GOTO INICIO

;SUBROTINA

TEMPO

MOVLW D'255'

MOVWF CONTADOR

MOVLW D'255'

MOVWF CONTADOR1

MOVLW D'31'

MOVWF CONTADOR2

CONTA

DECFSZ CONTADOR,F

GOTO CONTA

MOVLW D'255'

MOVWF CONTADOR

DECFSZ CONTADOR1,F

GOTO CONTA

MOVLW D'255'

MOVWF CONTADOR1

DECFSZ CONTADOR2,F

GOTO CONTA

MOVLW D'31'

MOVWF CONTADOR2

RETURN

END

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal, o programa que eu preciso fazer no PIC12F675 eu consegui fazer no

PIC16F84A. Gostaria de saber como ficarão as instruções no 12F675, que até agora não consegui simular. Abaixo código-fonte(PIC16F84A):

#INCLUDE "P16F84A.INC"

CBLOCK H'0C'

CONTADOR

FLAGS

W_TEMP

ST_TEMP

ENDC

#DEFINE CHAVE PORTA,0

#DEFINE LED1 PORTB,1

#DEFINE LED2 PORTB,2

#DEFINE F1 FLAGS,0

#DEFINE F2 FLAGS,1

ORG H'00'

GOTO SETUP

;TRATAMENTO DA INTERRUPCAO

;ROTINA DE INICIO DA INTERRUPCAO

ORG H'04'

MOVWF W_TEMP

SWAPF STATUS,W

MOVWF ST_TEMP

BTFSS INTCON,T0IF

GOTO SAI_INT

;ROTINA DE INTERRUPCAO

BCF INTCON,T0IF

BTFSS F1

GOTO I1

BCF F1

BSF F2

GOTO SAI_INT

I1 BTFSS F2

GOTO SAI_INT

BCF F2

BSF F1

GOTO SAI_INT

;ROTINA DE SAÍDA DA INTERRUPCAO

SAI_INT MOVLW D'200'

MOVWF TMR0

SWAPF ST_TEMP,W

MOVWF STATUS

SWAPF W_TEMP

RETFIE

;configuração DE I/O, INT E PRESCALER.

SETUP BSF STATUS,RP0

MOVLW B'00000001'

MOVWF TRISA

MOVLW B'00000000'

MOVWF TRISB

MOVLW B'00100000'

MOVWF INTCON

MOVLW B'00000110'

MOVWF OPTION_REG

BCF STATUS,RP0

MOVLW D'200'

MOVWF TMR0

BSF F2

CLRF PORTA

CLRF PORTB

;ROTINA PRINCIPAL

INICIO BTFSS CHAVE

GOTO INICIO

BSF INTCON,GIE

BTFSC F1

GOTO HF

BTFSC F2

GOTO LF

GOTO INICIO

HF MOVLW D'5'

MOVWF CONTADOR

CALL CONTA

BTFSS LED1

GOTO A1

BCF LED1

BSF LED2

GOTO INICIO

A1 BCF LED2

BSF LED1

GOTO INICIO

LF MOVLW D'50'

MOVWF CONTADOR

CALL CONTA

BTFSS LED1

GOTO A2

BCF LED1

BSF LED2

GOTO INICIO

A2 BCF LED2

BSF LED1

GOTO INICIO

;SUBROTINA CONTA

CONTA DECFSZ CONTADOR,F

GOTO CONTA

RETURN

END

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Estevão, o caso é o seguinte, este pic possui um comparador, e para que tu utilize as portas digitais tu tens que desabilitar o comparador programando o registrador CMCON nos bits CM2:CM0 = 111, ai sim tu vai poder usar a saida digital!!!

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites
pessoal, o programa que eu preciso fazer no PIC12F675 eu consegui fazer no

PIC16F84A. Gostaria de saber como ficarão as instruções no 12F675, que até agora não consegui simular. Abaixo código-fonte(PIC16F84A):

Você quer passar o código para PIC12F675?

Em primeiro lugar você deve ter em mente que o PIC12F675 só tem 5 saídas de Input e Output, e uma só de Input (MCLR).

Então pode descartar a ideia de usar os PORTA e PORTB, pois nele você vai usar o GPIO.

Como disse não sei ASM, não sou a pessoa mais indicada para fazer uma tradução para outro controlador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Estavão, o Denis Bopp está certo. A unica falha no seu código foi não desligar o comparador.

Por padrão o GPIO é configurado para a função comparador, e para usar os pinos como Entrada/Saída, devemos desligar o Comparador.

insira a seguinte linha no seu código, logo abaixo da diretiva ORG (o registro CMCON fica no banco 0)


movlw b'00000111'
movwf CMCON

esta instrução fará com que os pinos GP0 GP1 e GP2 sejam tratados como pinos Digitais.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Você quer passar o código para PIC12F675?

Em primeiro lugar você deve ter em mente que o PIC12F675 só tem 5 saídas de Input e Output, e uma só de Input (MCLR).

Então pode descartar a ideia de usar os PORTA e PORTB, pois nele você vai usar o GPIO.

Como disse não sei ASM, não sou a pessoa mais indicada para fazer uma tradução para outro controlador.

obrigado pelo seu comentário. Eu já até tinha conhecimento disso que você disse, só que acho que o problema está na inicialização do PIC12F675, portanto fiz o programa para o 16F84A só para demonstrar o que quero fazer no 12F675. Espero que, desabilitando o comparador, eu consiga resolver este impasse.

abraço.

pessoal, fiz o programa para o PIC12F675 com as devidas modificações, porém não funcionou no simulador. Não consigo alterar o estado das portas GPIO. Segue, código-fonte:

#INCLUDE	"P12F675.INC"

CBLOCK H'20'
CONTADOR
FLAGS
W_TEMP
ST_TEMP
ENDC

#DEFINE CHAVE GPIO,0
#DEFINE LED1 GPIO,1
#DEFINE LED2 GPIO,2
#DEFINE F1 FLAGS,0
#DEFINE F2 FLAGS,1

ORG H'00'
GOTO SETUP

;TRATAMENTO DA INTERRUPCAO
;ROTINA DE INICIO DA INTERRUPCAO
ORG H'04'
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF ST_TEMP
BTFSS INTCON,T0IF
GOTO SAI_INT

;ROTINA DE INTERRUPCAO
BCF INTCON,T0IF
BTFSS F1
GOTO I1
BCF F1
BSF F2
GOTO SAI_INT
I1 BTFSS F2
GOTO SAI_INT
BCF F2
BSF F1
GOTO SAI_INT

;ROTINA DE SAÍDA DA INTERRUPCAO

SAI_INT MOVLW D'200'
MOVWF TMR0
SWAPF ST_TEMP,W
MOVWF STATUS
SWAPF W_TEMP
RETFIE

;configuração DE I/O, INT E PRESCALER.
SETUP BSF STATUS,RP0
MOVLW B'00000001'
MOVWF TRISIO
MOVLW B'00100000'
MOVWF INTCON
MOVLW B'00000110'
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW B'00000111'
MOVWF CMCON
MOVLW D'200'
MOVWF TMR0
BSF F2
CLRF GPIO

;ROTINA PRINCIPAL
INICIO BSF INTCON,GIE
BTFSC F1
GOTO HF
BTFSC F2
GOTO LF
GOTO INICIO

HF MOVLW D'5'
MOVWF CONTADOR
CALL CONTA
BTFSS LED1
GOTO A1
BCF LED1
BSF LED2
GOTO INICIO
A1 BCF LED2
BSF LED1
GOTO INICIO

LF MOVLW D'50'
MOVWF CONTADOR
CALL CONTA
BTFSS LED1
GOTO A2
BCF LED1
BSF LED2
GOTO INICIO
A2 BCF LED2
BSF LED1
GOTO INICIO

;SUBROTINA CONTA
CONTA DECFSZ CONTADOR,F
GOTO CONTA
RETURN
END

Na rotina principal ficou faltando testar a chave. Eu tirei para testar se os leds acendiam e esqueci de colocar. Não consegui estimular o pino da chave, nem acender os leds.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a frequência do oscilador que você está utilizando?

Com que frequência você deseja que os LEDs alternem?

Veja se estou enganado:

O estado dos flags F1 e F2 são alterados quando ocorre uma interrupção.

Mas, o estado dos LEDs é alterado cada vez que o programa passa pela rotina principal.

Não era para alterar o estado dos LEDs somente quando ocorresse uma interrrupção?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Na rotina principal ficou faltando testar a chave. Eu tirei para testar se os leds acendiam e esqueci de colocar. Não consegui estimular o pino da chave, nem acender os leds.

Oi Estevão, me esqueci de um detalhe importante, esse modelo possui um conversor AD também, então precisa limpar o registro ANSEL, substitui o teu setup assim:

SETUP	BSF	 STATUS,RP0
MOVLW B'00000001'
MOVWF TRISIO
MOVLW B'00100000'
MOVWF INTCON
MOVLW B'00000110'
MOVWF OPTION_REG
CLRF ANSEL ;Adiciona esta linha e tudo se resolve!!!!
BCF STATUS,RP0
MOVLW B'00000111'
MOVWF CMCON
MOVLW D'200'
MOVWF TMR0
BSF F2
CLRF GPIO

Compartilhar este post


Link para o post
Compartilhar em outros sites
Oi Estevão, me esqueci de um detalhe importante, esse modelo possui um conversor AD também, então precisa limpar o registro ANSEL, substitui o teu setup assim:

SETUP	BSF	 STATUS,RP0
MOVLW B'00000001'
MOVWF TRISIO
MOVLW B'00100000'
MOVWF INTCON
MOVLW B'00000110'
MOVWF OPTION_REG
CLRF ANSEL ;Adiciona esta linha e tudo se resolve!!!!
BCF STATUS,RP0
MOVLW B'00000111'
MOVWF CMCON
MOVLW D'200'
MOVWF TMR0
BSF F2
CLRF GPIO

valeu cara, era exatamente esse ANSEL q estava impedindo o funcionamento.

Agora tá funcionando numa boa.

Qual a frequência do oscilador que você está utilizando?

Com que frequência você deseja que os LEDs alternem?

Veja se estou enganado:

O estado dos flags F1 e F2 são alterados quando ocorre uma interrupção.

Mas, o estado dos LEDs é alterado cada vez que o programa passa pela rotina principal.

Não era para alterar o estado dos LEDs somente quando ocorresse uma interrrupção?

Antes não estava preocupado com as frequencias porque ele nem estava funcionando. Escolhi algumas frequencias apenas para testar. valeu ae!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Fiz um código em C que faz piscar todas as saídas e mandei gerar o ASM, que está comentado e pequeno:


// By xanok
void main() {
char i = 0;

TRISIO = 0;
while(1) {
i = ~i;
GPIO = i;
Delay_ms(100);
}

}

;  ASM code generated by mikroVirtualMachine for PIC - V. 8.1.0.0
; Date/Time: 14/5/2009 10:23:09
; Info: http://www.mikroe.com


; ADDRESS OPCODE ASM
; ----------------------------------------------
$0000 $2804 GOTO _main
$0004 $ _main:
;teste_lcd.c,1 :: void main() {
;teste_lcd.c,2 :: char i = 0;
$0004 $1303 BCF STATUS, RP1
$0005 $1283 BCF STATUS, RP0
$0006 $01A0 CLRF main_i_L0, 1
;teste_lcd.c,4 :: TRISIO = 0;
$0007 $1683 BSF STATUS, RP0
$0008 $0185 CLRF TRISIO, 1
;teste_lcd.c,5 :: while(1) {
$0009 $ L_main_0:
;teste_lcd.c,6 :: i = ~i;
$0009 $0920 COMF main_i_L0, W
$000A $00D0 MOVWF STACK_0
$000B $0850 MOVF STACK_0, 0
$000C $00A0 MOVWF main_i_L0
;teste_lcd.c,7 :: GPIO = i;
$000D $0850 MOVF STACK_0, 0
$000E $1283 BCF STATUS, RP0
$000F $0085 MOVWF GPIO
;teste_lcd.c,8 :: Delay_ms(100);
$0010 $3082 MOVLW 130
$0011 $00DB MOVWF STACK_11
$0012 $30FF MOVLW 255
$0013 $00DA MOVWF STACK_10
$0014 $0BDB DECFSZ STACK_11, F
$0015 $2817 GOTO $+2
$0016 $281A GOTO $+4
$0017 $0BDA DECFSZ STACK_10, F
$0018 $2817 GOTO $-1
$0019 $2814 GOTO $-5
$001A $3087 MOVLW 135
$001B $00DA MOVWF STACK_10
$001C $0BDA DECFSZ STACK_10, F
$001D $281C GOTO $-1
$001E $0000 NOP
;teste_lcd.c,9 :: }
$001F $2809 GOTO L_main_0
;teste_lcd.c,11 :: }
$0020 $2820 GOTO $

Se você quiser o hex, tenho aqui:

http://www.4shared.com/file/105307519/ece99aed/teste_lcd.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×