Jump to content
Sign in to follow this  
RaulE

PIC16F677 TMR0

Recommended Posts

RaulE

Boa noite,

Preciso de fazer uma montagem simples com um PIC16F677 capaz de ligar/desligar um LED de 500 em 500ms. Já o consegui fazer recorrendo a rotinas de delay(assembly), mas propuz-me a fazê-lo recorrendo a interrupções do TMR0. Contudo, fazendo a simulação no proteus tal não acontece! Só poderei testar a programação do mesmo no sábado porque não tenho o pickit comigo. Até lá gostava de saber se estou a proceder correctamente. 

O circuito

O circuito é o mais básico possível. O PIC está alimentado com 5v directamente da fonte (sem regulador), MCLR desligado, e oscilador externo com cristal(modo XT) de 4 MHZ. Estou a ligar a uma resistência de 220Ohm e um led no RB4.

Este circuito funcionou na perfeição com o primeiro programa realizado (rotina delay). 1 Há alguma modificação a fazer?

O programa até então realizado

________________________________________________________________

PROCESSOR 16F677

#include "p16F677.inc"

RADIX hex; valor do tipo de valores numericos usados

__CONFIG _CP_OFF & _PWRTE_ON  & _WDT_OFF & _XT_OSC & _MCLRE_OFF & _IESO_OFF & _BOR_OFF

ORG 0x0000

GOTO inicio

  ;***********************************INTERRUPT LOOP*****************

ORG 0x0004

BANKSEL PORTB

MOVLW 0xF0 ; 11110000 liga 4 pinos PORTB

MOVWF PORTB; Liga led

  ;implementar ~250ms de temporizacao com TMR0(com 256 de pre-divisao)

  MOVLW 0xE2 ;valor da contagem para 250ms

  MOVWF TMR0 ;carrega valor para o TMR0

  BCF INTCON, 2 ;limpa flag de interrupcao por TMR0

  RETFIE

  ;******************************************************************

ORG 0x0020

inicio

   

    BANKSEL TRISB

    CLRF TRISB ;TRISB como saida

BANKSEL PORTB                     

CLRF PORTB ; apaga led

    BANKSEL ANSEL ;muda para o banco onde está o registo ANSEl

    CLRF ANSEL ;limpa registo ANSEL

    CLRF ANSELH ;limpa registo ANSELH

   

    MOVLW b'0000111'

    MOVWF OPTION_REG ; prescaler 256

    MOVLW b'10100000'

    MOVLW INTCON

    MOVLW 0xE2

    MOVLW TMR0

repete

GOTO repete ;ciclo infinito

END

_______________________________________________________________________

O que vos parece? É baseado num dos exemplos práticos fornecidos pelo António Sérgio Sena (a quem para já agradeço imenso pelo todo o conteúdo que forneceu).

Há alguma alteração a ser feita? Penso ter calculado convenientemente o valor do TMR0, mas tenho dúvidas quanto ao seu funcionamento (rotina repete)...

Ajudem-me por favor, porque é um trabalho para a faculdade e o prazo de entrega é domingo! Obrigado pela atenção  ;)

Share this post


Link to post
Share on other sites
asena

Olá!

Assim de repente notei que, depois de trabalhar o registo ANSELx (bank2), não foi feito o BANKSEL para trabalhar o registo OPTION  (bank1/3).

Logo... o registo trabalhado em vez do OPTION, é o TMR0.

O TMR0 nunca vai incrementar, assim.

Também, de cada vez que entra na interrupção, liga o nibble alto. Onde está o desligar? não encontrei.

Assim, vai acender os 4 leds e fica estático.

O melhor é usar um SWAP ou um XOR, para ter actividade dos bits.

As restantes entradas estão pull-up/down?

Conselho :: os pinos não usados, deverão ser configurados como SAÍDA. Assim evitam pinos no ar a captar o ruido e a estragar o trabalho do CPU. Um pino de estrada está em alta impedância, o que faz com que seja extremamente susceptivel a ruidos ambientes.

Share this post


Link to post
Share on other sites
RaulE

Revisão código

PROCESSOR 16F677

#include "p16F677.inc"

RADIX hex; valor do tipo de valores numericos usados

__CONFIG _CP_OFF & _PWRTE_ON  & _WDT_OFF & _XT_OSC & _MCLRE_OFF & _IESO_OFF & _BOR_OFF

ORG 0x0000

GOTO inicio

  ;***********************************INTERRUPT LOOP*****************

ORG 0x0004

    BANKSEL PORTB

MOVLW 0xF0

    XORWF PORTB, f

  ;implementar ~250ms de temporizacao com TMR0(com 256 de pre-divisao)

  MOVLW 0xE2 ;valor da contagem para 250ms

  MOVWF TMR0 ;carrega valor para o TMR0

  BCF INTCON, 2 ;limpa flag de interrupcao por TMR0

  RETFIE

  ;******************************************************************

ORG 0x0020

inicio

   

    BANKSEL TRISA

    CLRF TRISA ;TRISA como saida

    BANKSEL TRISB

    CLRF TRISB ;TRISB como saida

    BANKSEL TRISC

    CLRF TRISC ;TRISB como saida

   

BANKSEL PORTB                     

CLRF PORTB ; apaga led

    BANKSEL ANSEL ;muda para o banco onde está o registo ANSEl

    CLRF ANSEL ;limpa registo ANSEL

    CLRF ANSELH ;limpa registo ANSELH

   

    BANKSEL OPTION_REG

    MOVLW b'10000111'

    MOVWF OPTION_REG ;configuracao TMR0

    BANKSEL INTCON

    MOVLW b'10100000'

    MOVWF INTCON

    BANKSEL TMR0

    MOVLW 0xE2

    MOVWF TMR0

repete

GOTO repete ;ciclo infinito

END

________________________________________________________________________________________________

Agora penso estar correcto (seguindo o seu exemplo). Fiz banksel para o registo OPTION_REG. Usei o XOR para fazer a inversão dos estados nos pinos de saida (RB4-RB7). Activei o 1º bit do registo OPTION_REG para desligar res. pull-ip.

Já agora quanto ao debbunging deste tipo de código...é possível fazê-lo com MPLAB SIM? Quanto ao que li em alguns sites, indicava que não...

Obrigado pela atenção  ;)

Share this post


Link to post
Share on other sites
asena

Dá para simular com o MPLAB SIM, sim. Sem problemas.

Aliás, dá para fazer "quase" todas as simulações com o MPLAB SIM. Eu simulo toda a máquina de estados, duas portas série ao mesmo tempo a receber e enviar dados, e ainda o resto dos periféricos internos.

É uma questão de leitura atenta do HELP do MPLAB, relativamente ao SIMulador.

qq dúvida, disponha.

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
Sign in to follow this  

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