Autor Tema: Una consulta rapida sobre Timer0 y ADC  (Leído 4235 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Una consulta rapida sobre Timer0 y ADC
« 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #1 en: 19 de Agosto de 2010, 18:41:37 »
Se puede usar. Seguramente es una mala implementación del código.


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

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #2 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.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #3 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #4 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" );
}
  }
}
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #5 en: 19 de Agosto de 2010, 21:34:46 »
Puede ser que A nunca va a llegar a 1500, máximo 255  :?


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

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #6 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!

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #7 en: 19 de Agosto de 2010, 21:37:45 »
Ooops!! Hola Suki, parece que posteamos a la vez...  :D Saludos!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #8 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!  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #9 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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #10 en: 19 de Agosto de 2010, 22:16:27 »
q boludometro... eso es por no leer..

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #11 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!!  :?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #12 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #13 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!

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Una consulta rapida sobre Timer0 y ADC
« Respuesta #14 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);
}


 

anything