Autor Tema: Mini curso "Programación en XC8"  (Leído 588175 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #375 en: 21 de Diciembre de 2015, 12:48:47 »
Gracias de nuevo por sus respuestas, estos 5 segundos es tiempo de espera antes de iniciar la pelea el cual el robot  no hace nada mas que esperar que pasen los 5 segundos, por lo cual creo se puede hacer con un delay.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #376 en: 21 de Diciembre de 2015, 19:10:28 »
Avanzando pero poco a poco, de esta manera me funciona el inicio pero ¿Es la forma correcta de hacerlo?
Código: C
  1. #define _XTAL_FREQ 20000000
  2. #include <xc.h>
  3. #include "config.h"
  4. #include <delays.h>
  5.  
  6. /*
  7.  *
  8.  */
  9.  
  10. unsigned char i=0;  //Variable usada en la temporizacion
  11.  
  12. void main(void)
  13. {
  14. /* CONFIGURACION DE PINES */
  15.     ADCON1bits.PCFG3 = 1;   //Configuramos
  16.     ADCON1bits.PCFG2 = 1;   //RA0:RA1 analogicos
  17.     ADCON1bits.PCFG1 = 0;   //el resto de pines
  18.     ADCON1bits.PCFG0 = 1;   //digitales
  19.     TRISAbits.RA2 = 1;  //Configuramos RA2 como entrada
  20.     TRISAbits.RA3 = 0;  //Configuramos RA3 como salida
  21.     LATA3 = 0;  //Empezamos con el robot parado
  22.    
  23. /* COMPRUEBA PULSADOR Y DE SER LIBERADO EMPIEZA TEMPORIZACION */
  24.     while(1)
  25.     {
  26.         while(!PORTAbits.RA2 == 1)
  27.         {
  28.             //Bucle para delay de 5 segundos
  29.             for(i=0; i<=10; i++)
  30.             {
  31.                 Delay10KTCYx(226);
  32.             }
  33.             LATA3 = 1;  //Inicia el escaneo del tatami
  34.         }
  35.         LATA3 = 0;  //Robot parado
  36.     }
  37. }

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Mini curso "Programación en XC8"
« Respuesta #377 en: 21 de Diciembre de 2015, 20:51:50 »
Hola Miguel, no tengo la hoja de datos a mano (escribo desde el móvil), así que no me voy a meter si has configurado bien los pines.

Pero por ejemplo, primero (supongo que el pulsador tiene lógica positiva) el programa comienza, y estara poniendo el LATA3 a 0 constantemente hasta que se pulse el pulsador.

Este método no evita los rebotes por lo tanto, la pulsación deberá de durar menos de 5 segundos o volverá a entrar.

Cuando pulsas, se hace la espera, y se pone LATA3 a 1, lo malo es que inmediatamente después se pondrá a 0 al salir del bucle while y el robot se parara tan pronto como empiece a moverse. Por lo tanto te recomiendo el uso de banderas, para ir marcando cuando empieza a escanear, cuando termina etc.

Delay10KTCYx(226);

Esta instrucción no la había visto nunca, pero supongo que tu la conoces y la has calculado bien, pero veo mas intuitiva delay_ms().

Te recomiendo también meter la variable i dentro del main si no la vas a usar en otros ficheros.

Y que hagas un define para el pin RA2, le puedes llamar "pulsador" por ejemplo, luego s mas fácil para leer el código, por ejemplo el while seria:

while(!pulsador)

Estas últimas cosas solo son consejos pero que son de buena práctica.

Pero el problema del LATA3 debes arreglarlo.

Un saludo.





Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #378 en: 21 de Diciembre de 2015, 22:01:21 »
Yo no voy a hablar del codigo todavia, solo voy a decir que no se puede darte una muy buena respuestas por que todavia no has especificado exactametne que debe hacer el robot. El estado que estabam si debe responder a algo mas, si debe repetirse eso la condicion de pelea mientras pasan por otras partes del programa, etc.
Hasta que no puedas definir exactamente todas las variables , condiciones, estados que puedas tener es imposible darte una solucion que finalmente satisfaga tu necesidad.


Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #379 en: 22 de Diciembre de 2015, 05:42:52 »
Buenos días, vamos a intentar explicar la idea:
Una vez colocados los robots en el Dohyo (tatami) mantienes pulsado el switch de inicio hasta que se de el aviso para empezar el combate, momento en el cual se suelta el switch para empezar a contar los 5 segundos reglamentarios cosa que solo ocurre al principio de cada combate, motivo por el cual creo que esta temporización puede hacerse por delay ya que el robot no hace nada mas que esperar que pasen los 5 segundos. Una vez transcurridos los 5 segundos el robot debe empezar a moverse y intentar localizar al oponente a través de los sensores y una vez localizado empujarlo hasta sacarlo fuera del dohyo.
Delay10KTCYx(226);

Esta instrucción no la había visto nunca, pero supongo que tu la conoces y la has calculado bien, pero veo mas intuitiva delay_ms().
Hola Juan José te dejo como funciona dicha instrucción, no entiendo que quieres decir con que Cuando pulsas, se hace la espera, y se pone LATA3 a 1, lo malo es que inmediatamente después se pondrá a 0 al salir del bucle while y el robot se parara tan pronto como empiece a moverse ¿No puede estar todo el código dentro de dicho bucle? con el código que he dejado en el post anterior y colocando un led en el lugar del motor una vez transcurrido el tiempo de espera dicho led se enciende y no vuelve a apagarse hasta que no quitas la alimentación al circuito.
Voy a seguir tus consejos con los defines y la variable.

Gracias.
* Retardos.pdf
(23.48 kB - descargado 1148 veces)
« Última modificación: 22 de Diciembre de 2015, 05:47:43 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Mini curso "Programación en XC8"
« Respuesta #380 en: 22 de Diciembre de 2015, 08:58:58 »
hola miguel, puedes meter todo en el bucle while, pero eso no es una forma adecuada de hacer las cosas, recuerda, que funcione no quiere decir que este bien.

te recomiendo que pienses en tu sistema como una maquina de estados y no de una forma secuencial. Es como están pensados muchisimos programas, y por ejemplo si utilizas las harmony para generar el código, te crea automaticamente una maquina de estados.

te ayuda a estructurar la manera de pensar y te puede ayudar a hacerte una mejor idea, y ha utilizar las banderas para cambiar de los estados, mediante condiciones if o switch case.

el robot siempre debe de estar en un estado.

(lo he hecho en paint xd :D :D, y ademas de manera muy resumida con solo 3 estados)


* Estados.png
(15.57 kB, 759x542 - visto 808 veces)



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #381 en: 22 de Diciembre de 2015, 11:13:09 »
Bueno cambio un poco el panorama, ahora decis que cuando se suelte espere los 5s. Esto puede traer aparejado un par de problemas por los rebotes, por que se toca y se suelta etc.

La forma de hacerlo con un delay va a implicar que apenas se detecte un cambio peuda dispararse el tema del robot, imaginate un menor teniendo el boton que se mueve de un lado para el otro y que por ahi el boton no haga contacto como debe podria suceder. y deberia reiniciarse el tiempo. Si se presiona nuevamente dentro de los 5 segundos que pasaria ?

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #382 en: 22 de Diciembre de 2015, 11:58:26 »
Gracias a los dos, a seguir estudiando y buscar la manera de hacerlo para que funcione correctamente, en un principio el arranque, pero si eso ya se me complica no quiero ni pensar el la estrategia del combate.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Mini curso "Programación en XC8"
« Respuesta #383 en: 22 de Diciembre de 2015, 12:08:24 »
Gracias a los dos, a seguir estudiando y buscar la manera de hacerlo para que funcione correctamente, en un principio el arranque, pero si eso ya se me complica no quiero ni pensar el la estrategia del combate.

Saludos!

los primeros pasos son dificiles, luego se te va haciendo la forma de pensar y te va resultando cada vez mas facil, animo ;-)

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #384 en: 23 de Diciembre de 2015, 05:49:13 »
te recomiendo que pienses en tu sistema como una maquina de estados y no de una forma secuencial. Es como están pensados muchisimos programas, y por ejemplo si utilizas las harmony para generar el código, te crea automaticamente una maquina de estados.
Estoy empezando a mirar lo de las maquinas de estado y se ve una cosa interesante, había oído sobre ellas pero nunca hacer uso de ellas, lo de las harmony podéis aconsejarme algún software para probar.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Mini curso "Programación en XC8"
« Respuesta #385 en: 23 de Diciembre de 2015, 07:23:53 »
Perdona Miguel me explique mal, lo de las harmony era solo un ejemplo, creo que de momento solo se pueden usar en pic32, pero nada te impide hacer un ejemplo con xc32 y harmony y estudiarlo, aunque no te lo recomiendo porque es un generador de código y ya sabemos lo que pasa con eso, además la maquina de estados que hace es muy liosa hay muchas mas maneras de hacer una maquina de estados.

Hay muchos ejemplos sencillitos, si quieres puedo buscarte algún ejemplo o hacerte algún ejemplo para que lo veas.

Una maquina de estados compleja, lleva muchas veces el uso de tablas y normas para no dejarte ninguna condicion ni estado. Pero es una muy buena técnica de programación para muchos casos.

Un saludo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #386 en: 23 de Diciembre de 2015, 09:14:40 »
Precisamente lo preguntaba porque solo habia encontrado para XC32, de todos modos voy a estudiarme lo de la maquina de estados y buscar ejemplos.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #387 en: 25 de Diciembre de 2015, 15:21:59 »
Hola estoy intentando lo de la maquina de estados finitos y no me funciona y no consigo ver el porque:
Código: C
  1. #define _XTAL_FREQ 20000000
  2. #include <xc.h>
  3. #include "config.h"
  4. #include <delays.h>
  5.  
  6. #define pulsador_ini   PORTAbits.RA2  //pulsador_ini conectado en RA2
  7. #define motor_izq   PORTAbits.RA3  //motor izquierdo conectado en RA3
  8. #define motor_dcho  PORTAbits.RA4  //motor derecho conectado en RA4
  9.  
  10. /* DECLARACION DE FUNCIONES */
  11. void pausa_5seg(void);
  12.  
  13. /* ENUMERAMOS LOS TIPOS DE ESTADOS */
  14. enum eEstados{
  15.     Detenido,Inicio
  16. }estado;
  17.  
  18. /* FUNCION PRINCIPAL */
  19. void main(void)
  20. {
  21. /* CONFIGURACION DE PINES */
  22.     ADCON1bits.PCFG3 = 1;   //Configuramos
  23.     ADCON1bits.PCFG2 = 1;   //RA0:RA1 analogicos
  24.     ADCON1bits.PCFG1 = 0;   //el resto de pines
  25.     ADCON1bits.PCFG0 = 1;   //digitales
  26.     TRISAbits.RA2 = 1;  //Configuramos RA2 como entrada
  27.     TRISAbits.RA3 = 0;  //Configuramos RA3 como salida
  28.     TRISAbits.RA4 = 0;  //Configuramos RA4 como salida
  29.    
  30.     //estado = Detenido;  //Empezamos con el robot parado
  31.    
  32.     while(1)
  33.     {
  34.         switch(estado)
  35.         {
  36.             case Detenido:
  37.                 if(pulsador_ini == 0){
  38.                 motor_izq = 0;
  39.                 motor_dcho = 0;
  40.                 }
  41.             break;
  42.                
  43.             case Inicio:
  44.                 if(pulsador_ini){
  45.                     pausa_5seg();
  46.                 }
  47.                 motor_izq = 1;
  48.                 motor_dcho = 1;
  49.             break;
  50.         }
  51.     }
  52. }
  53.  
  54. void pausa_5seg(void){
  55.     unsigned char i = 0;
  56.     for(i=0; i<=10; i++){
  57.         Delay10KTCYx(226);
  58.     }
  59. }

Gracias.
« Última modificación: 25 de Diciembre de 2015, 16:54:08 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re:Mini curso "Programación en XC8"
« Respuesta #388 en: 25 de Diciembre de 2015, 16:39:41 »
Hola estoy intentando lo de la maquina de estados finitos y no me termina de funcionar como debería, con este código:
Código: C
  1. #define _XTAL_FREQ 20000000
  2. #include <xc.h>
  3. #include "config.h"
  4. #include <delays.h>
  5.  
  6. #define pulsador_ini   PORTAbits.RA2  //pulsador_ini conectado en RA2
  7. #define motor_izq   PORTAbits.RA3  //motor izquierdo conectado en RA3
  8. #define motor_dcho  PORTAbits.RA4  //motor derecho conectado en RA4
  9.  
  10. /* ENUMERAMOS LOS TIPOS DE ESTADOS */
  11. enum eEstados{
  12.     Detenido
  13. }estado;
  14.  
  15. /* FUNCION PRINCIPAL */
  16. void main(void)
  17. {
  18.     unsigned char i=0;  //Variable usada en la temporizacion de 5 segundos
  19.    
  20. /* CONFIGURACION DE PINES */
  21.     ADCON1bits.PCFG3 = 1;   //Configuramos
  22.     ADCON1bits.PCFG2 = 1;   //RA0:RA1 analogicos
  23.     ADCON1bits.PCFG1 = 0;   //el resto de pines
  24.     ADCON1bits.PCFG0 = 1;   //digitales
  25.     TRISAbits.RA2 = 1;  //Configuramos RA2 como entrada
  26.     TRISAbits.RA3 = 0;  //Configuramos RA3 como salida
  27.     TRISAbits.RA4 = 0;  //Configuramos RA4 como salida
  28.    
  29.     estado = Detenido;  //Empezamos con el robot parado
  30.    
  31.     while(1)
  32.     {
  33.         switch(estado)
  34.         {
  35.             case Detenido:
  36.                 if(pulsador_ini)
  37.                 {
  38.                     for(i=0; i<=10; i++)
  39.                     {
  40.                         Delay10KTCYx(226);
  41.                     }
  42.                         motor_izq = 1;
  43.                         motor_dcho = 1;
  44.                 }else{
  45.                     motor_izq = 0;
  46.                     motor_dcho = 0;
  47.                 }
  48.             break;
  49.            
  50.             default:
  51.                 Detenido;
  52.                 break;
  53.         }
  54.     }
  55. }
me pasa que si antes de alimentar el circuito mantengo pulsado el switch de inicio y después lo alimento, hasta que no lo dejo de pulsar los motores permanecen parados, pero si doy corriente al circuito sin mantener el pulsador los motores se alimentan al momento como si entrara en el if pero sin contar los 5 segundos, y lo siento pero no veo el error.

Gracias.

Ha probado con apagar los motores antes de entrara al ciclo while(1), es decir antes de entrar el while poner
 motor_izq = 0;
 motor_dcho = 0;

los pines del micro no empiezan necesariamente en cero.

Por cierto, si esta usando un PIC18F debe utilizar el registro LATA si los pines estan configurados como salida

Saludos,
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #389 en: 25 de Diciembre de 2015, 17:02:07 »
Hola sander lo siento pero te has dado mas prisa tu en contestar que yo modificar el codigo  :D ahora estoy probando este codigo pero ni siquiera enciende los led's que tengo conectados en el lugar de los motores.

Código: C
  1. #define _XTAL_FREQ 20000000
  2. #include <xc.h>
  3. #include "config.h"
  4. #include <delays.h>
  5.  
  6. #define pulsador_ini   PORTAbits.RA2  //pulsador_ini conectado en RA2
  7. #define motor_izq   LATA3  //motor izquierdo conectado en RA3
  8. #define motor_dcho  LATA4 //motor derecho conectado en RA4
  9.  
  10. /* DECLARACION DE FUNCIONES */
  11. void pausa_5seg(void);
  12.  
  13. /* ENUMERAMOS LOS TIPOS DE ESTADOS */
  14. enum eEstados{
  15.     Detenido,Inicio
  16. }estado;
  17.  
  18. /* FUNCION PRINCIPAL */
  19. void main(void)
  20. {
  21. /* CONFIGURACION DE PINES */
  22.     ADCON1bits.PCFG3 = 1;   //Configuramos
  23.     ADCON1bits.PCFG2 = 1;   //RA0:RA1 analogicos
  24.     ADCON1bits.PCFG1 = 0;   //el resto de pines
  25.     ADCON1bits.PCFG0 = 1;   //digitales
  26.     TRISAbits.RA2 = 1;  //Configuramos RA2 como entrada
  27.     TRISAbits.RA3 = 0;  //Configuramos RA3 como salida
  28.     TRISAbits.RA4 = 0;  //Configuramos RA4 como salida
  29.    
  30.     //estado = Detenido;  //Empezamos con el robot parado
  31.    
  32.     while(1)
  33.     {
  34.         switch(estado)
  35.         {
  36.             case Detenido:
  37.                 if(pulsador_ini == 0){
  38.                 motor_izq = 0;
  39.                 motor_dcho = 0;
  40.                 }
  41.             break;
  42.                
  43.             case Inicio:
  44.                 if(pulsador_ini){
  45.                     pausa_5seg();
  46.                 }
  47.                 motor_izq = 1;
  48.                 motor_dcho = 1;
  49.             break;
  50.         }
  51.     }
  52. }
  53.  
  54. void pausa_5seg(void){
  55.     unsigned char i = 0;
  56.     for(i=0; i<=10; i++){
  57.         Delay10KTCYx(226);
  58.     }
  59. }

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.