Autor Tema: TIMER0 en pic 16f88 [SOLUCIONADO]  (Leído 2206 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
TIMER0 en pic 16f88 [SOLUCIONADO]
« en: 13 de Enero de 2018, 19:30:27 »
Hola buenas noches, llevo un tiempo intentando que me funcione la interrupción del timer0 y no consigo que me funcione, el led se me queda encendido aunque el programa entre en la interrupción, alguien puede decirme donde esta el error.
Código: C
  1. /*
  2.  * File:   test_TMR0.c
  3.  * Author: miquel-padawan
  4.  * Microcontrolador: PIC16F88
  5.  * Created on 7 de enero de 2018, 21:43
  6.  */
  7.  
  8.  
  9. #include <xc.h>
  10.  
  11. #define _XTAL_FREQ 4000000 // Indicamos a que frecuencia de reloj esta funcionando el micro
  12. //#define LED PORTAbits.RA0
  13.  
  14. // PIC16F88 Configuration Bit Settings
  15. // CONFIG1
  16. #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
  17. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  18. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  19. #pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
  20. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  21. #pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
  22. #pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
  23. #pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
  24. #pragma config CCPMX = RB0      // CCP1 Pin Selection bit (CCP1 function on RB0)
  25. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  26.  
  27. // CONFIG2
  28. #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
  29. #pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode enabled)
  30.  
  31. //unsigned char cuenta;       // Declaro una variable "cuenta"
  32.  
  33. // FUNCION DE INTERRUPCION
  34. void interrupt ISR(void) {
  35.     //cuenta++;                   // Incremento variable
  36.     //if(cuenta == 10){           // Comprobamos si la variable "cuenta" ha llegado a 10
  37.             PORTAbits.RA0 = PORTAbits.RA0+1;
  38.             //LED = LED+1;        // Cambiamos el led de estado
  39.             //cuenta = 0;         // Reiniciamos contador
  40.     //}
  41.     TMR0 = 0;                   // Inicializamos TMR0
  42.     INTCONbits.TMR0IF = 0;      // Limpiamos bandera de desborde
  43. }
  44.  
  45. // FUNCION PRINCIPAL
  46. void main(void) {
  47.    
  48. // CONFIGURAMOS PUERTOS
  49.     TRISA = 0b00000000;     // Puerto A todo salidas
  50.     PORTA = 0;              // Limpiamos todo el puerto A
  51.    
  52. // CONFIGURAMOS TMR0 & INTERRUPCION
  53.     INTCONbits.TMR0IE = 1;      // Habilitamos interrupcion TMR0
  54.     OPTION_REGbits.PSA = 0;     // Asignamos prescaler al Timer
  55.     OPTION_REGbits.PS0 = 1;
  56.     OPTION_REGbits.PS1 = 1;
  57.     OPTION_REGbits.PS2 = 1;     // Usamos prescaler 1:256
  58.     OPTION_REGbits.T0CS = 0;    // Internal instruction cycle clock (CLKO)
  59.     INTCONbits.TMR0IF = 0;      // Limpiamos bandera de desborde
  60.     INTCONbits.GIE = 1;         // Habilitamos interrupcion global
  61.     TMR0 = 0;                   // Inicializamos el timer a 0
  62.    
  63.     while (1);   // Bucle infinito
  64. }
Gracias.
« Última modificación: 14 de Enero de 2018, 17:59:38 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re:TIMER0 en pic 16f88
« Respuesta #1 en: 14 de Enero de 2018, 10:38:27 »
Hola, esa instrucción
Código: C
  1. PORTAbits.RA0 = PORTAbits.RA0+1;
no me convence, por que no intenta con un XOR

Código: C
  1. PORTAbits.RA0 ^= 1;

Otra cuestión a tener en cuenta es el tiempo de desborde del TMR0 si es muy rápido tal vez no puede ver que el LED se apaga
« Última modificación: 14 de Enero de 2018, 10:41:49 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:TIMER0 en pic 16f88
« Respuesta #2 en: 14 de Enero de 2018, 12:45:48 »
Hola sander probé con la opción de xor y me hacia lo mismo por este motivo opte por usar el
Código: C
  1. PORTAbits.RA0 = PORTAbits.RA0+1
para probar, el tiempo de desborde creo tenerlo de forma correcta, incluso como puedes ver probé con repetir la cuenta 10 veces por si fuera que corriera muy rapido el timer. De todos modos sigo probando de hacerlo funcionar.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re:TIMER0 en pic 16f88
« Respuesta #3 en: 14 de Enero de 2018, 15:29:49 »
Otra cosa es que el pin RA0 es analógico, por defecto esta configurado como analógico, proba poniéndolo como digital antes de configurar el TRISA.

eso se hace haciendo ANSEL = 0

Respecto al tiempo de desborde del TMR0,  con un preescaler de 256, y el reloj de 4 MHz tienen un tiempo de aproximadamente 65 ms, tiene que habilitar la rutina de cuenta para que pueda ver el parpadeo
« Última modificación: 14 de Enero de 2018, 15:45:21 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:TIMER0 en pic 16f88
« Respuesta #4 en: 14 de Enero de 2018, 17:08:57 »
Gracias sander ahora si, no se porque pero veía como pines analógicos el puerto B en vez del puerto A y para colmo el led se encendía aunque no parpadeara, y estaba ofuscado en que el problema estaba en la interrupción.
Código: C
  1. /*
  2.  * File:   test_TMR0.c
  3.  * Author: miquel-padawan
  4.  * Microcontrolador: PIC16F88
  5.  * Created on 7 de enero de 2018, 21:43
  6.  */
  7.  
  8.  
  9. #include <xc.h>
  10. #include "config_bits.h"
  11.  
  12. #define _XTAL_FREQ 4000000  // Indicamos a que frecuencia de reloj esta funcionando el micro
  13.  
  14. unsigned char cuenta;       // Declaro una variable "cuenta"
  15.  
  16. // FUNCION DE INTERRUPCION
  17. void interrupt Timer0(void) {
  18.     if(INTCONbits.TMR0IF == 1){     // Comprobamos si hay desborde en el timer0
  19.         cuenta ++;                  // Incrementamos la variable "cuenta"
  20.         if(cuenta == 10){           // Comprobamos si la variable "cuenta" a llegado a 10
  21.             PORTAbits.RA0 = PORTAbits.RA0 + 1;  // Cambiamos de estado el pin RA0
  22.             cuenta = 0;             // Reiniciamos variable cuenta
  23.         }
  24.     }
  25.     TMR0 = 0x00;                // Cargamos TMR0 con valor 0x00
  26.     INTCONbits.TMR0IF = 0;      // Borramos bandera de desborde del TIMER
  27. }
  28.  
  29. // FUNCION PRINCIPAL
  30. void main(void) {
  31.    
  32. // CONFIGURAMOS PUERTOS
  33.     ANSEL = 0x00;               // Configuramos todo el PORTA como digital
  34.     TRISA = 0x00;               // Puerto A todo salidas
  35.     PORTA = 0x00;               // Limpiamos todo el puerto A
  36.    
  37. // CONFIGURAMOS TMR0 & INTERRUPCION
  38.     INTCONbits.TMR0IE = 1;      // Habilitamos interrupcion TMR0
  39.     OPTION_REGbits.PSA = 0;     // Asignamos prescaler al Timer
  40.     OPTION_REGbits.PS0 = 1;
  41.     OPTION_REGbits.PS1 = 1;
  42.     OPTION_REGbits.PS2 = 1;     // Usamos prescaler 1:256
  43.     OPTION_REGbits.T0CS = 0;    // Internal instruction cycle clock (CLKO)
  44.     INTCONbits.TMR0IF = 0;      // Limpiamos bandera de desborde
  45.     INTCONbits.GIE = 1;         // Habilitamos interrupcion global
  46.     TMR0 = 0x00;                // Inicializamos el timer a 0
  47.    
  48.     while (1);                  // Bucle infinito
  49. }

Nuevamente Muchas Gracias.
« Última modificación: 14 de Enero de 2018, 18:04:34 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.