Ayuda ccs c reloj digital

hola me puden ayudar con este codigo yo lo veo bien pero cuan compilo en ccs me marca 3 errores, pero pues ya no se q hacer por fa nesecito ayuda

http://imageshack.us/photo/my-images/863/pantallau.png
pantallau.png



PHP:
#include "E:\tempReloj\sensado.h"
#define Use_LCD_port
#define use_lcd_p_b
  
   #define TRIS_lcd_def  0b0000
   #define RTC_SCLK PIN_A4          //definimos pin"s...
   #define RTC_IO   PIN_A5
   #define RTC_RST  PIN_A1 
    #include "LCD_Cr.C"
    #include "ds1302.c"

///VARIABLES GLOBALES
byte hour,min,sec;   //variabes para ds1302
byte menu=0,flag=0,var=2;         //variables para menu configurar

///DEFINICION DE FUNCIONES   
void config(void);
void horas(void);               
void minutos(void);

///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion(void)
{
   if(flag>var){      //¿ya es 130ms aprox?
      var--;         //SI -> decremento var...
      if(var==0)
         var=2;      //...ajuste fino de 130ms aprox
      flag=0;         //reset flag para contar 130ms aprox
         rtc_get_time(hour,min,sec );      //coge hora,minuto,segundo
      printf(lcd_putc,"Hora: %2X:%2X:%2X",hour,min,sec);   

//lcd
      }
      
   set_timer0(0);      //reset TMR0
   flag++;            //incremento variable flag
}

///PROGRAMA
void main(void){
   enable_interrupts(INT_TIMER0);            //interrupcion TIMER0 activada
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);   //configuracion interrupcion TMR0
   set_timer0(0);                        //carga TMR0
   
   lcd_init();          //inicializa lcd
   rtc_init();          //inicializa rtc
   
   lcd_putc("dsd");   //presentacion...
   delay_ms(800);                           //...inicial
   
   config();                        //ve a menu configurar
   enable_interrupts(INT_TIMER0);               //activadas interrupciones
   
    for( ; ; ){         //bucle...
      if(input(PIN_A5)==0){            //Si se pulsa Conf....
         while(!input(PIN_A5)){}         //elimina rebotes
         config();
         }                        //ve a menu

 //configurar//
          
     

///FUNCION CONFIGURAR
void config(void){


      Disable_interrupts(GLOBAL);
    
   do{
      switch(menu){
         case 0:   
            
         lcd_putc("fConfigurar
horas?" );      //horas
               if(!input(PIN_A5)){
                  while(!input(PIN_A5)){}
                  horas();
                  menu=1;                     

   //apunta siguiente opcion
                  }
               break;
         case 1: lcd_putc("fConfigurar
minutos?" );      //minutos
               if(!input(PIN_A5)){
                  while(!input(PIN_A5)){}
                  minutos();
                  menu=2;                     

   //apunta siguiente opcion
                  }
               break;
         case 2: lcd_putc("fSalir
configurar?" );      //salir configuracion
               if(!input(PIN_A5)){
                  menu=3;
                  }               
         }
         
      if(!input(PIN_A3)){            //controla el boton up...
         while(!input(PIN_A3)){}
         menu++;
         if(menu>2)
            menu=0;
         }                     //...para mostrar menu

//por lcd
         
      delay_ms(130);               //retardo para ver lcd
      }while(menu<3);
      
      menu=0;                                 

//actualiza indices menu
      rtc_set_datetime(hour,min);   //nueva hora,minuto,...
      enable_interrupts(GLOBAL);                  //activadas

//interrupciones
      set_timer0(0);                           

//carga TMR0
}
///FUNCION CONFIGURA HORAS
void horas(void){

   lcd_gotoxy(1,1);
  printf(lcd_putc,"fConf.Horas:
Hora: %2X:%2X:%2X",hour,min,sec); //////////////
   do{
      if(!input(PIN_A3)){                  //¿se ha pulsado up?
         while(!input(PIN_A3)){}            //elimina rebotes
         hour++;                        //SI ->

//incremento hour
         switch(hour){                  //limites...
            case 0x0A:   hour=0x10;break;      
            case 0x1A:   hour=0x20;break;
            case 0x24:   hour=0x00;
            }                        

//...hour
     lcd_gotoxy(1,1);
     printf(lcd_putc,"
Hora: %2X:%2X:%2X",hour,min,sec);   //muestra por lcd hour
         }
      }while(input(PIN_A5));
   while(!input(PIN_A5)){}         //elimina rebotes
}
///FUNCION CONFIGURA MINUTOS
void minutos(void){
   lcd_gotoxy(1,1);
   printf(lcd_putc,"fConf.Minutos:
Hora: %2X:%2X:%2X",hour,min,sec);   //muestra por lcd
   do{
      if(!input(PIN_A3)){            //¿se ha pulsado up?
      while(!input(PIN_A3)){}         //elimina rebotes
      min++;                     //SI -> incremento min
      switch(min){               //limites...
         case 0x0A:   min=0x10;break;
         case 0x1A:   min=0x20;break;
         case 0x2A:   min=0x30;break;
         case 0x3A:   min=0x40;break;
         case 0x4A:   min=0x50;break;
         case 0x5A:   min=0x00;
         }                     //...min
     lcd_gotoxy(1,1);
     printf(lcd_putc,"Hora: %2X:%2X:%2X",hour,min,sec);   //muestra por lcd min
      }
      }while(input(PIN_A5));
    while(!input(PIN_A5)){}         //elimina rebotes
}
 
Última edición por un moderador:
De entrada esta parte deberia ser asi:
PHP:
if(!input(PIN_A3)){            //controla el boton up...
         while(!input(PIN_A3));
         menu++;
         if(menu>2){
            menu=0;
}
         }                     //...para mostrar menu
 
Hola, eh estado intentando demasiado con este circuito, el proposito es el siguiente:

Tener 2 pulsadores conectados, cuando se presiones el pulsador 1 en el display se visualizara el conteo de un minuto.
Cuando se presione el pulsador 2 en el display se visualizara el conteo de 2 minutos.
Al termino del tiempo se debe sonar una alarma y quedar disponible para iniciar el tiempo correspondiente al pulsador que se active.

Mi primer problema es que la función de conteo de un minuto se inicia sola y se supone que eso debe suceder hasta que yo pulse el botón

Mi segundo problema es que la cuenta no se detiene, no se como hacerlo.

PD: ahorita solo lo estoy haciendo con el tiempo de un minuto, gracias por su ayuda.

programa: PIC 16F883 Y LENGUAJE CCS

Código:
#include "16f883.h"                    // Pic a utilizar
#use delay(internal=4000000)       // frecuencia a utilizar
#fuses mclr,nowdt,noput,nobrownout,nolvp,noprotect   // Fusibles
#include "lcd.c"              // Libreria para utilizar LCD 
#byte portc=7                 //direccion del puerto
          
int min,sec;   //variables de minuto y segundo
////////////////////////////////////////////////////////funcion de 1 min/////////////////
void un_min(void);    //funcion de un minuto
void un_min(){
lcd_gotoxy(1,1);
lcd_putc("Ejecutando 1 minuto");
for(sec=0;sec<60;sec++){     //hago 59 incrementos de la variable sec
delay_ms(970);
lcd_gotoxy(12,2);
printf(lcd_putc,"%2u"sec);   // muestro la variable en el lcd
lcd_gotoxy(5,2);
printf(lcd_putc,"%1u"min);}  // muestro la variable min en el lcd
if(sec==59);{
sec=0;                 //si los segundos son igual a 59 se aumenta la variable min y seg se hace cero
min++;
}
}

////////////////////////////////////////////////funcion principal///////////////////////////////////
void main (){

set_tris_c(0b00000000);
portc=0x00;
lcd_init();              // Inicia LCD
lcd_putc("TEMPORIZADOR\n");
delay_ms(2000);
lcd_putc("\f");
lcd_gotoxy(1,2);
lcd_putc("Min:");
lcd_gotoxy(8,2);
lcd_putc("Sec:");
/////////////////////////////////////////////bucle infinito///////////////////////////////
while(1){
if(input(pin_c0)==1);       //checar si se presiona el pulsador
un_min();                   //ejecutar el tiempo de un minuto
}
}

Adjunto archivos y simulación ;)
 

Adjuntos

  • TEMPORIZADOR PANTALLA.rar
    111 KB · Visitas: 42
  • conexion.jpg
    conexion.jpg
    100.2 KB · Visitas: 28
Última edición por un moderador:
Mi primer problema es que la función de conteo de un minuto se inicia sola y se supone que eso debe suceder hasta que yo pulse el botón
El problema por lo que se inicia el programa sin presionar el pulsador se debe a esto...

if(input(pin_c0)==1); //checar si se presiona el pulsador
un_min(); //ejecutar el tiempo de un minuto
}

No estás permitiendo que se cumpla la sentencia If al cerrar la instrucción con punto y coma.
Necesitas envolver las instrucciones involucradas con brackets de esta forma...

if(input(pin_c0)){ // checar si se presiona el pulsador
un_min(); // ejecutar el tiempo de un minuto
}
Mi segundo problema es que la cuenta no se detiene, no se como hacerlo.
Este otro problema se debe a lo mismo; igualmente estás terminando la sentencia If con punto y coma.

if(sec==59);{
sec=0; //si los segundos son igual a 59 se aumenta la variable min y seg se hace cero
min++;
}

La solución sería la misma, envolviendo las instrucciones...

if(sec ==59){
sec=0; // Si los segundos son igual a 59 se aumenta la variable min y seg se hace cero
min++;
}
PD: ahorita solo lo estoy haciendo con el tiempo de un minuto
Utiliza esta modificación a tu código y verás como funciona:

Código:
#include <16f883.h>              // PIC a utilizar
#fuses nobrownout,nofcmen,noieso // Fusibles
#use delay(internal = 4MHz)     // Frecuencia a utilizar
#include <lcd.c>                 // Librería para utilizar LCD 
          
////////////////////////////////////////////////////////Función de 1 minuto/////////////////
void un_min(void);    // Declarar la función de un minuto


void un_min(){
int8 min=0,sec=0;   // Variables de minutos y segundos

   lcd_gotoxy(1,1);
      lcd_putc("Ejecutando 1 minuto");
      
         while(true){
            sec++;
               lcd_gotoxy(12,2);
                  printf(lcd_putc,"%02u"sec);   // Muestro la variable sec en el lcd
                  lcd_gotoxy(5,2);
               printf(lcd_putc,"%02u"min);  // Muestro la variable min en el lcd
            delay_ms(970);
            
         if(sec ==59){
            sec=0;   // Si los segundos son igual a 59 se aumenta la variable min y seg se hace cero
               min++;
                  lcd_gotoxy(12,2);
               printf(lcd_putc,"%02u"sec);   // Muestro la variable en el lcd
            lcd_gotoxy(5,2);
         printf(lcd_putc,"%02u"min);  // Muestro la variable min en el lcd
      break;
   }
}
}

/////////////////////////////Función principal/////////////////////////////////
void main (){
   setup_adc_ports(NO_ANALOGS);
   
   lcd_init();    // Inicia LCD
      
   lcd_putc("\fTEMPORIZADOR");
      lcd_gotoxy(1,2);
         lcd_putc("Min:00");
            lcd_gotoxy(8,2);
               lcd_putc("Sec:00");
/////////////////////////////Bucle infinito/////////////////////////////////
   while(true){
      if(input(pin_c0)){         // Checar si se presiona el pulsador
         un_min();               // Ejecutar el tiempo de un minuto
      }
   }
}

Suerte.
 
El problema por lo que se inicia el programa sin presionar el pulsador se debe a esto...

if(input(pin_c0)==1); //checar si se presiona el pulsador
un_min(); //ejecutar el tiempo de un minuto
}

No estás permitiendo que se cumpla la sentencia If al cerrar la instrucción con punto y coma.
Necesitas envolver las instrucciones involucradas con brackets de esta forma...

if(input(pin_c0)){ // checar si se presiona el pulsador
un_min(); // ejecutar el tiempo de un minuto
}

Este otro problema se debe a lo mismo; igualmente estás terminando la sentencia If con punto y coma.

if(sec==59);{
sec=0; //si los segundos son igual a 59 se aumenta la variable min y seg se hace cero
min++;
}

La solución sería la misma, envolviendo las instrucciones...

if(sec ==59){
sec=0; // Si los segundos son igual a 59 se aumenta la variable min y seg se hace cero
min++;
}

Utiliza esta modificación a tu código y verás como funciona:

Código:
#include <16f883.h>              // PIC a utilizar
#fuses nobrownout,nofcmen,noieso // Fusibles
#use delay(internal = 4MHz)     // Frecuencia a utilizar
#include <lcd.c>                 // Librería para utilizar LCD 
          
////////////////////////////////////////////////////////Función de 1 minuto/////////////////
void un_min(void);    // Declarar la función de un minuto


void un_min(){
int8 min=0,sec=0;   // Variables de minutos y segundos

   lcd_gotoxy(1,1);
      lcd_putc("Ejecutando 1 minuto");
      
         while(true){
            sec++;
               lcd_gotoxy(12,2);
                  printf(lcd_putc,"%02u"sec);   // Muestro la variable sec en el lcd
                  lcd_gotoxy(5,2);
               printf(lcd_putc,"%02u"min);  // Muestro la variable min en el lcd
            delay_ms(970);
            
         if(sec ==59){
            sec=0;   // Si los segundos son igual a 59 se aumenta la variable min y seg se hace cero
               min++;
                  lcd_gotoxy(12,2);
               printf(lcd_putc,"%02u"sec);   // Muestro la variable en el lcd
            lcd_gotoxy(5,2);
         printf(lcd_putc,"%02u"min);  // Muestro la variable min en el lcd
      break;
   }
}
}

/////////////////////////////Función principal/////////////////////////////////
void main (){
   setup_adc_ports(NO_ANALOGS);
   
   lcd_init();    // Inicia LCD
      
   lcd_putc("\fTEMPORIZADOR");
      lcd_gotoxy(1,2);
         lcd_putc("Min:00");
            lcd_gotoxy(8,2);
               lcd_putc("Sec:00");
/////////////////////////////Bucle infinito/////////////////////////////////
   while(true){
      if(input(pin_c0)){         // Checar si se presiona el pulsador
         un_min();               // Ejecutar el tiempo de un minuto
      }
   }
}

Suerte.

HOLA, muchas gracias por tu respuesta, en el código modificado que pusiste eh podido aprender varias cosas como:

- por ejemplo el uso del -break- para salirte de la función cuando se complete el tiempo.

- la diferencia de ponerle al bucle while la palabra -true- o el numero -1-, ya que cuando le pongo el 1 me arroja mensajes de warning, se que no es malo pero se ve menos limpio.

- eh aprendido que estaba escribiendo mal las sentencias -if-, en muchos otros programas me quebré la cabeza con eso (porque según yo, no se cumplían las instrucciones), ahora que ya lo se los modificare.

lo único que no entendí es la finalidad de la instrucción para que los puertos no sean analógicos (setup_adc_ports(NO_ANALOGS) del ADC, es necesaria? y la otra cosa son los fuses nofcmen y noieso, no se su funcion.

Pero muchísimas gracias por tu pronta respuesta y por lo que me enseñaste, te comento que ahora voy a tratar de hacerle una interrupcion para que yo pueda pausar e iniciar el conteo desde donde se quedó, tengo poco clara la idea de como hacerlo pero lo intentare y te enviare el progreso. MUCHAS GRACIAS :apreton:

ayudaria mas si indicas cuales son los errores que marca ccs
Gracias por responde amigo
 
lo único que no entendí es la finalidad de la instrucción para que los puertos no sean analógicos (setup_adc_ports(NO_ANALOGS) del ADC, es necesaria?.
Si vas a trabajar con estados lógicos ("1","0"), si es necesario que configures los puertos para trabajar en modo digital.
Si no lo haces, el microcontrolador tomará estados erráticos al estar activo el ADC.
la otra cosa son los fuses nofcmen y noieso, no se su funcion.
Fuses FCMEN e IESO

FCMEN = "Fail-Safe Clock Monitor Enable bit" (Monitor de seguridad ante fallas del oscilador principal)
1 = Fail-Safe Clock Monitor enabled
0 = Fail-Safe Clock Monitor disabled

Sirve para verificar que el oscilador principal siempre esté operando correctamente.
Ante una falla del oscilador principal, entra en funcionamiento el oscilador interno si este fuse está activo.

Se habilita estableciendo el fuse FCMEN en ON.

IESO = "Internal/External Oscillator Switchover" (Conmutador del oscilador Interno/Externo)
1 = Oscillator Switchover mode enabled
0 = Oscillator Switchover mode disabled

Este fuse permite utilizar el oscilador interno al encender el microcontrolador.
Al usar dos velocidades se minimiza el tiempo de latencia de puesta en marcha del oscilador y la ejecución de código, permitiendo que el microcontrolador utilice el oscilador interno como fuente de reloj hasta que el oscilador principal esté disponible.

Se habilita estableciendo el fuse IESO en ON.

Espero haber sido claro y que esta información aclare tus dudas.

Por aquí puedes ver un ejemplo acerca del funcionamiento del fuse FCMEN
Está escrito en otro lenguaje de programación (PICBasic de PROTON IDE) pero te servirá de referencia para aprender que es lo que sucede al activar este fuse.

Suerte.
 
Si vas a trabajar con estados lógicos ("1","0"), si es necesario que configures los puertos para trabajar en modo digital.
Si no lo haces, el microcontrolador tomará estados erráticos al estar activo el ADC.

Fuses FCMEN e IESO

FCMEN = "Fail-Safe Clock Monitor Enable bit" (Monitor de seguridad ante fallas del oscilador principal)
1 = Fail-Safe Clock Monitor enabled
0 = Fail-Safe Clock Monitor disabled

Sirve para verificar que el oscilador principal siempre esté operando correctamente.
Ante una falla del oscilador principal, entra en funcionamiento el oscilador interno si este fuse está activo.

Se habilita estableciendo el fuse FCMEN en ON.

IESO = "Internal/External Oscillator Switchover" (Conmutador del oscilador Interno/Externo)
1 = Oscillator Switchover mode enabled
0 = Oscillator Switchover mode disabled

Este fuse permite utilizar el oscilador interno al encender el microcontrolador.
Al usar dos velocidades se minimiza el tiempo de latencia de puesta en marcha del oscilador y la ejecución de código, permitiendo que el microcontrolador utilice el oscilador interno como fuente de reloj hasta que el oscilador principal esté disponible.

Se habilita estableciendo el fuse IESO en ON.

Espero haber sido claro y que esta información aclare tus dudas.

Por aquí puedes ver un ejemplo acerca del funcionamiento del fuse FCMEN
Está escrito en otro lenguaje de programación (PICBasic de PROTON IDE) pero te servirá de referencia para aprender que es lo que sucede al activar este fuse.

Suerte.
Hola, muchas gracias, efectivamente has sido muy claro con tu explicación, ahora solo me resta continuar averiguando lo de la interrupción e intentarlo, se que hay varias instrucciones para las interrupciones, hay alguna es especial que creas que me convenga usar y me puedas recomendar?, estaba pensando en la instrucción -int_ra- .

gracias
 
se que hay varias instrucciones para las interrupciones, ¿hay alguna es especial que creas que me convenga usar y me puedas recomendar?, estaba pensando en la instrucción -int_ra- .
El problema con las interrupciones del puerto A (A0<>A5) es que no están disponibles para todos los PIC.
Y para el PIC16F883 que es el que estás usando, no está disponible.

Algo sencillo que puedes hacer, es cambiar la pantalla del puerto B y utilizar la interrupción por RB0.

Suerte.
 
if(input(pin_c0)==1), D@rkbytes una pregunta te hago, yo con lo que llevo leido he podido llegar a la con clusion que ciertas formas de declarar sentencias se pueden acortar y el ejemplo es ese "if" sacado de mas arriba, por que digo esto, por que si se pone asi= if(input(pin_c0)) quiere decir lo mismo y no hace falta poner if(input(pin_c0)==1) y sin embargo por mas que leo no veo un sitio donde se pueda leer esta clase de informacion, que para los que son como yo, que nos gusta este mundo, pienso que nos iria bien conocerlas. ¿que opinas?
 
if(input(pin_c0)==1)con lo que llevo leído he podido llegar a la conclusión que ciertas formas de declarar sentencias se pueden acortar y el ejemplo es ese "if" sacado de mas arriba, ¿por que digo esto?, por que si se pone así; if(input(pin_c0)) quiere decir lo mismo y no hace falta poner if(input(pin_c0)==1)
Así es, por defecto al hacer una comparación con if (input(pin_xx)) se espera que el pin tenga el valor lógico 1 sí no se ha declarado lo contrario con el operador "!" que sería así; if (!input(pin_xx))
Dónde ahora se espera que el pin tenga un valor lógico 0 para que se cumpla la sentencia.
por mas que leo no veo un sitio donde se pueda leer esta clase de información, que para los que son como yo, que nos gusta este mundo, pienso que nos irá bien conocerlas. ¿qué opinas?
Muchas veces por buscar en otros lados, a muchos se les olvida buscar información en el documento de ayuda de compilador.
Por lo general la ayuda del programa suele resolver muchas dudas acerca del funcionamiento de las instrucciones y otras cosas más.

Para no salirnos de tema te recomiendo que leas este curso:
Curso de programación en C para microcontroladores PIC

Suerte.
 
El problema con las interrupciones del puerto A (A0<>A5) es que no están disponibles para todos los PIC.
Y para el PIC16F883 que es el que estás usando, no está disponible.

Algo sencillo que puedes hacer, es cambiar la pantalla del puerto B y utilizar la interrupción por RB0.

Suerte.

Tienes razón, cambiare la pantalla y utilizare la interrupcion que me dices y te mostrare mi progreso mas adelante, muchas gracias darkbytes
 
D@rkbytes, gracias por tu aporte. Ya te digo que es una de las que más he leído.
De todas maneras tengo que decirte que creo que lo que más se hecha de menos, o por lo menos yo así lo veo,
es que cuando se pone un ejemplo no se de una explicación en si, de que quiere decir ese ejemplo.
Creo que es porque los que escriben esos documentos dan por sentado que los que leemos, como yo, sabemos de que va el tema, y la mayoría de veces no es así.

El ejemplo es la explicación que tú das.
por defecto al hacer una comparación con if (input(pin_xx)) se espera que el pin tenga el valor lógico 1 sí no se ha declarado lo contrario con el operador "!" que sería así; if (!input(pin_xx))
Dónde ahora se espera que el pin tenga un valor lógico 0 para que se cumpla la sentencia.
Este dato tan simple lo descubrí después de ver en dos códigos diferentes que hacían la misma función
poniendo ==1 que sin ponerlo, ya que por si el compilador interpreta que si no pones la "!" es un 1 y si la pones es un 0.
 
Última edición por un moderador:
D@rkbytes, gracias por tu aporte. Ya te digo que es una de las que más he leído.
De todas maneras tengo que decirte que creo que lo que más se hecha de menos, o por lo menos yo así lo veo,
es que cuando se pone un ejemplo no se de una explicación en si, de que quiere decir ese ejemplo.
Creo que es porque los que escriben esos documentos dan por sentado que los que leemos, como yo, sabemos de que va el tema, y la mayoría de veces no es así.

El ejemplo es la explicación que tú das.

Este dato tan simple lo descubrí después de ver en dos códigos diferentes que hacían la misma función
poniendo ==1 que sin ponerlo, ya que por si el compilador interpreta que si no pones la "!" es un 1 y si la pones es un 0.

HOLAAAA otra vez por ando por acá, como te había dicho D@rkbytes aquí traigo mi trabajo ya con la interrupción, después de algunos fallos y unos intentos por fin me quedó, lo adjunto por si a alguien que tenga los problemas que yo tenia le pueda servir, en el push de la interrupción le voy a poner un swich para que no se tenga que estar presionando el botón (ya que se tiene que dejar presionado para que se lleve acabo la interrupción).

Te comento que ahora quiero hacer una practica con el pic 16f883 que encienda un led rojo, uno verde y uno azul con pwm pero eh visto que lo hacen en el puerto b casi todo lleno le leds o servos y yo no se mas que usar los 2 módulos ccp osea solo puedo usar 2 leds, como le podría hacer para prender los 3 por el puerto b en pwm?, tendrás algún ejemplo sencillo?,

Nuevamente muchísimas gracias por tu ayuda d@rkbytes
 

Adjuntos

  • TEMP INTERRUPCION.zip
    108.2 KB · Visitas: 27
Lee este tema que creó @dinoelectro:
SUPER DIMMER, dimerizar hasta 16 lampara con un solo PIC

De nada. (y)

Suerte.

Hola, gracias por lo del ejemplo de dinoelectro, es muy bueno su trabajo, estuve tratando de entender su código, ya que algunas cosas no me quedan claras, por ejemplo

1- traté de modificar el código tratando de quitar la parte del paso por cero de la C.A. para solo quedarme con los 4 interruptores de las 4 lamparas y el de aumentar y atenuar
Captura.jpg

ya que solo quiero que al presionar los botones aumente o disminuya la luz y con los swiches activar y desactivar pero no pude, no se exactamente que partes del código eliminar, supuse que tengo que quitar parte de la interrupción, ya que es la que detecta el paso por cero pero no me funcionó, ¿me podrías ayudar con eso? muchas gracias.
Código:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT
#use delay(clock=16mhz)

int1 flanco=0;  //variables
int8 dly=128;

#int_EXT
void  EXT_isr(void) 
{
   output_a(0b00000000);    // se inicializa el puerto a en 0
     if (flanco==1)
{
       ext_int_edge(h_to_l);
         set_timer0(255-dly);
       while(get_timer0()>0);     //espera hasta que timer0 se desborde
     flanco=0;
      if(input(pin_b4)==1)output_high(pin_a0);
       if(input(pin_b5)==1)output_high(pin_a1);
      if(input(pin_b6)==1)output_high(pin_a2);
   if(input(pin_b7)==1)output_high(pin_a3);
   }
   else 
   {
   set_timer0(255-dly);
     while(get_timer0()>0);     //espera hasta que timer0 se desborde
      ext_int_edge(l_to_h);
       flanco=1;
       if(input(pin_b4)==1)output_high(pin_a0);
      if(input(pin_b5)==1)output_high(pin_a1);
     if(input(pin_b6)==1)output_high(pin_a2);
   if(input(pin_b7)==1)output_high(pin_a3);
   }
}


void main()
{
   set_tris_a(0x00);     //Se declara puerto a como salida
   set_tris_b(0xff);     //Se declara puerto b como entrada
  enable_interrupts(global);
   enable_interrupts(int_ext | l_to_h);
   setup_timer_0(rtcc_internal | rtcc_div_128 | rtcc_8_bit);   
   while(true)
   {
      if(input(pin_b1)==0)   //si el pulsador esta en cero, la variable dly aumenta??
      {
        dly++;
        if (dly==255) dly=254; //no pasa de 255
      }
      if(input(pin_b2)==0)
      {
        dly--;
        if (dly==0) dly=1;      //no baja de 1   
      }
   delay_ms(10) ;              //demora antirrebote
   }
}

adjunto archivos

gracias
 

Adjuntos

  • SUPER DIMMER.rar
    2 MB · Visitas: 48
Última edición por un moderador:
Atrás
Arriba