TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kaki en 19 de Agosto de 2010, 18:37:40

Título: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 19 de Agosto de 2010, 18:37:40
Buenas una pregunta rapida:

¿Se puede usar normalmente el Timer 0 cuando uso conversor analogico digital?

Puede ser por eso que no logro hacer andar el Timer 0

Saludos
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: Suky en 19 de Agosto de 2010, 18:41:37
Se puede usar. Seguramente es una mala implementación del código.


Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 19 de Agosto de 2010, 19:27:27
Funcion Interuccion:
Código: [Seleccionar]
int A=0;
#INT_TIMER0
void  TIMER0_isr(void){
 
 A++;
 if (A==1500){
 A=0;                       
 estado = 0;

 }
}

Configuro y le doy valoer con Set_TIMER0.

Código: [Seleccionar]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
set_TIMER0(195); 

No se por que nunca me cambia el estado de la variable ESTADO.
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: AngelGris en 19 de Agosto de 2010, 20:15:30
¿Podés mostrar otra parte del código? pues no veo en que momento la variable estado pueda tomar otro valor distinto de 0.
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 19 de Agosto de 2010, 20:22:51
Código: [Seleccionar]
void main() {
 int i=0;
 char tecla='E';
 char teclaantigua;
 configuracion ();
 write_eeprom(1,Pass2);   //escritura de los mensajes...
   

 
 while (TRUE){
  if (estado == 0){  ////////////////NORMAL
     lcd_gotoxy(1,1);
     lcd_putc("Ingrese Clave:");
teclaantigua = tecla;
     tecla =  TeclaLeida ();
    if (!(tecla == 'A') && !(teclaantigua == tecla)){
Pass[(i)] = Tecla;
         i++;
lcd_gotoxy(i,2);
       lcd_putc("*");
    }
    if (i == 4) {
delay_ms(100);
lcd_putc("\f" );
ComprobarPASS();
        i=0;
}
  }else if(estado == 1){ ///////////Pregunta si quiere cambiar CLAVE
      lcd_gotoxy(2,1);
  lcd_putc("Cambiar Calve:");
      lcd_gotoxy(2,2);
  lcd_putc("Presionar -> #");
     

     
  teclaantigua = tecla;
      tecla =  TeclaLeida ();
  if ((tecla == '#') && !(teclaantigua == tecla)){
          estado = 3;
      lcd_putc("\f" );
      }
     
     
  }else if(estado == 3){ ///////////Cambiar CLAVE

lcd_gotoxy(2,1);
lcd_putc("Nueva Calve:");
 
teclaantigua = tecla;
tecla =  TeclaLeida ();

if (!(tecla == 'A') && !(teclaantigua == tecla)){
         Pass3[(i)] = Tecla;
         i++;
lcd_gotoxy(i,2);
     lcd_putc("*");
    }
    if (i == 4) {
write_eeprom(1,Pass3);
delay_ms(50);
        i=0;
estado = 0;
lcd_putc("\f" );
}
  }
}
}
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: Suky en 19 de Agosto de 2010, 21:34:46
Puede ser que A nunca va a llegar a 1500, máximo 255  :?


Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: bmb en 19 de Agosto de 2010, 21:35:08
Hola kaki, tienes al comienzo declarada la variable A como int y luego tienes un if revisando si A ha llegado a 1500.  Esto no va a pasar nunca porque los valores int solo son de 8 bits (256).  Tendrías que cambiar la declaración de la variable int A=0; por long A=0;.  Luego te preguntaría lo mismo que AngelGris, ya que aunque pusiste algo más de código no se ve como está declarada la variable estado ni en que momento cambia de valor.

Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: bmb en 19 de Agosto de 2010, 21:37:45
Ooops!! Hola Suki, parece que posteamos a la vez...  :D Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: Suky en 19 de Agosto de 2010, 21:39:25
Ooops!! Hola Suki, parece que posteamos a la vez...  :D Saludos!
:D :D Tecleo un poquito más rápido, y aparte de ser más conciso  :tongue:

Saludos!  ;-)
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: AngelGris en 19 de Agosto de 2010, 22:10:23
Ups! yo no me di cuenta de ello, qué gil!!!!!!!!!  :oops:

Me estoy mal acostumbrando al PICC.  :D
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 19 de Agosto de 2010, 22:16:27
q boludometro... eso es por no leer..
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 20 de Agosto de 2010, 00:51:45
no funca!!! no es eso.. debe ser la parte de la configuracion o algo asi!! ya me canse de mirar ejemplos y todos lo tienen como yo nada mas que les anda!!  :?
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: AngelGris en 20 de Agosto de 2010, 09:02:57
Funcion Interuccion:
Código: [Seleccionar]
int A=0;
#INT_TIMER0
void  TIMER0_isr(void){
 
 A++;
 if (A==1500){
 A=0;                       
 estado = 0;

 }
}

Configuro y le doy valoer con Set_TIMER0.

Código: [Seleccionar]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
set_TIMER0(195); 

No se por que nunca me cambia el estado de la variable ESTADO.

Recién ahora estoy viendo lo siguiente. Cuando configurás el Timer0 le das un valor de 195. ¿No tendrías que ponerle el mismo valor dentro de tu rutina de atención de la interrupción?
Así como está, en la primera oportunidad te va a contar desde 195 hasta 256 -y se produce la interrupción- pero luego ya te va a contar desde 0 hasta 256.
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: bmb en 20 de Agosto de 2010, 09:35:48
... Recién ahora estoy viendo lo siguiente. Cuando configurás el Timer0 le das un valor de 195. ¿No tendrías que ponerle el mismo valor dentro de tu rutina de atención de la interrupción?
Así como está, en la primera oportunidad te va a contar desde 195 hasta 256 -y se produce la interrupción- pero luego ya te va a contar desde 0 hasta 256.

No había visto eso... :oops: Además y muy importante:

...  Luego te preguntaría lo mismo que AngelGris, ya que aunque pusiste algo más de código no se ve como está declarada la variable estado ni en que momento cambia de valor.

Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 20 de Agosto de 2010, 12:51:27
tampoco lo probre como dicen pero no anda igua.

Código: [Seleccionar]
#include <18F2550.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(oscillator=4M)
//LCD
#define use_portb_lcd TRUE
#include <lcd.c>
//Libreria STRING
#include <string.h>

//Variables Globales
char Pass[5];
char Pass2[5]={"1111"};
char Pass3[5];
int Estado=0;
int A=0;
//Declaro Funciones
void configuracion ();
int medir ();
char LeerEEPROM ();
void EscribirEEPROM ();
    char TeclaLeida();
    void ComprobarPASS();
void CambiarPASS();

#INT_TIMER0
void  TIMER0_isr(void){
 
 A++;
 if (A==195){
 A=0;                       
 estado = 0;

 }
}


//Principal////////////////////////////////////////////////////////
void main() {
 int i=0;
 char tecla='E';
 char teclaantigua;
 configuracion ();
 write_eeprom(1,Pass2);   //escritura de los mensajes...
   

 
 while (TRUE){
  if (estado == 0){  ////////////////NORMAL
     lcd_gotoxy(1,1);
     lcd_putc("Ingrese Clave:");
teclaantigua = tecla;
     tecla =  TeclaLeida ();
    if (!(tecla == 'A') && !(teclaantigua == tecla)){
Pass[(i)] = Tecla;
         i++;
lcd_gotoxy(i,2);
       lcd_putc("*");
    }
    if (i == 4) {
delay_ms(100);
lcd_putc("\f" );
ComprobarPASS();
        i=0;
}
  }else if(estado == 1){ ///////////Pregunta si quiere cambiar CLAVE
      lcd_gotoxy(2,1);
  lcd_putc("Cambiar Calve:");
      lcd_gotoxy(2,2);
  lcd_putc("Presionar -> #");
     

     
  teclaantigua = tecla;
      tecla =  TeclaLeida ();
  if ((tecla == '#') && !(teclaantigua == tecla)){
          estado = 3;
      lcd_putc("\f" );
      }
     
     
  }else if(estado == 3){ ///////////Cambiar CLAVE

lcd_gotoxy(2,1);
lcd_putc("Nueva Calve:");
 
teclaantigua = tecla;
tecla =  TeclaLeida ();

if (!(tecla == 'A') && !(teclaantigua == tecla)){
         Pass3[(i)] = Tecla;
         i++;
lcd_gotoxy(i,2);
     lcd_putc("*");
    }
    if (i == 4) {
write_eeprom(1,Pass3);
delay_ms(50);
        i=0;
estado = 0;
lcd_putc("\f" );
}
  }
}
}
//Funciones/////////////////////////////////////////////////////////
char TeclaLeida (){
 int valor;
 char TeclaChar;
 
 valor = medir();

if (valor == 0){
TeclaChar = 'A';
}else if (valor < 150){
        TeclaChar = '#';
     }else if (valor<154){
        TeclaChar = '9';
     }else if (valor<160){
        TeclaChar = '6';
     }else if (valor<165){
        TeclaChar = '3';
     }else if (valor<175){
        TeclaChar = '0';
     }else if (valor<180){
        TeclaChar = '8';
     }else if (valor<188){
        TeclaChar = '5';
     }else if (valor<195){
        TeclaChar = '2';
     }else if (valor<205){
        TeclaChar = '*';
     }else if (valor<211){
        TeclaChar = '7';
     }else if (valor<223){
        TeclaChar = '4';
     }else if (valor<233){
        TeclaChar = '1';
}else{
TeclaChar = 'E';
}
     return TeclaChar;
}


int medir () {
    int Medicion=0;
    Medicion = read_adc();
    delay_ms( 50 );
return Medicion;   
}     

void configuracion () {
 //ADC
 setup_adc_ports(AN0|VSS_VDD);
 setup_adc(ADC_CLOCK_DIV_32);
 set_adc_channel(0);
 //TMR0
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
 //LCD
 lcd_init();
}

void ComprobarPASS(){
  if (strcmp(LeerEEPROM(),Pass)== 0 ){
    lcd_gotoxy(4,1);
lcd_putc("Bienvenido");
delay_ms(2000);
lcd_putc("\f" );
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_TIMER0);
    set_TIMER0(195); 
    Estado = 1;
  }else{
    lcd_gotoxy(1,1);
    lcd_putc("La Clave");
    lcd_gotoxy(1,2);
    lcd_putc("es Incorecta.");
delay_ms(2000);
lcd_putc("\f" );
  }
}


char LeerEEPROM (){
char LAST_VOLUME=1;
return read_EEPROM (LAST_VOLUME);
}
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: jhozate en 20 de Agosto de 2010, 12:57:14
ponele el fuse XT porque estas utilizando un cristal de 4Mhz
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: Suky en 20 de Agosto de 2010, 12:59:10
Si sigue sin funcionar, puedes realizar un debug con proteus, ver las variables que valores toman, puede ser un error en el algoritmo. Y también te darás cuenta que el timer funciona.


Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: cerebro en 20 de Agosto de 2010, 13:08:02
Perdón mire muy por encima el código y veo que estas utilizando el puerto b para el LCD pero no lo has inicializado como digital?, si usas el Port B como digital utiliza el fuse NOPBADEN y cambia el fuse de HS por XT como indica jhozate también.

Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 20 de Agosto de 2010, 13:33:41
voy a ver si ago el Debug en proteus... No tengo idea pero busco!! saludos luego le comento

Como ago para apretar el boton mientras estoy haciendo el Debug??
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: willynovi en 20 de Agosto de 2010, 14:37:22
esto lo estas probando en un circuito físico o lo simulas en proteus u otro similar?

Si lo haces físico, podrías usar un pin del PIC como salida y que se cambie de estado cuando entra en la interrupción, y a este le pones un led.
De esa forma si entra a la interrupcion te das cuenta porque parpadea el led.
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 20 de Agosto de 2010, 14:46:34
ago el debug con proteus y noto que nunca entra al Timer 0.  osea todo lo que esta en la funcion de interuccion no cambia!!

Saludos
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: cerebro en 20 de Agosto de 2010, 15:39:39
Alverre...
Código: [Seleccionar]
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
así
Código: [Seleccionar]
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

Cosas de dependencia de funciones  :mrgreen:
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: bmb en 20 de Agosto de 2010, 15:42:16
Tienes configurado a Timer0 asi: setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);.  Si tenemos en cuenta que el Timer0 del PIC18F2550 es de 16 bits funcionando a 4Mhz, el desbordamiento de Timer0 es de:
Tiempo = 4 x 0.00000025 x 65536 x 256 = 16.776 segundos.

Para que estado = 0 con A=195 entonces:
16.776 x 195 = 54 minutos aproximadamente.

Tengo entendido que el Proteus no trabaja en tiempo real, por lo que entrar a esa interrupción le puede tomar mucho tiempo.
para que Timer0 sea de 8 bits debes configuarlo asi: setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);

Saludos!
Título: Re: Una consulta rapida sobre Timer0 y ADC
Publicado por: kaki en 20 de Agosto de 2010, 15:53:32
Gracias a los 2... los dos errores que tenia eran esos!! tienia errores de orden de codigo como digo cerebro , y error de calculo de tiempo como dego bmb!! saludos y gracias!!!