Ir ao conteúdo
  • Cadastre-se

Problema com "__delay" (18f6520)


Posts recomendados

Olá, irei utilizar o pic 18f6520 para controlar 4 motores. Estou na fase de simulação utilizando o proteus. O proteus está apresentando alguns problemas, onde, quando eu utilizo muito o comando __delay (xxx) ele reseta o programa do começo. Eu sempre fiz atividades utilizando 16f, e nunca tive problemas com isso, usava diversos "__delays" e não dava problema nenhum, e agora o 18f está me complicando.

No proteus aparece escrito "processor has been reset by watchdog time expiring", porém, como vocês verão, o WDT já tá OFF.

Já li que, na prática, não usa-se o "__delay", e sim, outros tipos de paralisação, que não domino, alguém pode me dizer onde posso ler sobre isso pro 18f?

O código é o seguinte, ele tá partindo com 1/3 da tensão (ccp em 80) e vai pra tensão inteira (249), isso ainda não é o que vou fazer, to só testando ainda.

 

//
// PIC18F6520 1kHz PWM
 
#include <xc.h>
#pragma MCLRE=OFF,WDT=OFF,LVP=OFF,BOREN=OFF
int main(void)
{

    CCP1CON = 0b00001100; 
    CCP2CON = 0b00001100;
    CCP3CON = 0b00001100;
    CCP4CON = 0b00001100;
    TRISC = 0b11111001;  
    TRISG = 0b11110110;
    T2CON = 0b00000100;    
    PR2 = 249; 
    CCPR1L = 25;
    CCPR2L = 25;
    CCPR3L = 25;
    CCPR4L = 25;
     
    while(1)
    {
        // 100% duty cycle pra 500ms é 249
        // 50% é 125
        // 0% é 1, 0 n funciona        
        CCPR1L = 80;
        CCPR2L = 80;
        CCPR3L = 80;
        CCPR4L = 80;       
        _delay(125000);
        _delay(125000);       
        CCPR1L = 249;
        CCPR2L = 249;
        CCPR3L = 249;
        CCPR4L = 249;       
        _delay(125000);
        _delay(125000);
        _delay(125000);
        _delay(125000);
    }}

 

Desculpa, não sei colocar o código em aba (alguém me ensina se der).

Se eu colocar mais delays do que esses que já tem, ele reseta o código (durante a simulação). Meu professor disse que provavelmente o proteus não está reconhecendo o "WDT = OFF", e na prática não daria problema, porém, realmente não usa-se "__delay" para fazer delay, isso é só para programas bobos, ou pequenas paradas. Porém, ainda não sei como fazer esses delays da melhor forma, usa-se interrupção, timer? Alguém pode me mandar algum material?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Realmente é muito tempo parado sem fazer nada. Que parâmetro é aquele? mS? uS? Que valores de tempo precisas?

Quanto ao wdog, verifique nas propriedades do mc.

Quanto ao delay, você pode criar o seu
 

void delay(unsigned int d)
{
while(d--);
}

Claro, vai depender da velocidade do clock e tal mas já lhe é um norte

 

Código... Selecione e clique em "code"

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!