TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
Se puede usar. Seguramente es una mala implementación del código.
Saludos!
-
Funcion Interuccion:
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.
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.
-
¿Podés mostrar otra parte del código? pues no veo en que momento la variable estado pueda tomar otro valor distinto de 0.
-
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" );
}
}
}
}
-
Puede ser que A nunca va a llegar a 1500, máximo 255 :?
Saludos!
-
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!
-
Ooops!! Hola Suki, parece que posteamos a la vez... :D Saludos!
-
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! ;-)
-
Ups! yo no me di cuenta de ello, qué gil!!!!!!!!! :oops:
Me estoy mal acostumbrando al PICC. :D
-
q boludometro... eso es por no leer..
-
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!! :?
-
Funcion Interuccion:
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.
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.
-
... 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!
-
tampoco lo probre como dicen pero no anda igua.
#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);
}
-
ponele el fuse XT porque estas utilizando un cristal de 4Mhz
-
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!
-
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!
-
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??
-
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.
-
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
-
Alverre...
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);así
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
Cosas de dependencia de funciones :mrgreen:
-
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!
-
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!!!