Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Rafael da Silvaa

Problema com "__delay" (18f6520)

Recommended Posts

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?

Editado por Rafael da Silvaa

Compartilhar este post


Link para o post
Compartilhar em outros sites

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"

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
Entre para seguir isso  





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

×