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

Temas similares

10/03/2014 #1

Avatar de jjcordoba

ayuda con programa en mikroc
buenas estoy tratando hacer un programa el cual al contrar 20 pulsos por el pin RA4 me desactive el puerto B por un tiempo. este es el codigo que llevo hasta el momento, muchas gracias por la ayuda

Código:
void main( void ){
char TEST = 20;           // Constante TEST = 20
//Configuración de puertos.

          OSCCON = 0b01110110;                //Oscilador interno a 4MHz

          ANSEL  = 0;                 //Configura portA como digital
          ANSELH = 0;                 //configura los demas puertos como digitales

          TRISA  = 0xFF;              // PORTA is input
          TRISB  = 0x00;              // PORTb is out
          TRISC  = 0xFF;              // PORTC is input
          TRISD  = 0xFF;              // PORTD is input
          TRISE  = 0xFF;              // PORTE is input

          PORTA = 0;
          PORTB = 0;
          PORTC = 0;
          PORTD = 0;
          PORTE = 0;

          OPTION_REG = 0;            //Activación de las resistencias PULL-UP del puerto B.
          
          OPTION_REG.F5 = 1;       // Contador TMR0 recibe los pulsos por el pin RA4
          OPTION_REG.F3 = 1;       // Valor del pre-escalador 1:1
          
          TMR0 = 0;                // Reiniciar el temporizador/contador TMR0
          
       do {
       PORTB = 0b00001111;
       if (TMR0 == TEST)      // ¿Coincide el número en el temporizador con la constante TEST?
       PORTB = 0b00000000;    // Números coinciden. Poner el RB en cero
       Delay_ms(3000);        // Tiempo de retardo de 3000mS

       }
       while (1);               // Quedarse en el bucle infinito
}
...
10/03/2014 #2

Avatar de ByAxel

Hola.
Cuál es el problema exactamente? bueno a simple vista hace falta las llaves del IF que encierren a PORTB... y Delya_ms...
Sucede que casi siempre se ejecuta Delay_ms(3000) y como TMR0 cuenta por si solo, es muy dificil que coincida la comparación del IF cuando el TMR0 sea 20... puede que sea mayor... puede que sea menor...
10/03/2014 #3

Avatar de jmth

No sé yo eso de que el preescalador esté en 1:1, primero hay que configurar el OPTION_REG para que use el reloj del WDT en PSA (que yo deshabilito), la entrada por RB4 ya la tienes (en T0CS) y los 3 primeros (F0-F2) bits del OPTION_REG tendrían que estar en 000 para que el prescaler sea de 1:1. Así lo hice yo, asigné el 000 para asegurarme. Si no configuras el uso del WDT, se toma el reloj oscilador y el prescaler es de 1:2.

¿Has probado a declarar "test" como int? ¿Y luego forzar el registro del TMR0 a ser un int?
test = (int)TMR0

Por cierto, cuando solicites ayuda indica un poco cuál es el problema, será mucho más fácil que ponernos a mirar un código entero.
10/03/2014 #4

Avatar de jjcordoba

el problema que estoy teniendo es que no se me desactiva el puerto B de hecho tengo la simulación en proteus, que igual manera la subo

---------- Actualizado después de 6 minutos ----------

la idea es que por el puerto b este activando un relay al poner el s1 en posición de los leds se genere el pulso con el cual prendo y apago, tomo este pulso y lo ingreso por RA4 al micro y cuando este halla contado 20 pulsos desactive el puerto b, acabo de probar la propuesta de (int)TMR0 e int tets y no me funciono, muchas gracias por su ayuda
Imágenes Adjuntas
Tipo de Archivo: jpg Captura.jpg (124,7 KB (Kilobytes), 5 visitas)
Archivos Adjuntos
Tipo de Archivo: rar micro flasher.rar (22,2 KB (Kilobytes), 2 visitas)
10/03/2014 #5

Avatar de jmth

Creo que las llaves entre el do while y el if no están correctas. Además según está propuesto, una vez cuente por primera vez los 20 pulsos y haga lo que hay dentro del if, seguirá aumentando el contador y no se volverá a dar la igualdad, hay que incluir un TMR0=0 tras los 3 segundos.
10/03/2014 #6

Avatar de ByAxel

Idem... Insisto con eso de las llaves del IF... como el PIC pierde más tiempo en el Delay no hay cuando se entere que ha llegado el conteo a 20...
Aísla solo el delay para cuendo IF se cumple y no fuera todo el tiempo.

PD. IF sin llaves solo ejecuta la siguiente instrucción, no todas...
10/03/2014 #7

Avatar de jmth

Puedes usar if TMR0 >= test para asegurarte de que se ejecuta cuando se supera el conteo, y resetear a 0.
13/03/2014 #8

Avatar de jjcordoba

muchas gracias por su ayuda ya corregi el programa con sus sugerencias y logre el objetivo.
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.