Autor Tema: TMR0 y PIC 18F4520  (Leído 3444 veces)

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

Desconectado hironakamura2009

  • PIC10
  • *
  • Mensajes: 13
TMR0 y PIC 18F4520
« en: 30 de Octubre de 2012, 20:28:36 »
Que tal compañeros foreros, vengo con unas dudas tremendas con el timer 0 en un PIC 18f4520, ya que no lo he manejado y he leído sobre como realizarlo pero en pics de la familia 16f, y todos incluyen unas cosas mas otras menos, y quisiera que me pudieran explicar como realizarlo, ya que hice uno y lo simule en proteus, pero difiere el tiempo que he establecido de 500us hasta 682.92us, el cristal que uso es de 12Mhz, el código es:

#include <18f4520.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP           //Configuramos los fuses
#use delay (clock=12000000)                //Oscilador a 12Mhz

#use fast_io(b)                           //Optimizamos E/S del PORTB

 

#define LED1 PIN_B0                       //Llamamos al PIN_B0 como Led1
//——Variables——————-

//——Funciones——————-
#int_TIMER0
void  TIMER0_isr(void)
{
    output_toggle(LED1);                  //Cambiamos el estado del Led1
}

void config(){                 //Configuración del dispositivo

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8|RTCC_8_bit);
enable_interrupts(INT_TIMER0);      //Habilita la interrupción    
enable_interrupts(GLOBAL);          //Activa las interrupciones anterriores
set_tris_b (0x00);                  //Puerto b como salidas
output_b(0x00);                     //Limpiamos el puerto b enviando “0?
}

//——Programa principal———-
void main(void) {
    config();                       //Configuración del dispositivo
    set_TIMER0(67); //inicializa el timer0
    //el bucle infinito es necesario para no entrar en modo sleep
    while(true);
}

}

El código lo encontré en internet, lo implemente y lo probe en proteus, el resultado fue:



Espero me puedan ayudar, si tengo algún error en el código háganme saber por favor....

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: TMR0 y PIC 18F4520
« Respuesta #1 en: 31 de Octubre de 2012, 00:08:01 »
Hola hironakamura2009, de momento puedo ver un par de errores en tu programa.  Primero debes cambiar el fuse XT por HS y luego debes quitar la instrucción set_TIMER0(67); del bucle while y colocarla dentro de la interrupción. Te quedarían las instrucciónes así:

Código: C
  1. #fuses HS,NOWDT,NOPROTECT,NOLVP           //Configuramos los fuses
  2. .
  3. .
  4. .
  5. #int_TIMER0
  6. void  TIMER0_isr(void)
  7. {
  8.     output_toggle(LED1);                  //Cambiamos el estado del Led1
  9.     set_TIMER0(67);                       //inicializa el timer0
  10. }

Saludos!

Desconectado hironakamura2009

  • PIC10
  • *
  • Mensajes: 13
Re: TMR0 y PIC 18F4520
« Respuesta #2 en: 31 de Octubre de 2012, 00:13:46 »
Hola hironakamura2009, de momento puedo ver un par de errores en tu programa.  Primero debes cambiar el fuse XT por HS y luego debes quitar la instrucción set_TIMER0(67); del bucle while y colocarla dentro de la interrupción. Te quedarían las instrucciónes así:

Código: C
  1. #fuses HS,NOWDT,NOPROTECT,NOLVP           //Configuramos los fuses
  2. .
  3. .
  4. .
  5. #int_TIMER0
  6. void  TIMER0_isr(void)
  7. {
  8.     output_toggle(LED1);                  //Cambiamos el estado del Led1
  9.     set_TIMER0(67);                       //inicializa el timer0
  10. }

Saludos!


Gracias por responder, lo tomare en cuenta, lo simulare haber si reacciona  :-/....

Desconectado hironakamura2009

  • PIC10
  • *
  • Mensajes: 13
Re: TMR0 y PIC 18F4520
« Respuesta #3 en: 31 de Octubre de 2012, 00:32:26 »
Hola hironakamura2009, de momento puedo ver un par de errores en tu programa.  Primero debes cambiar el fuse XT por HS y luego debes quitar la instrucción set_TIMER0(67); del bucle while y colocarla dentro de la interrupción. Te quedarían las instrucciónes así:

Código: C
  1. #fuses HS,NOWDT,NOPROTECT,NOLVP           //Configuramos los fuses
  2. .
  3. .
  4. .
  5. #int_TIMER0
  6. void  TIMER0_isr(void)
  7. {
  8.     output_toggle(LED1);                  //Cambiamos el estado del Led1
  9.     set_TIMER0(67);                       //inicializa el timer0
  10. }

Saludos!


Gracias por responder, lo tomare en cuenta, lo simulare haber si reacciona  :-/....


Lo de HS ya lo había cambiado, solo faltaba lo del while, pero gracias por tu consejo, ya funciona bien, no exacto supongo por el tiempo de las instrucciones y no se hasta que frecuencia podría sacar con el timer 0, porque quise sacar 1us y no me los daba, ¿como podría saber el limite?Tengo entendido que puedo utilizar el modulo PWM del PIC.

Gracias...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TMR0 y PIC 18F4520
« Respuesta #4 en: 31 de Octubre de 2012, 09:01:45 »

Lo de HS ya lo había cambiado, solo faltaba lo del while, pero gracias por tu consejo, ya funciona bien, no exacto supongo por el tiempo de las instrucciones y no se hasta que frecuencia podría sacar con el timer 0, porque quise sacar 1us y no me los daba, ¿como podría saber el limite?Tengo entendido que puedo utilizar el modulo PWM del PIC.

Gracias...

  El tiempo que puedes contar dependerá de la frecuencia de trabajo, de si utilizas o no presscaler. En algunos pic18F el timer0 puede trabajar en 8 o 16 bits, por lo tanto la cuenta también dependerá de ello (aunque afectaría al máximo tiempo que pueda contar y no al mínimo).

  Por lo general, la entrada del timer puede seleccionarse entre un pin o la frecuencia de trabajo (que no es la misma que la del cristal).

  Para saber el tiempo mínimo se puede recurrir a lo siguiente.... T = 1/((frecuencia de entrada/prescaler)/cantidad de cuentas) o T = 1/frecuencia * prescaler * (cantidad de cuentas) .  Siendo cantidad de cuentas, el valor total que puede contar el timer0 - (menos) el valor preseteado.

  Obviamente ello será un estimativo, ya que hay que agregarle el tiempo que consuman las instrucciones.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado hironakamura2009

  • PIC10
  • *
  • Mensajes: 13
Re: TMR0 y PIC 18F4520
« Respuesta #5 en: 31 de Octubre de 2012, 15:13:37 »

Lo de HS ya lo había cambiado, solo faltaba lo del while, pero gracias por tu consejo, ya funciona bien, no exacto supongo por el tiempo de las instrucciones y no se hasta que frecuencia podría sacar con el timer 0, porque quise sacar 1us y no me los daba, ¿como podría saber el limite?Tengo entendido que puedo utilizar el modulo PWM del PIC.

Gracias...

  El tiempo que puedes contar dependerá de la frecuencia de trabajo, de si utilizas o no presscaler. En algunos pic18F el timer0 puede trabajar en 8 o 16 bits, por lo tanto la cuenta también dependerá de ello (aunque afectaría al máximo tiempo que pueda contar y no al mínimo).

  Por lo general, la entrada del timer puede seleccionarse entre un pin o la frecuencia de trabajo (que no es la misma que la del cristal).

  Para saber el tiempo mínimo se puede recurrir a lo siguiente.... T = 1/((frecuencia de entrada/prescaler)/cantidad de cuentas) o T = 1/frecuencia * prescaler * (cantidad de cuentas) .  Siendo cantidad de cuentas, el valor total que puede contar el timer0 - (menos) el valor preseteado.

  Obviamente ello será un estimativo, ya que hay que agregarle el tiempo que consuman las instrucciones.

Gracias por tomarte el tiempo en responder compañero, lo del calculo del tiempo también ya lo había visto, mi duda era el código básico para generar una interrupción continua, ya que siempre tienen algún cambio en el código y hay ciertas instrucciones que no las conozco. Porque lo que quiero es generar una señal para un triac (para hacer un dimmer), pero quiero que el tiempo dependa de un potenciometro conectado a AN0, el caso que dependa de una variable, detecto el pase por cero con pulsos positivos:



Utilizo el ADC de AN1 para hacer que cuente, porque lo hice con delay, cunado AN1 es <=30 (le doy tiempo de que lea un valor cercano a 0). La cosa es que quisiera hacerlo con el timer 0, en mi PIC solo es de 8 bits.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: TMR0 y PIC 18F4520
« Respuesta #6 en: 01 de Noviembre de 2012, 23:49:40 »


Porque no utilizas el módulo PWM de este micro, con este puedes controlar el triac

Saludos!!!
Un saludo desde Pereira - Colombia


 

anything