Autor Tema: Codigo de un controlador de luces - PCW C Compiler  (Leído 2524 veces)

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

Desconectado CDT_Gonzalo

  • PIC12
  • **
  • Mensajes: 93
Codigo de un controlador de luces - PCW C Compiler
« en: 22 de Abril de 2004, 10:29:00 »
Aqui planteo mi problema: http://miarroba.com/foros/ver.php?temaid=1821683&foroid=6510

para quien no tenga ganas de linear :P, el problema que tengo basicamente, es que para este proyecto necesito usar un PIC12C509A, y que el mismo no tiene interrupciones, entonces se me ocurrió hacer una lectura del TMR0 del 12C509 en el bucle principal, y cuando hice esto, no funciona directamente, no se si no logra activarse el timer o que. En un momento tenia este codigo asi, y ademas las int activadas con una funcion vacia (la que está comentada), y funcionaba, pero parece que sin prescaler, ademas, por algun motivo, no siempre tenia la misma cantidad de separacion de tiempo...por lo tanto, el led de estado titila demasiado rapido, y aveces parece que no titila, sino que enciende por el triple de tiempo (separacion muy escaza, que da esa sensacion).

Espero alguien me pueda dar una mano, muchas gracias!
Codigo:

#include <16f628.h>
#use delay(clock=4000000)
#use fast_io(B)

#define RELE1  PIN_B0
#define RELE2  PIN_B1
#define RELE3  PIN_B2
#define RELE4  PIN_B4

#define ENT    PIN_B3

#define LEDEST PIN_B5

#define INT_S  15    //(4000000/(4*256*256)) = 15,2587890625
#define SECS   11

static byte segundos = 0, contador_interrupciones = 0;
static int1 pcont = FALSE, estado = FALSE, inicializando = FALSE;

/*#int_rtcc
void ciclo() {
}*/

void ejecutar_secuencia(byte secuencia) {
   switch(secuencia) {
      case 0:
         // *Cuac* secuencia
         output_low (RELE1);
         output_low (RELE2);
         output_high(RELE3);
         output_high(RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 1:
         // Primera secuencia
         output_high(RELE1);
         output_high(RELE2);
         output_low (RELE3);
         output_low (RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 2:
         // Segunda secuencia
         output_high(RELE1);
         output_high(RELE2);
         output_high(RELE3);
         output_high(RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 3:
         // Tercer secuencia
         output_low (RELE1);
         output_low (RELE2);
         output_low (RELE3);
         output_high(RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 4:
         // Cuarta secuencia
         output_high(RELE1);
         output_low (RELE2);
         output_high(RELE3);
         output_low (RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 5:
         // Quinta secuencia
         output_low (RELE1);
         output_high(RELE2);
         output_low (RELE3);
         output_high(RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 6:
         // Sexta secuencia
         output_low (RELE1);
         output_low (RELE2);
         output_high(RELE3);
         output_low (RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 7:
         // Septima secuencia
         output_low (RELE1);
         output_high(RELE2);
         output_low (RELE3);
         output_low (RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 8:
         // Octava secuencia
         output_high(RELE1);
         output_low (RELE2);
         output_low (RELE3);
         output_low (RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 9:
         // Novena secuencia
         output_high(RELE1);
         output_low (RELE2);
         output_low (RELE3);
         output_high(RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 10:
         // Décima secuencia
         output_low (RELE1);
         output_high(RELE2);
         output_high(RELE3);
         output_low (RELE4);
         estado = true;
         output_low (LEDEST);
         break;
      case 11:
         // Onceava secuencia
         output_low (RELE1);
         output_low (RELE2);
         output_low (RELE3);
         output_low (RELE4);
         estado = false;
         output_high(LEDEST);
         break;
   }
}

main() {
   // Definicion de variables de entorno MAIN()
   byte secuencia_actual = 0, i = 0, ultima_lectura = 0, lectura_actual = 0;

   // Defino los estados de TRISA
   set_tris_b(0b00001000);

   // Configuro el TMR0
   set_timer0 (0);
   setup_counters (RTCC_INTERNAL, RTCC_DIV_256);

   // Activo las interrupciones
   /*enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);*/

   // Rutina de inicializacion
   inicializando = true;
   for(i=0;i<=SECS;i++) {
      ejecutar_secuencia(i);
      delay_ms(1000);
   }
   secuencia_actual = SECS;
   inicializando = false;
   pcont = true;
   ultima_lectura = get_rtcc();
   while(true){
      if (input(ENT)) {
         delay_ms(100); // Evitamos rebotes
         if (input(ENT)) {
            if (!pcont) {
               if (estado) {
                  secuencia_actual = SECS;
               } else {
                  pcont = true;
                  secuencia_actual = 0;
               }
            } else {
               secuencia_actual++;
               if (secuencia_actual == SECS) { pcont = false; }
            }
            ejecutar_secuencia(secuencia_actual);
            inicializando = true; // Que no nos moleste mientras la tecla esta apretada
            while(input(ENT)); // Esperamos a que se suelte la tecla
            delay_ms(100);
            while(input(ENT)); // Evitamos rebotes
            inicializando = false;
            contador_interrupciones = 0;
            segundos = 0;
            ultima_lectura = get_rtcc();
         }
      } else {
         lectura_actual = get_rtcc();
         if (ultima_lectura > lectura_actual) { // Volcó el Buffer
            contador_interrupciones++;
            if (contador_interrupciones >= INT_S) {
               contador_interrupciones = 0;
               segundos++;
               if (pcont && estado) {  // Titila para indicar que esperamos nuevo comando
                  output_high(LEDEST);
                  delay_ms(100);
                  output_low (LEDEST);
               }
               if (segundos == 3) {
                  pcont = false;
                  //#asm
                  //   SLEEP
                  //#endasm
               }
            }
         }
      }
   }
}


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Codigo de un controlador de luces - PCW C Compiler
« Respuesta #1 en: 23 de Abril de 2004, 02:04:00 »
Gonzalo me pierdo con tanta variable. Si lo que quieres comprobar es si cada vez que se desborda el TMR0 se incrementa una variable, porque no haces un programa corto, que represente esta variable en una LCD, así comprobarás si lo que habías pensado funciona. Una vez comprobado esto, incluyelo en tu programa y si no va, el fallo estará en otro sitio.