Bueno espero me puedan ayudar, les cuento soy nuevo en lo que se refiere a programación en C, generalmente lo hacia en ASM, pero el programa que estoy haciendo es muy largo.
Bueno les cuento, tengo que controlar 3 motores paso a paso por medio de un teclado (matriz 4x4). El programa lo tengo hecho y compilado, ademas lo he simulado en el MPLAB y funciona de lo más bien. El problema es que cuando intento probarlo en el protoboard, no hace lo que debiera. He notado quie al parecer no incrementa unas variables que asigne como indice de tres arreglos que declare (de 8 pos. en donde se encuentran los valores para hacer mover el motor). Aqui se encuentra el programa:
Cuando presiono una tecla, es detectada y guardada en la variable "TECLA" ,
luego pasa a una sentencia "switch" que ejecuta un trozo de codigo dependiendo el valor de la variable "Tecla". Cuando ingresa a este código, dentro de el se encuentran las variables de tipo indice para los arreglos "pos_y" , "pos_x" y "pos_z".
estas variables en el MPLAB se incrementa, pero cuando implemento el circuito parece ser que no, ya que ya que el puerto C no cambia su valor.
espero alguien me pueda ayudar.
saludos.
#define pb 0xf0
#define pc 0x00
#define pd 0xff
#define pa 0xf0
void main()
{
int tecla=0, col=0,aut, temp, scan=0xff;
int velocidad, pos_z=0;
int paso_m;
int pos_x=0, pos_y=0;
int tabla_mx[8]={0x01, 0x03, 0x02, 0x06,0x04, 0x0c, 0x08, 0x09};
int tabla_my[8]={0x10, 0x30, 0x20, 0x60,0x40, 0xc0, 0x80, 0x90};
int tabla_mz[8]={0x01, 0x03, 0x02, 0x06,0x04, 0x0c, 0x08, 0x09};
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_a(pa);
set_tris_b(pb);
set_tris_c(pc);
set_tris_d(pd);
set_tris_e(0xff);
port_b_pullups(true);
#use delay(clock=20000000)
#use fast_io(B)
#use fast_io(C)
#use fast_io(A)
velocidad=100;
inicio: aut=input_a();
#asm
bcf 0x03, 0x05
bcf 0x03, 0x06
clrf 0x05
clrf 0x07
#endasm
if( bit_test(aut,4)==0 )
{
do
{
bit_clear(scan,col);
/*Pone a cero
el n° de bit, segun dato en variable col */
#asm
bcf 0x03, 0x05
bcf 0x03, 0x06
movf scan,0
movwf 0x06
#endasm
delay_ms(50);
#asm
bcf 0x03, 0x05
bcf 0x03, 0x06
movf 0x06,0
movwf tecla
#endasm
switch (tecla)
{
case 0x7d: /* tecla 0 */
goto inc_col;
case 0xee:/* tecla 1 (+y) */
paso_m=tabla_my[pos_y]; temp=paso_m; delay_us(velocidad);
++pos_y;
if (pos_y==8) pos_y=0; /* tecla 1 (-x) */
paso_m=tabla_mx[pos_x];
paso_m=(temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
pos_x;
if (pos_x==0xff)
{pos_x=7;
goto inc_col;}
else goto inc_col;
case 0xed: /* tecla 2 (+y) */
paso_m=tabla_my[pos_y];
temp=paso_m;
paso_m=tabla_mx[pos_x];
paso_m=(temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
++pos_y;
if (pos_y==8) {pos_y=0;
goto inc_col;}
else goto inc_col;
case 0xeb:/* tecla 3 (+y) */
paso_m=tabla_my[pos_y];
temp=paso_m;
delay_us(velocidad);
++pos_y;
if (pos_y==8)
pos_y=0;
/* tecla 7 (+x) */
paso_m=tabla_mx[pos_x]; /* variables de arreglo*/
paso_m = (temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
++pos_x; /*aqui se incrementa*/
if (pos_x==8)
{pos_x=0;
goto inc_col;}
else
goto inc_col;
case 0xde: /* tecla 4 (-x) */
paso_m=tabla_mx[pos_x];
temp=paso_m;
paso_m=tabla_my[pos_y];
paso_m=(temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
-- pos_x;
if (pos_x==0xff)
{pos_x=7;
goto inc_col;}
else
goto inc_col;
case 0xdd: /* tecla 5 */
goto inc_col;
case 0xdb: /* tecla 6 (+x) */
paso_m=tabla_mx[pos_x];
temp=paso_m;
paso_m=tabla_my[pos_y];
paso_m=(temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
++pos_x;
if (pos_x==8)
{pos_x=0;
goto inc_col;}
else
goto inc_col;
case 0xbe:/* tecla 7 (-y) */
paso_m=tabla_my[pos_y];
temp=paso_m;
-- pos_y;
if (pos_y==0xff)
pos_y=7;
/* tecla 7 (-x) */
paso_m=tabla_mx[pos_x];
paso_m = (temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
-- pos_x;
if (pos_x==0xff)
{pos_x=7;
goto inc_col;}
else
goto inc_col;
case 0xbd:
/* tecla 8 (-y) */
paso_m=tabla_my[pos_y];
temp=paso_m;
paso_m=tabla_mx[pos_x];
paso_m=(temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
-- pos_y;
if (pos_y==0xff)
{pos_y=7;
goto inc_col;}
else
goto inc_col;
case 0xbb:/* tecla 9 (+x) */
paso_m=tabla_mx[pos_x];
temp=paso_m;
++pos_x;
if (pos_x==8)
pos_x=0;
/* tecla 9 (-y) */
paso_m=tabla_my[pos_y];
paso_m = (temp ^ paso_m);
output_c(paso_m);
delay_us(velocidad);
-- pos_y;
if (pos_y==0xff)
{pos_y=7;
goto inc_col;}
else
goto inc_col;
case 0x7e: /* tecla A */
goto inc_col;
case 0x7b: /* tecla B */
goto inc_col;
case 0x77: /*tecla F4 -z */
paso_m=tabla_mz[pos_z];
output_a(paso_m);
delay_us(velocidad);
-- pos_z;
if (pos_z==0xff)
{pos_z=7;
goto inc_col;}
else
goto inc_col;
case 0xb7:/* tecla F3(+z) */
paso_m=tabla_mz[pos_z];
output_a(paso_m);
delay_us(velocidad);
++pos_z;
if (pos_z==8)
{pos_z=0;
goto inc_col;}
else
goto inc_col;
case 0xd7: /* tecla F2 decrementa velocidad motor */
velocidad=read_eeprom(1);
--velocidad;
delay_ms(100);
write_eeprom(0,velocidad);
goto inc_col;
case 0xe7:/* tecla F1 aumentavelocidad motor */
velocidad=read_eeprom(1);
++velocidad;
delay_ms(100);
write_eeprom(0,velocidad);
}
inc_col: bit_set(scan,col);
++col;
}
while (col!=4);
col=0;
goto inicio;
}
}