Duvida Relogio Digital

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Duvida Relogio Digital

Mensagem  Marcus Vinícius em Sex Fev 11, 2011 1:02 pm

Bom dia,
Estou tentando passar um programa "Relógio Digital" do HC08 para o PIC18F. A programação é feita no C e utiliza uma interrupção interna para contagem do tempo a cada 1 segundo. O programa compila mas não funciona no LCD ficando 000:000:000.
Favor explicar o funcionamento da interrupção interna.
Caso ajude, enviei o programa para o email do Maurício.
Grato,

Marcus Vinícius

Mensagens : 2
Data de inscrição : 11/02/2011

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Duvida Relogio Digital

Mensagem  Bruno S. Avelar em Seg Fev 14, 2011 8:19 pm

Olá Marcus,

O PIC18F4550 possui ao todo 20 fontes de interrupções. Destas 16 são fontes de interrupções internas (geradas pelos periféricos do PIC) e 4 são fontes de interrupções externas (geradas através de pinos de I/O - Botões, sensores, etc.)

Existem 2 níveis de prioridades de interrupções: Alta prioridade e baixa prioridade.
A maior parte das interrupções permitem que você configure para que elas sejam tratadas no ISR (rotina de tratamento de interrupção) de alta prioridade ou no ISR de baixa prioridade.

Em geral, toda interrupção possui 3 bits que devem ser configurados/usados:
- Bit de prioridade da interrupção
- Bit de enable (habilitação)
- Bit de flag (indica quem gerou interrupção).

A posição de memória que a CPU é direcionada quando ocorre uma interrupção de alta prioridade ou baixa prioridade é 0x0008 e 0x0018 respectivamente. Entretanto, nos nossos KITs nesta área existe o firmware de bootloader quer permite auto-gravação via USB. O boot loader redireciona o programa para os endereços 0x1008 e 0x1018 quando ocorrem interrupções de alta e baixa prioridade respectivamente. Nestes endereços você deve colocar um salto para a função de tratamento de interrupções.
Para isto o trecho de código abaixo deve estar presente no seu programa:

Código:
/** V E C T O R  R E M A P P I N G ******************************************/
// Seção necessária para informar ao compilador C18 onde são os novos endereços
//da memória de programa que ele deve alocar as rotinas de tratamento do "reset"
//do microcontrolador e das rotinas de tratamento de interrupção.

//
//ATENÇÃO: COPIAR ESTA SEÇÃO DO CODIGO PARA TODO ARQUIVO "main.c" DOS PROJETOS QUE
//UTILIZAM O BOOTLOADER PARA GRAVAÇÃO IN-CIRCUIT.

// protótipo usado pelo compilador C18
extern void _startup (void);        // See c018i.c in your C18 compiler dir

// Alocação da função de tratamento do "reset" da aplicação principal
// no endereço 0x1000 da memória de programa
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset (void)
{
    _asm goto _startup _endasm
}

// Alocação da função de tratamento das interrupções de ALTA prioridade
// no endereço 0x1008 da memória de programa.
//
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = 0x1008
void _high_ISR (void)
{
    _asm goto Tratamento_High_Interrupt _endasm
}

// Alocação da função de tratamento das interrupções de BAIXA prioridade
// no endereço 0x1018 da memória de programa
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = 0x1018
void _low_ISR (void)
{
    _asm goto Tratamento_Low_Interrupt _endasm
}

#pragma code     // Diretiva que retorna a alocação dos endereços
            // da memória de programa para seus valores padrão

/** F I M  D A  S E Ç Ã O  D E  V E C T O R  R E M A P P I N G *************/
Repare que o reset também está presente. Este é um remapeamento necessário devido ao uso do bootloader.

No seu projeto você fala sobre fazer um "Relógio Digital". O PIC18F4550 possui um módulo para contar tempo e gerar interrupções ao fim da contagem chamado Timer.

O PIC18F4550 possuí ao todo 4 módulos Timers (Timer 0,Timer 1,Timer 2 e Timer 3). Todos possuem funcionalidades parecidas e podem ser utilizados ao mesmo tempo. Vou falar do Timer 0 que é o mais "completo" e mais indicado para sua aplicação. Os outros são bastante semelhantes.

O Timer0 pode funcionar com 8 ou 16 bits para contagem. Isto implica que o estouro do timer (que gera uma interrupção) pode ser feito ao ultrapassar o número 255 ou quando ultrapassar o número 65535. Esta contagem pode ser feita através de estímulos internos (pulsos de clock) ou estímulos externos (pulsos no pino RA4).
Ele possui um preescaler configurável como 2, 4, 8, 16, 32, 64, 128 ou 256 vezes. Preescaler é um hardware dedicado a "atrasar a contagem" fazendo a contagem de x em x estímulos. Por exemplo, caso o preescaler esteja configurado para 8 ele fará a contagem de 1 no Timer a cada 8 pulsos de clock ou 8 estímulos no RA4.

Existem uma biblioteca feita pela Microchip para o compilador C18 para o uso dos módulos Timers. A biblioteca chama-se <timers.h> e a ajuda pode ser encontrada em C:\mplabc18\doc\PIC18F Peripheral Library Help Document.chm

O que você deve fazer é utilizar a função OpenTimer0() para configurar o periférico, WriteTimer0() para escolher o valor inicial de onde deve começar a contagem. A função OpenTimer0() recebe um parametro que é uma mascara de configurações do módulo timer.

Para descobrir qual preescaler utilizar, em qual número começar a contagem para que o estouro seja sempre no valor que você deseja é preciso fazer algumas contas. A frequencia de incremento do timer configurado para estimulos internos para o PIC18F4550 funcionando a 48MHz é de 12MHz. Esta frequencia muda para outros valores de clock.

Prescaler ≥ tempo desejado / tempo de overflow sem prescaler

Onde o "tempo de overflow sem prescaler" depende se a contagem será feita com 8 bits ou 16 bits. O tempo de uma contagem é o inverso da frequencia de incremento. Logo com 8 bits será 255 * período de incremento e para 16 bits será 65535 * período de incremento.
Lembrando que o preescaler é o número possível dentre as opções do módulo (2,4,8,16...)

O valor que o timer deve começar quando for iniciado e sempre que houver uma interrupção (de onde começa a contagem)

valor_inical = overflow - (tempo desejado * FINC)/ Prescaler

Como você deseja utilizar o módulo timer com interrupção existem 3 bits que devem ser trabalhados:

bit de Prioridade (Priority): INTCON2bits.TMR0IP
bit de Habilitação (Enable): INTCONbits.TMR0IE
bit de Sinalização (Flag): INTCONbits.TMR0IF

A interrupção do Timer0 pode ser tratada dentro de qualquer ISR, quem define qual delas é o bit de Prioridade.


Existem alguns tópicos do forum que falam sobre estes assuntos:

Interrupção: http://picminas.forumeiros.com/t33-interrupcoes-e-bit-shift
Timer p/ relógio: http://picminas.forumeiros.com/t4-relogio-para-pic-18f4550

Espero ter ajudado,
Bruno S. Avelar
avatar
Bruno S. Avelar
Admin

Mensagens : 74
Data de inscrição : 26/07/2009
Idade : 32
Localização : Belo Horizonte MG

Ver perfil do usuário http://picminas.forumeiros.com

Voltar ao Topo Ir em baixo

Duvida Relogio Digital

Mensagem  Marcus Vinícius em Ter Fev 15, 2011 8:17 pm

Boa noite,
Já havia feito conforme explicado, porém , o programa não rodou.
Favor enviar seu endereçao eletrônico para que eu possa postar o meu main.c.
Grato,
Marcus

Marcus Vinícius

Mensagens : 2
Data de inscrição : 11/02/2011

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Duvida Relogio Digital

Mensagem  Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum