Hola sergio, me parece que el adjunto ultimo no estan bien, dejaria el que pusiste en el post nº32
Por otra parte:
Basandonosen las propuesta: de posibles mejoras:
1º Parar el motor en un momento indeterminado y que al querer que vuelva a funcionar, el sistema arranque con el tiempo y ciclo donde se encontraba al pararse.
2º Que este siempre bajo tension y que el equipo se ponga en marcha cuando el operario realice unas determinadas operaciones.
Para poder realizarlo correctamente vamos a utilizar las interrupciones, de esa manera podremos estra cheqeando constantemente el estado de la entrada que tenemos en el bit 2. resumiendo y según tu programa tenemos hasta ahora:
Bit0= motor_izquierda
Bit1= motor_derecha
Bit2= Marcha_paro
Partiremos de que daremos tension(5V) al equipo, pero no se activará todavía ningun sentido de giro del motor debido a que el operario puede tener alguna puerta abierta y/o estar realizando alguna operación. Hecho lo cual querra empezar arelaizar su ciclo y para eso debera de poner =1 (5V) el bit2(marcha-paro).
Una vez realizado esto empiezan los ciclos hasta que el operario quiera pararlos en cualquier momento después continuar otra vez por lo que se guardaran los tiempos y se continuaran desde el punto en que se paró.
Para usar el uso de interrupciones: El pic tiene dos “contadores” que son el TMR0 y el TMR1, el primero de 8bits y el segundo de 16 bits. Para comenzar utilizaremos el TMR0, aunque por los tiempos que necesitas seria mas comodo el utilizar el TMR1. Despues de puede cambiar con unos pequeños ajustes.
El TMR0 es un contador ascendente que cuando su valor pasa de FFFFFFFF a 00000000, el pic activa un bit del registro de control del TMR0 llamado T0IF. Bueno pues si se controla adecuadamente ese bit podremos controar el tiempo mediante el uso de interrupciones.
Debes mirar el dataste, la parte de configuración del TMR0 y comprobaras que tambien tiene un predivisor, por lo que si se utiliza el predivisor de 1/256 con un reloj de 4MHz y cargamos el TMRO con un valor de 0000000 vamos a obtener un retardo maximo de 65,536msg.(tosc/4*predivisor*256-valor de TMR0; 1usg*256*256=65536usg=65,536sg)
Como veras hasta conseguir los 120sg se necesitaran algunos registros auxiliares hasta alcanzar los 120Sg.Podemos realizar algo as:
Para el tiempo de 20sg se necesitan 2 registros: cuenta1(contaran 256veces) y conta2 que contara 305-256=49 ya que 20sg/0,065536=305 veces
Para el tiempo de 150sg entonces se deben de producir 7 veces las cuentas anteriores. Luego podemos utilizar otro registro conta3.
Estos valores habria que utilizarlos si se carga el TMR0 con el valor 00000000, pero se tienen errores debido a que al realizar los calculos las divisiones no salen justas. Por tanto para tener unos valores más exactos tendremos que cargar el TMR0 con el valor de 61. Con esto el TMR0 se desbordara cada 49,92msg. Luego:
-TMR0=61
-cuenta1=0 (256 veces TMR0)
-cuenta2=145
Bueno después de la explicación tecnica que espero que comprendas, vamos a la practica. Si partimos de tiu programa el que te dije que funcionaba se debe modificar y quedar de la siguiente forma:
1º Configurar el puerto como xxxxxESS
2º Dar nombres a los bits del puerto
3º Yo dejaria las salidas de los motores desconectados.
4º Crear los registros de “cuenta” y asignarlo los valores.
5º Configurar el TMR0
6º Configurar la interrupcion del TMR0
7º Cargar el valor del TMR0
8º Comprobar si marcha_paro= 1. Si es asi activo el motor_izquiero y si es=0 no hag nada y espero hasta que se active esa señal.
9º Crear tu rutina de interrupcion del TMR0.
Haber si llegas hasta aquí, y realizas la rutina de interrupcion y ya seguiremos……………….