Ir ao conteúdo

robo radio controlado por pic


Octavio Nivoloni

Posts recomendados

Postado

Olá pessoal.

gostaria de saber, se vocês poderiam ajudar-me com um problema de programação do pic16f628a.

Estou fazendo um robô que recebe um sinal pwm e precisa sem transformado em tensão continua.

consegui chegar a uma programação mais nao deu certo teria como vocês darem uma força??

programação:

#include <16f628A.h>

#use delay (clock = 4000000)

#fuses INTRC_IO, NOPUT, NOWDT, NOMCLR, NOLVP, PROTECT, CPD, BROWNOUT

// Declaração das Variaveis

int a=1;

int1 sync=0; // sincroniza o funcionamento

int1 nb1=0; // usada para saber o nivel do pino B1

int1 nb2=0; // usada para saber o nivel do pino B2

int16 pegatmr1=0;//guarda valor pego do timer 1

int16 pegatmr1_2=0;

// Fim da declaração das Variaveis

// Declaração das Funções

void main(void); // Função principal

void rb_isr(void); // Função tratamento interrupção de mudança de estado PORTB

void trata_t0(void); // Função de tratamento da interrupção do Timer0

// Fim da declaração das Funções

#int_timer0 // vetor interrupção estouro de Timer0

void trata_t0(void) // Função de tratamento da interrupção do Timer0

{

disable_interrupts(GLOBAL); // desliga todas interrupções

output_low (pin_a0); // DESLIGA pino A0 -> de ir para frente

output_low (pin_a1); // DESLIGA pino A1 -> de ir para tras

output_low (pin_a2); // DESLIGA pino A2 -> de ir para esquerda

output_low (pin_a3); // DESLIGA pino A3 -> de ir para direita

output_low (pin_a4); // DESLIGA pino A4 -> de acionar a arma

enable_interrupts (GLOBAL); // Religa todas interrupções

}

#int_rb // vetor interrupção mudança de estado no PORTB

void rb_isr(void) // Função tratamento interrupção de mudança de estado PORTB

{

disable_interrupts(GLOBAL); // desliga todas interrupções

set_timer0(0); // zera o Timer0 para não ocorrer o ativamento do fail safe

if ((input (pin_B4)) & (nb1==0) & (a==1))

{

set_timer1 (0);

nb1=1;

}

if ((!input (pin_B4)) & (nb1==1) & (a==1))

{

pegatmr1 = 0;

pegatmr1 = get_timer1 ();

nb1=0;

sync=1;

}

///////////////////////////////////////////////////////////////////////////////

if ((input (pin_B5)) & (nb2==0) & (a==2))

{

set_timer1 (0);

nb2=1;

}

if ((!input (pin_B5)) & (nb2==1) & (a==2))

{

pegatmr1_2 = 0;

pegatmr1_2 = get_timer1 ();

nb2=0;

sync=1;

}

enable_interrupts(GLOBAL); // Religa todas interrupções

}

void main(void) // Função principal

{

output_high (pin_B1);

delay_ms (500);

output_low (pin_B1);

delay_ms (500);

output_high (pin_B1);

///////////////////////////////////////////////////////////////////////////////

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1 ); // liga timer1 pelo clock interno

// preescaler: ciclo de maquina dividido por 1 neste caso

setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_256); // liga timer0 pelo clock interno

//preescaler: ciclo de maquina dividido por 256 neste caso

///////////////////////////////////////////////////////////////////////////////

enable_interrupts (INT_TIMER0); // Libera a interrupção de estouro do Timer0

// timer0 overflow

enable_interrupts(INT_RB); // Libera as interrupções por mudança de estado no

// Port B = Pinos B4 -> B7

enable_interrupts(GLOBAL); // Libera o registrador de interrupção global

// Permite que as interrupçoes funcionem

///////////////////////////////////////////////////////////////////////////////

while(true)

{

if ((a==1) & (sync==1))

{

if ((pegatmr1>1800) & (pegatmr1<2500) & (a==1))

{

output_high (pin_A0);

output_low (pin_A1);

}

if ((pegatmr1>500) & (pegatmr1<1400) & (a==1))

{

output_low (pin_A0);

output_high (pin_A1);

}

if ((pegatmr1>1450) & (pegatmr1<1750) & (a==1))

{

output_low (pin_A0);

output_low (pin_A1);

}

a=2;

sync=0;

}

///////////////////////////////////////////////////////////////////////////////

if ((a==2) & (sync==1))

{

if ((pegatmr1_2>1800) & (pegatmr1_2<2500) & (a==2))

{

output_high (pin_A2);

output_low (pin_A3);

}

if ((pegatmr1_2>500) & (pegatmr1_2<1400) & (a==2))

{

output_low (pin_A2);

output_high (pin_A3);

}

if ((pegatmr1_2>1450) & (pegatmr1_2<1750) & (a==2))

{

output_low (pin_A2);

output_low (pin_A3);

}

a=1;

sync=0;

}

}

}

Postado

Alguma coisa no seu código não está claro...

Onde ficam as funções get_timer1() e set_timer1() ? Elas são de alguma biblioteca? E o tratamento de interrupção deste timer, onde está? Só vio do timer 0, que pelo que parece faz a sincronização.

Postado

então! é o seguinte! essa programaçao eu consegui com um colega meu, pois nao manjo mt de programaçao. manjo mais no outro tipo de linguagem c, aquela de você coloca:

delay (5000)

f1=.....

e estou tentando fazer um circuito que receba um sinal pwm, por um controle futaba, e fazer mandar um sinal de 5V para uma ponte h, assim acionando um reles para locomover o robô, fazendo as devidas inversoes neles.

obrigado!:D

Arquivado

Este tópico foi arquivado e está fechado para 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...