Boas pessoal! mais uma vez preciso da vossa ajuda. Eu nem sei se é bem aqui que tenho de postar o problema porque nao sei se o problema é da PIC se é da electrónica :confused:
Bem é o seguinte. Tenho um projecto que o objectivo é movimentar uma grua. Para isso utilizo motores de passo e um motor continuo (para fazer descer e subir um objecto). os motores de passo são alimentados a 24V e o motor continuo a 3V e a PIC a 5V, logo tenho 3 fontes para isso. mas agora estou aqui com uma problema que não me deixa fazer nada, quando estou a trabalhar com a grua a PIC reinicia. tenho todas as massas interligadas, também tenho no circuito dois reles que fazes a inversão de sentido do motor continuo. Alguém tem alguma ideia do que possa provocar isto?
Deixo aqui o código da PIC pode ajudar.
#include <16f877A.h>
#fuses XT, NOWDT, NOPROTECT, PUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use FAST_IO(A) // portA sob meu controle
#use FAST_IO(B) // portB sob meu controle
#use FAST_IO(C) // portC sob meu controle
#use FAST_IO(D) // portD sob meu controle
#use FAST_IO(E) // portE sob meu controle
#byte porta = 5 // endereco do port a
#byte portb = 6 // endereco do port b
#byte portc = 7 // endereco do port c
#byte portd = 8 // endereco do port d
#byte porte = 9 // endereco do port e
char rcv_pc;
char motor1[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000};
char motor2[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000};
int ct_motor1 = -1;
int ct_motor2 = -1;
int estado_subir=0;
int estado_descer=0;
void motors(char passo);
int posicao_rotacao();
int posicao_curso();
void iman();
void main()
{
set_tris_a(0b00000000);
set_tris_b(0b00000000);
set_tris_c(0b10000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
printf("Comunicacao RS232 com exito");
porta = 0b00000000;
portb = 0b00000000;
portd = 0b00000000;
porte = 0b00000000;
while(true)
{
rcv_pc = getchar();
if(rcv_pc == 'c')
{
iman();
}
else if(rcv_pc == 'r')
{
reset_cpu();
}
else
{
motors(rcv_pc);
}
}
}
void motors(char passo)
{
switch(passo)
{
case 'q': //motor principal andar para a esquerda
{
if(ct_motor1 == 3)
ct_motor1 = -1;
++ct_motor1;
portb = motor1[ct_motor1];
printf("-rodouP-");
//delay_ms(20);
break;
}
case 'w': //motor principal andar para a direita
{
if(ct_motor1 == 0 || ct_motor1 == -1)
ct_motor1 = 4;
--ct_motor1;
portb = motor1[ct_motor1];
printf("-rodouP-");
//delay_ms(20);
break;
}
case 'a': //motor secundario andar para a traz
{
if(posicao_curso() != 1)
{
if(ct_motor2 == 0 || ct_motor2 == -1)
ct_motor2 = 4;
--ct_motor2;
porta = motor2[ct_motor2];
printf("-rodouS-");
//delay_ms(20);
}
break;
}
case 's': //motor secundario andar para a frente
{
if(posicao_curso() != 2)
{
if(ct_motor2 == 3)
ct_motor2 = -1;
++ct_motor2;
porta = motor2[ct_motor2];
printf("-rodouS-");
//delay_ms(20);
}
break;
}
case 'e': //motor terceario andar para a cima
{
if(input(PIN_E1)==0)
{
if(estado_subir == 0)
{
output_high(PIN_E0);
estado_subir = 1;
printf("subir ON ");
}
else
{
output_low(PIN_E0);
estado_subir = 0;
printf("subir OFF ");
}
}
else
printf("descer ON ");
break;
}
case 'd': //motor terceario andar para a baixo
{
if(input(PIN_E0)==0)
{
if(estado_descer == 0)
{
output_high(PIN_E1);
estado_descer = 1;
printf("descer ON ");
}
else
{
output_low(PIN_E1);
estado_descer = 0;
printf("descer OFF ");
}
}
else
printf("subir ON ");
break;
}
}
}
int posicao_rotacao()
{
if(input(PIN_D0) == 1)
{
printf("-0-");
//delay_ms(10);
return 1;
}
else if(input(PIN_D2) == 1)
{
printf("-90-");
//delay_ms(10);
return 1;
}
else if(input(PIN_D3) == 1)
{
printf("-180-");
//delay_ms(10);
return 1;
}
else if(input(PIN_D4) == 1)
{
printf("-270-");
//delay_ms(10);
return 1;
}
else
return 0;
}
int posicao_curso()
{
if(input(PIN_D5) == 1)
{
printf("-traz-");
//delay_ms(10);
return 1;
}
else if(input(PIN_D6) == 1)
{
printf("-frente-");
//delay_ms(10);
return 2;
}
else
{
return 0;
}
}
void iman()
{
if(input(PIN_E2))
{
output_low(PIN_E2);
printf("-iman OFF-");
}
else
{
output_high(PIN_E2);
printf("-iman ON-");
}
}