Autor Tema: Problema con programita en CCS  (Leído 9260 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con programita en CCS
« Respuesta #15 en: 19 de Octubre de 2010, 19:08:18 »
Hola soymoe, una de las cosas interesantes al hacer programas es entenderlos, no simplemente ver prender y apagar un LED.  El problema es que si sigues adelante sin entender lo que está haciendo el programa en el microcontrolador, más adelante vas a tener problemas mayores y no vas a entender que es lo que pasa.  Te recomiendo leer lo que puse al final del post #11.  Lo que ocurre es que bigluis quiso mostrarte simplemente un método que es totalmente válido para algunas situaciones, pero que para lo simple de tu aplicación no es el más recomendable ya que si quisieras ampliar tu programa tendrías problemas, como en el caso de que quisieras colocar otro pulsador y otro LED que cumplieran independientemente las mismas funciones de los que tienes ahora.  Ensayaste el programa que te muestro en el post #4?  Es un forma muy simple de resolverlo: ensáyalo y sobretodo estudia la forma en que trabaja.

Saludos!

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Problema con programita en CCS
« Respuesta #16 en: 19 de Octubre de 2010, 22:35:15 »
Si sin con su ayuda pude resolver el problema, lo que mas me interesa es aprender a programar asi que voy a revisar los programas que me pasaron.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con programita en CCS
« Respuesta #17 en: 19 de Octubre de 2010, 23:25:24 »
Yo creo que entre el último programa que te mostró BigLuis y el que puse yo (que es casi idéntico) fácilmente podrías llegar a entender y acomodar el programa.

Basícamente sería

ciclo while
{
  preguntar como está el pin A0 (if.....)
  {  
    esperar un tiempo como antirrebote (con 10ms está bien)
    volver a preguntar como está el pin A0 (if...) en este punto A0 debe estar igual que en la primer pregunta para asegurar que está presionado.
    {  
      actuar en consecuencia (si el led estaba apagado encenderlo y si estaba encendido apagarlo). Podés usar un IF para detectar eso o una XOR con "1" (que hace que el valor cambie de estado) como hice yo
      ciclo while hasta que A0 cambie de estado, lo que indicaría que se suelta la tecla
    }
  }
}
« Última modificación: 19 de Octubre de 2010, 23:30:59 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con programita en CCS
« Respuesta #18 en: 20 de Octubre de 2010, 10:11:39 »
Hola AngelGris, creo que tu programa difiere al de bigluis en algo bien importante y es en la forma de esperar a que se pulse el botón en A0. En tu programa tienes: if (RA0 == 0) que básicamente es de la misma forma en que yo lo tengo en el mio: if( !input(PIN_A0));.  Bigluis lo hace asi: while(input(PIN_A0)); en su código.  Como bien sabes, si el programa se encuentra un if(), simplemente revisa si su condición es verdadera o falsa; bien sea que encuentre que la condición es verdadera o falsa, cumple con las instrucciones asociadas y el programa sigue corriendo normalmente.  Mientras que si el programa se encuentra con una instrucción while(), se va a detener en ella y no va a ejecutar ninguna otra instrucción hasta que su condición sea verdadera y salga del ciclo while.  Mi punto es que si al programa se le adicionaran más intrucciones y más adelante tuviese que estar revisando por ejemplo, la condicón de otras entradas diferentes a A0, no lo podría hacer ya que el programa se detendría en el primer ciclo while() que encontrase.

Hasta aqui, está muy bien tu código incluso mejor ya que al mio le falta insertarle un atirrebotes. En el código de ejemplo que pongo en el post #4 utilizo una bandera para evitar que vuelva a entrar a la instrucción de revisión del estado de A0, en caso de dejar presionada la tecla.  Con esta bandera simplemente se pasa por alto la instrucción y el programa sigue corriendo normalmente en caso de que tuviese que cumplir con otras tareas.  Tanto en tu programa, como en el de bigluis, hacen esto con una instrucción while() mientras se suelta el botón con las consecuencias que ya mencioné. En este último caso se que podría tratarse tan solo de algunos 'milisegundos' mientras se suelta el pulsador, pero en una aplicación con muchas funciones y cierto grado de complejidad unos 'milisegundos' pueden llegar ser una 'eternidad' y hacer que el programa no funcione apropiadamente.

Saludos!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con programita en CCS
« Respuesta #19 en: 20 de Octubre de 2010, 12:07:47 »
Hola AngelGris, creo que tu programa difiere al de bigluis en algo bien importante y es en la forma de esperar a que se pulse el botón en A0. En tu programa tienes: if (RA0 == 0) que básicamente es de la misma forma en que yo lo tengo en el mio: if( !input(PIN_A0));.  Bigluis lo hace asi: while(input(PIN_A0)); en su código.  Como bien sabes, si el programa se encuentra un if(), simplemente revisa si su condición es verdadera o falsa; bien sea que encuentre que la condición es verdadera o falsa, cumple con las instrucciones asociadas y el programa sigue corriendo normalmente.  Mientras que si el programa se encuentra con una instrucción while(), se va a detener en ella y no va a ejecutar ninguna otra instrucción hasta que su condición sea verdadera y salga del ciclo while.  Mi punto es que si al programa se le adicionaran más intrucciones y más adelante tuviese que estar revisando por ejemplo, la condicón de otras entradas diferentes a A0, no lo podría hacer ya que el programa se detendría en el primer ciclo while() que encontrase.

Hasta aqui, está muy bien tu código incluso mejor ya que al mio le falta insertarle un atirrebotes. En el código de ejemplo que pongo en el post #4 utilizo una bandera para evitar que vuelva a entrar a la instrucción de revisión del estado de A0, en caso de dejar presionada la tecla.  Con esta bandera simplemente se pasa por alto la instrucción y el programa sigue corriendo normalmente en caso de que tuviese que cumplir con otras tareas.  Tanto en tu programa, como en el de bigluis, hacen esto con una instrucción while() mientras se suelta el botón con las consecuencias que ya mencioné. En este último caso se que podría tratarse tan solo de algunos 'milisegundos' mientras se suelta el pulsador, pero en una aplicación con muchas funciones y cierto grado de complejidad unos 'milisegundos' pueden llegar ser una 'eternidad' y hacer que el programa no funcione apropiadamente.

Saludos!

  Estoy de acuerdo.
  Yo simplemente mencioné mi ejemplo y el de BigLuis porque eran, quizá y sólo quizá, un poco más sencillos de entender para alguien que está comenzando. Digo que quizá es un poco más sencillos por el hecho de no estar unsando "flags (o banderas)" y que tal vez ello podría llevar a una interpretación equivocada. (suponiendo que alguien no entiende suficiente, tal vez crea que sí o sí tiene que hacer uso de los "Flags").

  Mas allá de esos detalles me parece fántastico el consejo que le has dado a soymoe respecto que lo interesante de hacer programas es entenderlos.

  Yo creo que para ello debería leer algún libro aunque sea básico de C aplicado a microcontroladores.

  En mi caso yo venía de hacer algunos programejos para PC en el viejo Pascal 7.0 y luego también algo de Delphi, nunca me había puesto con el C ya que me costaba bastante adaptarme a las distintas formas de expresar lo mismo (veía algunos ejemplos pero escritos distinto y me mareaba un poco). Después, por curiosidad, quise ver como era eso de programar en C los PIC (siempre lo había hecho en ASM) y me bajé un librito básico y también uno de ANNSI C y la verdad que me resulto de una gran ayuda.
  Si bien yo ya entendía bien la idea de una instrucción IF, o un ciclo While (que sería el equivalente al REPEAT de pascal) en los libros que bajé también explica la teoría de dichas estructuras y por ello es muy fácil de entender. Y si mal no recuerdo también detalla las distintas formas de expresar lo mismo. Un ejemplo típico seria A = A&1 (A = A and 1) que también lo puedo escribir A &= 1;
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con programita en CCS
« Respuesta #20 en: 20 de Octubre de 2010, 15:07:39 »
Cuando comencé con el CCS, compré un libro que se llama:

PICmicro MCU C
An Introduction to Programming the Microchip PIC in CCS C
By Nigel Gardner.

Este es un libro donde explica muy detalladamente el uso de las instrucciones básicas del CCS y me ha servido muchísimo. Normalmente recomiendo este libro para los que quieren comenzar en CCS.  También me he acompañado constantemente del manual del CCS y logicamente de las hojas de datos de cada PIC.

Saludos!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con programita en CCS
« Respuesta #21 en: 20 de Octubre de 2010, 15:35:12 »
Cuando comencé con el CCS, compré un libro que se llama:

PICmicro MCU C
An Introduction to Programming the Microchip PIC in CCS C
By Nigel Gardner.


  Yo bajé un PDF con el título que tu indicas y también este otro

PICmicro MCU C
An Introduction to Programming the Microchip PIC in C
By Nigel Gardner.


  También este otro

Compilador C CCS y simulador PROTEUS para Microcontroladores PIC
Eduardo Garcia Breijo


  También este otro

Programming 8-bit PIC Microcontrollers in C
Martin P. Bates


  y también un PDF buscado como "Aprenda Lenguaje ANSI C como si estuviera en primero"
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Problema con programita en CCS
« Respuesta #22 en: 29 de Agosto de 2013, 00:17:52 »
Gracias por las respuestas ya aprendi un poco mas de CCS


 

anything