Ir ao conteúdo

Posts recomendados

Postado

Bom dia, estou elaborando um código com o PIC 16f883, o código consiste em gerar um PWM no pino CCP1 de 5Khz e com duty cicle incrementado através de BOT1 e BOT2, porém na simulação do protheus nada ocorre, estou tendo um problema com esse mic em desabilitar os comparadores internos, mas não sei se isso interfere em algo nesse codigo. Segue código comentado....

 

 

#define BOT1 RE3_bit
#define BOT2 RA3_bit
#define BOT3 RA4_bit
#define BOT4 RA5_bit

unsigned short duty1;


void main() 
{

     TRISE.RE3   = 0x01;                             // RE3 como entrada
     TRISA       = 0b00111000;                       // RA3,RA4,RA5 como entrada
     TRISC       = 0x00;                             // Todo PORTC como saida
     PORTE       = 0b00001000;                       // Inicializa RE3 em 1
     PORTA       = 0b00111000;                       // Inicializa os botoem em 1
     PORTC       = 0x00;
     
     PWM1_Init(5000);                                // Inicializa PWM1 com frequencia de 5Khz
     PWM1_Start();                                   // Inicializa PWM1
     PWM1_Set_duty (duty1);                          // Seta o duty cicle com o valor da variavel duty1
     while(1)
{
     if (BOT1 == 0)                                      // Testa se B1 foi pressionado
     {
      duty1 ++;                                      // Se sim, incrementa duty cicle pwm1
      }
     if (BOT2 == 0)                                      // Testa de B2 foi pressionado
     {
     duty1 --;                                       // Se sim, decrementa duty cicle pwm1
     }

} // and while


} // anda main

adicionado 2 minutos depois

Segue os Fuses bits

fuses.png

Postado

Não entendi:

RE3_bit

 

No meu proteus não estou vendo essa porta RE. Tem RA,RB e RC. No comentário você fala "Testa se B1 foi pressionado", porém você se refere a R3 e não a B1. Mesma coisa com os outros, vamos dizer que você pegou o código de algum lugar desconhecido e os comentários estão errados... seria só isso mesmo você corrigir esse R3 ... o BOTAO B2 seria na saída A3. Coloque o desenho do proteus por aqui ou outro simulador que você use. 

adicionado 3 minutos depois

Ou outra entrada para o botão ... TRISE ... novamente, no to vendo essa porta aqui... você está definido porta que não tem... Olhe o datasheet também para ver as portas disponíveis...

Postado

@Bommu Perneta RE3 é o pino 1 que quando desabilitado o Master clear ele vira um pino de uso geral. O código não foi copiado eu elaborei e quando me refiro a B1 B2 B3 me refiro aos pinos que ja configurei no começo do programa com as diretivas define.

Postado

Atá huauhauh ^^ valeu por informar, dei um ctrl+F e achei no datasheet ^^ normalmente eu não uso ele porque ele fica no pino de resete e ele fica sempre em valor alto para evitar ele ficar variando ^^

 

Revendo aqui teu projeto ^^

Postado

Cara é só colocar  

 

duty1 = 16; 

 

 

para ser um valor inicial da do teu ciclo... eu tava dando uma olhada no teu código até simulei e não vi um valor incial para o duty1 ... provavelmente ele chama um valor qualquer da memória e ferra tudo ^^ mas mesmo assim ainda é chamado um ciclo mas de alguns mV (milivolts)

adicionado 1 minuto depois

Coloca depois da linha  PORTC       = 0x00;

adicionado 3 minutos depois

ah só dá para ver no Proteus se você usar o osciloscópio dele para valores pequenos ^^

Coloca na porta RC2

Postado

Pelo que to vendo aqui quando você não dá o valor ele chama duty1=0 e é um valor muito pequeno de tempo... só da para elevar a onda em alguns mV. Não dá para ver no Proteus a não ser que você use o osciloscópio dele, como disse ^^

 

Já vou testar teus botões... ainda não coloquei ^^

 

 

Postado

Solução

 

 #define BOT1 RE3_bit
#define BOT2 RA3_bit
#define BOT3 RA4_bit
#define BOT4 RA5_bit

unsigned short duty1;


void main()
{

   ANSEL = 0;   //só funciona com esse comando
     TRISE.RE3   = 0x01;                             // RE3 como entrada
     TRISA       = 0b00111000;                       // RA3,RA4,RA5 como entrada
     TRISC       = 0x00;                             // Todo PORTC como saida
     PORTE       = 0b00001000;                       // Inicializa RE3 em 1
     PORTA       = 0b00111000;                       // Inicializa os botoem em 1
     PORTC       = 0x00;
     duty1 = 75;
     PWM1_Init(5000);                                // Inicializa PWM1 com frequencia de 5Khz
     PWM1_Start();                                   // Inicializa PWM1
     PWM1_Set_duty (duty1);                          // Seta o duty cicle com o valor da variavel duty1
     while(1)
{
     if (BOT1 == 1)                                      // Testa se B1 foi pressionado
     {

     delay_ms(20);
      duty1 ++;                                      // Se sim, incrementa duty cicle pwm1
      PWM1_Set_duty (duty1);
      }
     if (BOT2 == 1)                                      // Testa de B2 foi pressionado
     {

     delay_ms(20);
     duty1 --;                                       // Se sim, decrementa duty cicle pwm1
     PWM1_Set_duty (duty1);
     }

} // and while


} // anda main

Desenho do circuito

1.PNG.97407312eda9d006dd1e7ae0553a0843.PNG

 

Ele coloquei o fuse RE3/MCLR pin function select      em disable.

 

 

 

Aqui está funcionando perfeitamente ^^

 

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!