#include <main.h>
#define RS_tam_max_buffer_in 15 // tamanho mلximo de um comando
#define motor1_1 PIN_D0
#define motor1_2 PIN_D1
#define motor1_3 PIN_D2
#define motor1_4 PIN_D3
#define motor2_1 PIN_D4
#define motor2_2 PIN_D5
#define motor2_3 PIN_D6
#define motor2_4 PIN_D7
#define motor3_1 PIN_C0
#define motor3_2 PIN_C1
#define motor3_3 PIN_C2
#define motor3_4 PIN_C3
void incrementa_motor1(void);
void decrementa_motor1(void);
void desliga_motor1(void);
void incrementa_motor2(void);
void decrementa_motor2(void);
void desliga_motor2(void);
void incrementa_motor3(void);
void decrementa_motor3(void);
void desliga_motor3(void);
void limpa_buffer(void);
BYTE RS_serial; // byte recebido da serial
signed int m1,m2,m3;
unsigned delay_m1, delay_m2, delay_m3;
int motor_passo1, motor_passo2, motor_passo3;
int conta_timer1, conta_timer2, conta_timer3;
unsigned int envio1,envio2;
int1 rs_inicio;
unsigned calc_temp;
#int_RDA
void RDA_isr(void)
{
RS_serial = getc()-' '; //lê byte da serial
if ( (RS_serial & 0b00100000) )
{
envio1 = RS_serial;
rs_inicio = true;
}
else
{
envio2 = RS_serial;
if ( rs_inicio )
{
rs_inicio = false;
calc_temp = (envio1 >> 2) & 0b00000011;
if ( envio1 & 0b00010000 ) {
// ré
m1 += calc_temp*4;
m2 += calc_temp*4;
}else{
// avante
m1 -= calc_temp*4;
m2 -= calc_temp*4;
};
calc_temp = (envio2 >> 2) & 0b00000011;
if ( envio2 & 0b00010000 ) {
// esquerda
m1 += calc_temp*4;
m2 -= calc_temp*4;
}else{
// direita
m1 -= calc_temp*4;
m2 += calc_temp*4;
};
calc_temp = envio2 & 0b00000011;
if ( envio1 & 0b0000010 ) {
// sobe
m3 += calc_temp*15;
}else{
// desce
m3 -= calc_temp*15;
};
}
}
clear_interrupt(INT_EXT); //limpa interrupçمo de serial
}
#int_TIMER1
void TIMER1_isr(void)
{
if (conta_timer1 < 6){
conta_timer1++;
if ( conta_timer1 == 11) desliga_motor1();
}
if (conta_timer2 < 6){
conta_timer2++;
if ( conta_timer2 == 11) desliga_motor2();
}
if (conta_timer3 < 3){
conta_timer3++;
if ( conta_timer3 == 11) desliga_motor3();
}
if ((conta_timer1 > 10)&&(conta_timer2 > 10)&&(conta_timer3 > 10) ){
disable_interrupts(INT_TIMER1);
}
}
void main()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
m1=0;
m2=0;
m3=0;
delay_m1=1;
delay_m2=1;
delay_m3=1;
rs_inicio = false;
while(true){
if ( delay_m1-- == 0){
delay_m1 = 25;
if (m1 > 0 ) { m1--; incrementa_motor1(); } else if (m1 < 0 ) { m1++; decrementa_motor1(); };
}
if ( delay_m2-- == 0){
delay_m2 = 25;
if (m2 > 0 ) { m2--; incrementa_motor2(); } else if (m2 < 0 ) { m2++; decrementa_motor2(); };
}
if ( delay_m3-- == 0){
delay_m3 = 5;
if (m3 > 0 ) { m3--; incrementa_motor3(); } else if (m3 < 0 ) { m3++; decrementa_motor3(); };
}
delay_ms(2);
};
}
void desliga_motor1(void){
conta_timer1=11;
output_low(motor1_1);
output_low(motor1_2);
output_low(motor1_3);
output_low(motor1_4);
}
void desliga_motor2(void){
conta_timer2=11;
output_low(motor2_1);
output_low(motor2_2);
output_low(motor2_3);
output_low(motor2_4);
}
void desliga_motor3(void){
conta_timer3=11;
output_low(motor3_1);
output_low(motor3_2);
output_low(motor3_3);
output_low(motor3_4);
}
void decrementa_motor1(void){
disable_interrupts(INT_TIMER1);
conta_timer1=0;
motor_passo1--;
if (motor_passo1 ==0) { motor_passo1 = 4;};
switch(motor_passo1)
{
case 1 :
output_high(motor1_1);
output_high(motor1_2);
output_low(motor1_3);
output_low(motor1_4);
break;
case 2 :
output_low(motor1_1);
output_high(motor1_2);
output_high(motor1_3);
output_low(motor1_4);
break;
case 3 :
output_low(motor1_1);
output_low(motor1_2);
output_high(motor1_3);
output_high(motor1_4);
break;
case 4 :
output_high(motor1_1);
output_low(motor1_2);
output_low(motor1_3);
output_high(motor1_4);
break;
}
enable_interrupts(INT_TIMER1);
}
void decrementa_motor2(void){
disable_interrupts(INT_TIMER1);
conta_timer2=0;
motor_passo2--;
if (motor_passo2 ==0) { motor_passo2 = 4;};
switch(motor_passo2)
{
case 1 :
output_high(motor2_1);
output_high(motor2_2);
output_low(motor2_3);
output_low(motor2_4);
break;
case 2 :
output_low(motor2_1);
output_high(motor2_2);
output_high(motor2_3);
output_low(motor2_4);
break;
case 3 :
output_low(motor2_1);
output_low(motor2_2);
output_high(motor2_3);
output_high(motor2_4);
break;
case 4 :
output_high(motor2_1);
output_low(motor2_2);
output_low(motor2_3);
output_high(motor2_4);
break;
}
enable_interrupts(INT_TIMER1);
}
void decrementa_motor3(void){
disable_interrupts(INT_TIMER1);
conta_timer3=0;
motor_passo3--;
if (motor_passo3 ==0) { motor_passo3 = 4;};
switch(motor_passo3)
{
case 1 :
output_high(motor3_1);
output_low(motor3_2);
output_low(motor3_3);
output_low(motor3_4);
break;
case 2 :
output_low(motor3_1);
output_high(motor3_2);
output_low(motor3_3);
output_low(motor3_4);
break;
case 3 :
output_low(motor3_1);
output_low(motor3_2);
output_high(motor3_3);
output_low(motor3_4);
break;
case 4 :
output_low(motor3_1);
output_low(motor3_2);
output_low(motor3_3);
output_high(motor3_4);
break;
}
enable_interrupts(INT_TIMER1);
}
void incrementa_motor1(void){
disable_interrupts(INT_TIMER1);
conta_timer1=0;
motor_passo1++;
if (motor_passo1 ==5) { motor_passo1 = 1;};
switch(motor_passo1)
{
case 1 :
output_high(motor1_1);
output_high(motor1_2);
output_low(motor1_3);
output_low(motor1_4);
break;
case 2 :
output_low(motor1_1);
output_high(motor1_2);
output_high(motor1_3);
output_low(motor1_4);
break;
case 3 :
output_low(motor1_1);
output_low(motor1_2);
output_high(motor1_3);
output_high(motor1_4);
break;
case 4 :
output_high(motor1_1);
output_low(motor1_2);
output_low(motor1_3);
output_high(motor1_4);
break;
}
enable_interrupts(INT_TIMER1);
}
void incrementa_motor2(void){
disable_interrupts(INT_TIMER1);
conta_timer2=0;
motor_passo2++;
if (motor_passo2 ==5) { motor_passo2 = 1;};
switch(motor_passo2)
{
case 1 :
output_high(motor2_1);
output_high(motor2_2);
output_low(motor2_3);
output_low(motor2_4);
break;
case 2 :
output_low(motor2_1);
output_high(motor2_2);
output_high(motor2_3);
output_low(motor2_4);
break;
case 3 :
output_low(motor2_1);
output_low(motor2_2);
output_high(motor2_3);
output_high(motor2_4);
break;
case 4 :
output_high(motor2_1);
output_low(motor2_2);
output_low(motor2_3);
output_high(motor2_4);
break;
}
enable_interrupts(INT_TIMER1);
}
void incrementa_motor3(void){
disable_interrupts(INT_TIMER1);
conta_timer3=0;
motor_passo3++;
if (motor_passo3 ==5) { motor_passo3 = 1;};
switch(motor_passo3)
{
case 1 :
output_high(motor3_1);
output_low(motor3_2);
output_low(motor3_3);
output_low(motor3_4);
break;
case 2 :
output_low(motor3_1);
output_high(motor3_2);
output_low(motor3_3);
output_low(motor3_4);
break;
case 3 :
output_low(motor3_1);
output_low(motor3_2);
output_high(motor3_3);
output_low(motor3_4);
break;
case 4 :
output_low(motor3_1);
output_low(motor3_2);
output_low(motor3_3);
output_high(motor3_4);
break;
}
enable_interrupts(INT_TIMER1);
}
void limpa_buffer(void){
RS_serial = 0;
envio1 = 0;
envio2 = 0;
}