Aqui les dejo el codigo del control del movimiento del cacharrito del servo y el motor. Tengo algunas dudas asi que me encantaría que le echarán un ojo y comentaran consejos posibles mejoras, etc....
Les comentos por encima: El portA es de entrada, donde los cuatro primeros bits indican la velocidad que nos servira para calcular el duty necesario para aplicarlo al motor. Los dos ultimos bits del mismo puerto indican la dirección del servo. Mis dudas son (lo tienen indicado en la linea de programa):
1. cada vez que haya un cambio de dirección, quiero que el motor dc se pare, empezar a meter pulsos al servo y despues de un tiempo volver a conectar el motor. Como ven eso ya lo he conseguido, el problema es que se me para siempre que sale del bucle incluso cuando hay un cambio de velocidad, cosa que no quiero.
2. En el instante que el cacharrito debe ir hacia atras, la posicion del servo es recto (la correcta), pero el pwm que le meto al motor, no se.... asi como lo tengo supongo ira hacia delante o dependiendo del duty.... No lo tengo claro.
Un apunte final, los bits de entrada del port a son los que tendra que mandar el otro pic mediante la comunicacion de los mismos.
Ahi va el codigo:
#include <16F876.H>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use Delay(Clock=4000000)
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5 // Identificador asociado al registro de dirección 5
#byte port_b = 6 // Identificador asociado al registro de dirección 6
#byte port_c = 7 // Identificador asociado al registro de dirección 7
void main(void){
set_tris_a(0b111111); //PortA entrada
set_tris_b(0b00100000); //RB5 es entrada de on / off
set_tris_c(0b0000000); //PortC salida
int x, xx, y, dutycalculado, n;
setup_timer_2(T2_DIV__BY_16,249,1) // Div=16 ; PR2=249 ; Postscale=1
setup_CCP1(CCP_PWM) //Configuguro PWM
while (1)
{
while (input(PIN_B5))
{
x=port_a // Leo estado del puerto
xx=0b110000 & x // And lógica para ver estado de los bits que me marcan la direccion
y=0b001111 & x // And logica para ver estado de los bits de velocidad
dutycalculado=y/(16*(1/4000000)) // Calculamos duty
while(x==port_a) // mientras no haya cambios (direccion o velocidad)
{
port_c=0x00 //AQUI TENGO DUDAS!!!!!!!!!!!!!!!!!!!
switch(xx)
{
case 0: //recto
output_high (pin_c1)
delay_us (1200)
output_low (pin_c1)
delay_us (18800)
for (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
case 16: //derecha
output_high (pin_c1)
delay_us (1733.333)
output_low (pin_c1)
delay_us (18266.667)
for (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
case 32: //izquierda
output_high (pin_c1)
delay_us (666.666)
output_low (pin_c1)
delay_us (19333.333)
or (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
case 48: //atras ?????????? Como hago que vaya hacia atras
output_high (pin_c1)
delay_us (1200)
output_low (pin_c1)
delay_us (18800)
for (n=0;1;1)
{
delay_ms(2000)
set_pwm1_duty(dutycalculado)
}
break;
}
}
}
}
}
Gracias Pocher.