Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

07/06/2011 #1


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



Código 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 
1lcd_putc("fConfigurar
minutos?" 
);      //minutos
               
if(!input(PIN_A5)){
                  while(!
input(PIN_A5)){}
                  
minutos();
                  
menu=2;                     

   
//apunta siguiente opcion
                  
}
               break;
         case 
2lcd_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

07/06/2011 #2
Moderador

Avatar de Chico3001

De entrada esta parte deberia ser asi:
Código PHP:
if(!input(PIN_A3)){            //controla el boton up...
         
while(!input(PIN_A3));
         
menu++;
         if(
menu>2){
            
menu=0;
}
         }                     
//...para mostrar menu 
08/06/2011 #3


grasias y pudes sugerirme o decirme si esta bien el void mm y do por q creoq ahi esta el error pero no lo veo muy claro
08/06/2011 #4
Moderador

Avatar de Chico3001

no veo ninguna funcion void mm
29/11/2013 #5


Temporizador pic de un minuto
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
Imágenes Adjuntas
Tipo de Archivo: jpg conexion.jpg (100,2 KB (Kilobytes), 22 visitas)
Archivos Adjuntos
Tipo de Archivo: rar TEMPORIZADOR PANTALLA.rar (111,0 KB (Kilobytes), 34 visitas)
29/11/2013 #6

Avatar de aguevara

ayudaria mas si indicas cuales son los errores que marca ccs
30/11/2013 #7
Moderador

Avatar de D@rkbytes

arturkick dijo: Ver Mensaje
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
}
arturkick dijo: Ver Mensaje
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++;
}
arturkick dijo: Ver Mensaje
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.
30/11/2013 #8


D@rkbytes dijo: Ver Mensaje
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

aguevara dijo: Ver Mensaje
ayudaria mas si indicas cuales son los errores que marca ccs
Gracias por responde amigo
01/12/2013 #9
Moderador

Avatar de D@rkbytes

arturkick dijo: Ver Mensaje
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.
arturkick dijo: Ver Mensaje
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.
01/12/2013 #10


D@rkbytes dijo: Ver Mensaje
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
02/12/2013 #11
Moderador

Avatar de D@rkbytes

arturkick dijo: Ver Mensaje
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.
02/12/2013 #12


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?
02/12/2013 #13
Moderador

Avatar de D@rkbytes

miglo dijo: Ver Mensaje
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.
miglo dijo: Ver Mensaje
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.
02/12/2013 #14


D@rkbytes dijo: Ver Mensaje
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
03/12/2013 #15


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.
D@rkbytes dijo: Ver Mensaje
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.
10/12/2013 #16


miglo dijo: Ver Mensaje
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
Archivos Adjuntos
Tipo de Archivo: zip TEMP INTERRUPCION.zip (108,2 KB (Kilobytes), 24 visitas)
11/12/2013 #17
Moderador

Avatar de D@rkbytes

arturkick dijo: Ver Mensaje
¿cómo le podría hacer para prender los 3 por el puerto b en pwm?
¿tendrás algún ejemplo sencillo?
Lee este tema que creó dinoelectro:
SUPER DIMMER, dimerizar hasta 16 lampara con un solo PIC
arturkick dijo: Ver Mensaje
Nuevamente muchísimas gracias por tu ayuda D@rkbytes.
De nada.

Suerte.
11/12/2013 #18


D@rkbytes dijo: Ver Mensaje
Lee este tema que creó dinoelectro:
SUPER DIMMER, dimerizar hasta 16 lampara con un solo PIC

De nada.

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


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
Imágenes Adjuntas
Tipo de Archivo: jpg Captura.jpg (130,3 KB (Kilobytes), 80 visitas)
Archivos Adjuntos
Tipo de Archivo: rar SUPER DIMMER.rar (2,05 MB (Megabytes), 46 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.