Autor Tema: Dudas con CCS (Solucionado)  (Leído 3242 veces)

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

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Dudas con CCS (Solucionado)
« en: 20 de Marzo de 2012, 19:36:37 »
Hola, como ya he dicho en otras ocasiones, estoy empezando con el tema de programacion de los PIC's y lo estoy haciendo a partir del CCS. Tengo el manual del CCS en español que anda por aqui, pero es demasiado escueto para quienes nos iniciamos. Tambien tengo el manual de referencia en ingles, pero entre falta de tiempo y que no domino totalmente el ingles, no me ha sido muy util.
Les comento ahora mis dudas y agradecere cualquier ayuda.

 1- Si genero un proyecto nuevo, utilizando el asistente, este me crea dos archivos main.c y main.h, en el cual si quiero utilizar los TIMER's, me incluye las directivas para dichos TIMER's y {...}. Mi duda es, debo poner lo que quiero que haga el micro en cada interrupcion del TIMER correspondiente entre los corchetes?. En caso contrario, ¿como se hace?.

2- Quiero utilizar el puerto B como entradas y que estas provoquen una interrupcion cada vez que alguna cambie de estado. Igualmente el asistente me creo algo asi:

Código: [Seleccionar]
#INT_RB  
 void RB_isr(void)  
{
}
La pregunta es similar a la anterior, ¿debo colocar entre los corchetes lo que quiero que haga el micro al ser detectada una pulsacion?.

3- Esta no es estrictamente de C, sino de un problema que he observado al simular mi proyecto en Proteus version 7.8 sp2. Se trata de que hay varios errores de simulacion, como por ejemplo: transistores que no responden correctamente, reles interactivos que no cambian y ciertas partes del programa que no son ejecutadas correctamente. ¿Sabe alguien si esto es un bug de esa version, o quizas lo sea de mi instalacion?.

Espero sus respuestas, que agradezco anticipadamente.

Saludos.
« Última modificación: 03 de Abril de 2012, 12:48:19 por AcoranTf »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas con CCS
« Respuesta #1 en: 20 de Marzo de 2012, 19:58:24 »
Claro, esas funciones que te crea CCS son especiales para la atención de las interrupciones, o sea no reciben parámetros y tampoco devuelven valores. CCS lo que hace es, en el vector de interrupciones, crea el código necesario que testear que interrupción se ha generado y a partir de ello llama a la función particular. Tu dentro  de esa función debes realizar las tareas que necesites. Las banderas las trabaja automáticamente CCS, salvo algún bug  :mrgreen:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Dudas con CCS
« Respuesta #2 en: 20 de Marzo de 2012, 20:14:49 »
Gracias Suky por tu pronta respuesta. Con lo que me dices creo que se confirma que el Proteus v 7.8 sp2 esta plagado de bugs, ya que no consigo que funcione un pequeño programa de automatismo, o quizas sea que no lo he planteado bien. Lo repasare una vez mas y si no me aclaro, lo pondre por aqui para ver si me echais una mano.

Saludos.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Dudas con CCS
« Respuesta #3 en: 29 de Marzo de 2012, 06:14:54 »
Bueno regreso con mi problema. En el codigo inicial habia varios errores por mi parte, entre ellos el creer que todo el puerto B producia la interrupcion, ya vi que son solo los 4 bits altos.
Aun asi tengo ahora un problema que no consigo detectar. En el adjunto hay tres archivos, un .c, un .hex y un diseño de proteus, todo ello forma parte de mi proyecto de automatismo para una puerta de garaje y el problema es que en la simulacion, funciona todo bien, excepto las lineas en que realizo una operacion "and", (& o &&). El grupo de 8 microswich que hay en el puerto B, definen el modo de funcionamiento del automatismo de la siguiente manera: RB0, RB1, RB2 y RB3 sirven para seleccionar el tiempo que tardara en cerrarse automaticamente, RB4 no se utiliza, RB5 seleciona si se cierra automaticamente (ON) o no (OFF), RB6 selecciona si al abrir se enciende la luz del garaje por un tiempo (ON) o no (OFF) y RB7 selecciona si todo se activa con un pulsador (OFF) o con tres (ON). Estan incluidos en el bucle principal, para hacerlos interactivos, o sea que se tengan en cuenta sin necesidad de reiniciar.
Aunque en el diseño de proteus aparecen LED's como dispositivos de salida, es solo para la simulacion, en el definitivo, en su lugar iran reles.
Otro detalle es que durante la apertura, la celula fotoelectrica permanece apagada, mientras que durante el cierre permanece encendida.
Tal como esta todo, funciona solo el modo de 3 pulsadores, (salvo los finales de carrera y la fotocelula, que utilizan operaciones and), ya que en el de 1 pulsador se utilizan operaciones and en todas las lineas.
Se puede ver en el codigo fuente que he utilizado las llaves ("{}"), incluso en las lineas donde solo hay una instruccion para la funcion, pero eso aun siendo reiterativo y no necesario, tampoco deberia dar problemas.
Agradezco le echeis un vistazo y me comenteis si hay algun error que yo no veo o que esta ocurriendo.

Saludos.

P.D.: El codigo no esta acabado, faltan aun el tratamiento de las interrupciones para los temporizadores.
« Última modificación: 29 de Marzo de 2012, 06:26:15 por AcoranTf »

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Dudas con CCS
« Respuesta #4 en: 29 de Marzo de 2012, 06:39:05 »
Hola AcoranTf ahora mismo no me encuentro en casa, en cuanto llegue le echo un vistazo. Una de las cosas que tienes que tener en cuenta a la hora de empezar con CCS es que no te puedes fiar del wizard al igual que tampoco de los bugs que tiene Proteus. Ambos te pueden dar un dolor de cabeza intentando buscar un fallo que no existe.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Dudas con CCS
« Respuesta #5 en: 29 de Marzo de 2012, 06:49:46 »
Muchas gracias samshield_pic, ya habia leido algo y comprobado sobre los bugs del proteus. De todos modos en este proyecto he utilizado el wizard del CCS, sobretodo por mi falta de experiencia, para ver como se crean los fuses, timers e interrupciones, pero ya he visto que agrega codigo superfluo, lo podras ver en el fuente que hay varias lineas comentadas, para eliminarlas de la compilacion.
De todos modos como el hardware lo tengo mas o menos claro, igual hago la placa y lo pruebo en real. De ese modo ademas me servira para poder debugear con el PicKit II y MPLab, aunque esto tampoco lo he hecho nunca.

Saludos.

P.D.: De todos modos sigo esperando que alguien le eche un vistazo a ver si ve algo extraño o algun error mio.
« Última modificación: 29 de Marzo de 2012, 11:01:37 por AcoranTf »

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Dudas con CCS
« Respuesta #6 en: 29 de Marzo de 2012, 13:32:09 »
Vamos a ver AcoranTf, voy a intentar ver lo que quieres hacer en este fragmento de tu código:

Código: C
  1. if(!f_c_abrir && !abrir){
  2.             bit_clear(salida,1);
  3.             bit_clear(salida,2);
  4.             abrir=1;
  5.             }

En esta función if se ejecuta lo que esta dentro de los corchetes, si la sentencia "(!f_c_abrir && !abrir)" es "1". En esa sentencia tu que es lo que quieres que haga?, si f_c_abrir = 1 y abrir = 1 la sentencia seria "1" y por lo tanto se ejecutaría la función, sin embargo cualquier otra combinación seria "0". Sin embargo, al tener negadas las dos variables, la sentencia sería "1" cuando ambas sean "0".
Es más, yo lo pondría de la siguiente manera, por que se lee mejor lo que quieres comparar, aunque de la otra manera también funciona:

Código: C
  1. if ((!f_c_abrir) && (!abrir)){

No veo que tengas nada mal en el código, solo que hay cosas que no se que quieres hacer, por ejemplo aquí:

Código: C
  1. if(flag_abre && !abrir & parar){

creo que puede ser más que alguna instrucción se pise con otra con tantas comparaciones.

pd.Un consejo a la hora de escribir el código: tabula las instrucciones de esta manera o parecida para que sea mas legible el código  ;-)

Código: C#
  1. #include <16F876.h>
  2. //#device adc=8
  3.  
  4. #FUSES NOWDT                      //Watch Dog Timer
  5. #FUSES XT                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES NOWRT                    //Program memory not write protected
  12. #FUSES NODEBUG                  //No Debug mode for ICD
  13.  
  14. #use delay(clock=4000000)
  15. #use fast_io(A)                        
  16. #use fast_io(B)                        
  17. #use fast_io(C)                                                                                                            
  18.  
  19.    short f_c_abrir = 1;
  20.    short f_c_cerrar = 1;
  21.    short cierre_aut = 0;
  22.    short modo_mando = 0;
  23.    short abrir = 1;
  24.    short cerrar = 1;
  25.    short parar = 1;
  26.    short contacto_fotocelula = 1;
  27.    short modo_luz = 0;
  28.    short bandera_luz = 0;
  29.    short flag_abre = 0;
  30.    short flag = 1;
  31.    int tiempo_sel_cierre = 0;
  32.    int salida = 1;            // Todo a 0 y celula apagada
  33.    int def_micros = 0;
  34.    int lee_micros;
  35.    int entrada = 0;
  36.    int lee_entrada;
  37.    long tiempo_acu_luz = 0;
  38.    long tiempo_acu_cerrar = 0;
  39.  
  40.  
  41. #int_TIMER1
  42. void  TIMER1_isr(void)
  43. {
  44.    if(bandera_luz){
  45.       tiempo_acu_luz++;
  46.       }
  47.      
  48.    if(tiempo_acu_luz==458){
  49.       bandera_luz=0;
  50.       bit_clear(salida,3);
  51.       tiempo_acu_luz=0;
  52.       }
  53. }
  54.  
  55.  
  56. void main()
  57. {
  58.  
  59.    setup_adc_ports(NO_ANALOGS);
  60.    setup_spi(SPI_SS_DISABLED);
  61.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  62.    setup_ccp1(CCP_OFF);
  63.    
  64.    set_tris_a (0b111111);
  65.    set_tris_b (0b11111111);
  66.    set_tris_c (0b11110000);                          
  67.  
  68.     while(true)
  69.       {
  70.          lee_micros=input_b();
  71.          if(lee_micros!=def_micros){
  72.             def_micros=lee_micros;
  73.             modo_mando=bit_test(def_micros,7);
  74.             modo_luz=bit_test(def_micros,6);
  75.             cierre_aut=bit_test(def_micros,5);
  76.             tiempo_sel_cierre=def_micros & 15;        
  77.             }
  78.  
  79.          lee_entrada=input_a();
  80.          if(lee_entrada!=entrada){
  81.             flag=0;
  82.             entrada=lee_entrada;
  83.             f_c_abrir=bit_test(entrada,4);
  84.             f_c_cerrar=bit_test(entrada,5);
  85.             abrir=bit_test(entrada,0);
  86.             cerrar=bit_test(entrada,1);
  87.             parar=bit_test(entrada,2);
  88.             contacto_fotocelula=bit_test(entrada,3);
  89.             flag=1;
  90.             }
  91.          
  92.          if(!f_c_abrir && !abrir){
  93.             bit_clear(salida,1);
  94.             bit_clear(salida,2);
  95.             abrir=1;
  96.             }
  97.          if(!f_c_cerrar && !cerrar){
  98.             bit_clear(salida,1);
  99.             bit_clear(salida,2);
  100.             cerrar=1;
  101.             bit_set(salida,0);
  102.             }
  103.          if(bandera_luz){
  104.             bit_set(salida,3);
  105.             }
  106.  
  107.          if(!modo_mando){    // Modo 3 pulsadores
  108.             if(!abrir){
  109.                bit_set(salida,1);
  110.                bit_clear(salida,2);
  111.                abrir=1;
  112.                bit_set(salida,0);
  113.                if(!modo_luz){
  114.                   bandera_luz=1;
  115.                   }
  116.                }
  117.             if(!cerrar){
  118.                bit_set(salida,2);
  119.                bit_clear(salida,1);
  120.                bit_clear(salida,0);
  121.                }
  122.             if(!cerrar && !contacto_fotocelula){
  123.                bit_clear(salida,2);
  124.                bit_set(salida,1);
  125.                bit_set(salida,0);
  126.                cerrar=1;abrir=0;
  127.                }
  128.             if(!parar){
  129.                bit_clear(salida,1);
  130.                bit_clear(salida,2);
  131.                parar=1;
  132.                bit_set(salida,0);
  133.                }
  134.            
  135.             }
  136.          if(modo_mando)     // Modo 1 pulsador
  137.                {
  138.                if(flag_abre && !abrir & parar){
  139.                   bit_clear(salida,2);
  140.                   bit_clear(salida,1);
  141.                   flag_abre=0;
  142.                   parar=1;
  143.                   abrir=1;
  144.                   }
  145.                  
  146.                if(!flag_abre && !abrir & parar){
  147.                   bit_clear(salida,1);
  148.                   bit_clear(salida,2);
  149.                   flag_abre=1;
  150.                   parar=1;
  151.                   abrir=1;
  152.                   }
  153.                  
  154.                if(flag_abre && !abrir){
  155.                   bit_set(salida,2);
  156.                   bit_clear(salida,1);
  157.                   flag_abre=0;
  158.                   parar=1;
  159.                   abrir=1;
  160.                   }
  161.                  
  162.                if(!flag_abre && !abrir){
  163.                   bit_set(salida,1);
  164.                   bit_clear(salida,2);
  165.                   flag_abre=1;
  166.                   parar=1;
  167.                   abrir=1;
  168.                   }
  169.                  
  170.                if(!flag_abre && !contacto_fotocelula){
  171.                   bit_clear(salida,2);
  172.                   bit_set(salida,1);
  173.                   bit_set(salida,0);
  174.                   flag_abre=1;
  175.                   parar=1;
  176.                   }              
  177.                }
  178.          output_c(salida);
  179.          
  180.       }
  181.  
  182. }

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Dudas con CCS
« Respuesta #7 en: 29 de Marzo de 2012, 14:56:22 »
Hola de nuevo samshiel_pic. Tienes razon en lo de la tabulacion, voy a hacerlo en el archivo original y lo volvere a poner con los comentarios correspondientes para que se lea mejor y se entienda lo que hace cada linea.
He visto una cosa que no esta bien, voy a comprobarlo y luego subo el resultado.

Saludos.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Dudas con CCS
« Respuesta #8 en: 03 de Abril de 2012, 12:47:28 »
Bueno ya acabe este proyecto. Solucione algunas cosillas que tenia mal enfocadas y ya funciona al 100 %, incluidas las temporizaciones e interrupciones.
Voy a ponerlo en otro hilo, por si a alguien le resulta de interes.
Gracias a los que me habeis ayudado.

Saludos.

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Dudas con CCS (Solucionado)
« Respuesta #9 en: 03 de Abril de 2012, 13:28:44 »
Me alegro!  :P


 

anything