sábado, 10 de julio de 2010

Control motor PaP Bipolar con CCS e "interrupcion" por USART programado en Linux

Como es sabido el uC PIC16F84A no cuenta con USART, sin embargo para controlar un motor de pasos bipolar en posición bidireccional, podemos usar un pequeño artilugio para hacer responder a una interrupcion al PIC, usando el protocolo rs232

bueno el codigo fuente es el siguiente

#include <16F84a.h>

#fuses XT,NOWDT

#use delay (clock=4000000)

//#use fixed_io(b_outputs=pin_b3)

//#use fixed_io(a_outputs=pin_a0,pin_a1,pin_a2,pin_a3)



#use rs232(xmit=PIN_B3,rcv=PIN_A4,bits=8)



//variables globales

int1 flagA=FALSE, flagB=FALSE;

int value=50;

//Interrupciones

#INT_EXT

void int_rb0(void){

char letra;

disable_interrupts(GLOBAL);

delay_ms(10);

letra=getc();

letra= toupper(letra);

switch(letra){

case 'D':printf("Derecha\r\n");

flagA=TRUE;

flagB=FALSE;

break;

case 'I':printf("Izquierda\r\n");

flagA=FALSE;

flagB=TRUE;

break;

}

enable_interrupts(GLOBAL);

}



//prototipos

void adelante(void);

void atras(void);







main(){

enable_interrupts(GLOBAL);

ext_int_edge(L_TO_H); //interrupcion en flanco de bajada

enable_interrupts(int_ext); //habilitada interrupcion Externa RB0

printf("Control de\n\r Motor de pasos Bipolar");

while(1){

if(flagA==TRUE)

adelante();

if(flagB==TRUE)

atras();

};

return 0;

}



void adelante(void){





Output_A(input_A()|0x05);

delay_ms(value);

Output_A(input_A()|0x06);

delay_ms(value);

Output_A(input_A()|0x0A);

delay_ms(value);

Output_A(input_A()|0x09);

delay_ms(value);

}





void atras(void){

Output_A(input_A()|0x09);

delay_ms(value);

Output_A(input_A()|0x0A);

delay_ms(value);

Output_A(input_A()|0x06);

delay_ms(value);

Output_A(input_A()|0x05);

delay_ms(value);

}


Aqui el circuito