Autor Tema: unas preguntitas :)  (Leído 3174 veces)

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

Desconectado Felipe.aplaplac

  • PIC10
  • *
  • Mensajes: 5
unas preguntitas :)
« en: 06 de Noviembre de 2011, 00:09:11 »
Hola a todos, primero que todo me presento, mi nombre es Felipe estudio ingeniería electrónica.
bueno tengo unas preguntitas para quien pueda ayudarme :)

tengo el siguiente codigo:

#include <18F4550.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES CPUDIV4                  //System Clock by 4
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(crystal=4000000,  clock=1000000)
#define led1   PIN_D0
#define led2   PIN_D1
#define boton   PIN_D2

#fuses nomclr

#int_TIMER1

void  TIMER1_isr(void)
{
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
      output_toggle(led1);
}

void main()
{

   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

   while(1){
            if(input(boton)==1){
            output_toggle(led2);
            delay_ms(1000);
            }
   }
   
}

bueno como ahí dice estoy trabajando con un cristal de 4MHz y el timmer1 que me da un tiempo de overflow de un poco mas de 0.5 seg...
mi pregunta es como poner este timer a precisamente 0.5 seg...
leí por hay que existe un comando para comenzar el timmer desde un valor predeterminado
pero no se cual es :l

bueno y la otra pregunta que tenia es con respecto a algo que he visto en algunos ejemplos...

no entiendo por que "declaran" los puertos. no entiendo esto de declarar...

//Declaramos la posición de los puertos-----------------------
#BYTE PORTA = 0x05
#BYTE PORTB = 0x06
#BYTE PORTA_TRIS = 0x85
#BYTE PORTB_TRIS = 0x86

yo por lo general ocupo el:

#use fast_io(puerto)

alguien podria explicarme estas cositas? :)

bueno de antemano muchas gracias y saludos a todos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: unas preguntitas :)
« Respuesta #1 en: 06 de Noviembre de 2011, 08:42:01 »
  Hola y Bienvenido al foro.

  Yo no uso CCS pero de todos modos trataré de dar mi aporte.
Antes que nada, no es necesario volver a usar la función "setup_timer_1 ()" dentro de la interrupción, ya que el timer queda configurado. Creo que en CCS hay que recurrir a la función "set_timer_1 ()" para asignarle un valor. La idea básica es que si te alcanza con contar 240 para llegar a 0.5 seg y suponiendo que el timer está trabajando en 8 bits tendrías que precargarlo con el valor 15, tanto la primera vez en el programa como cada vez que ingresas a la interrupción.
Pero en realidad no es del todo cierto ya que las instrucciones de carga toman un tiempo por lo tanto también hay que tener en cuenta dicho tiempo así que tal vez tendrías que precargarlo con, digamos 17 o 18. Es cuestión de ir debuggeandolo.

  Respecto a declarar los puertos y los tris, la idea es luego poder llamarlos de una manera más cómoda y poder escribir algo así

Código: C
  1. PORTA = 10;

  en lugar de

Código: C
  1. set_port_a (10);

  no estoy del todo seguro si era así la función de CCS pero algo parecido seguro  :D
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: unas preguntitas :)
« Respuesta #2 en: 06 de Noviembre de 2011, 11:17:12 »
primero debes calcular el timer, existe una calculadora, y paginas webs con calculadoras, yo no recuerdo donde me la baje. Pero manualmente seria asi:


cristal 4Mhz = fosc = 1Mhz


frecuencia timer/8=125khz

periodo=8us

0.5s/8us=62500

valor que le debes poner al timer1 = 65535-62500 = "3035"

ahora cada vez que se produzca el timer1_isr tienes que poner set_timer_1(3035)
no es necesario volver a poner setup_timer dentro de timer1_isr una vez lo configuras no es necesario reconfigurarlo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: unas preguntitas :)
« Respuesta #3 en: 06 de Noviembre de 2011, 12:00:18 »
valor que le debes poner al timer1 = 65535-62500 = "3035"

Es 65536-62500  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: unas preguntitas :)
« Respuesta #4 en: 06 de Noviembre de 2011, 12:15:37 »
yo siempre he puesto 0xFFFF-valor y sin problemas, mas que nada porque ese 1tcy que se queda luego se usa para volver a poner los registros TMR1H y L a su valor, aunque realmente son 2tcy.

Ademas al poner 65536 ya superas el valor INT y trabajas con 3bytes (mas instrucciones). Yo es que soy muy optimizador  8)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: unas preguntitas :)
« Respuesta #5 en: 06 de Noviembre de 2011, 12:46:40 »
La forma correcta para calcular la temporización (Timer1) es PreEscaler*(4/Fosc)*(65536-TMRx)... Después cada uno chamulla como quiere lo hace a gusto  :mrgreen:


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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: unas preguntitas :)
« Respuesta #6 en: 06 de Noviembre de 2011, 13:52:19 »
Ademas al poner 65536 ya superas el valor INT y trabajas con 3bytes (mas instrucciones). Yo es que soy muy optimizador  8)

se supone que ese calculo lo realizas fuera del codigo de tu programa, pero en todo caso lo que yo hago es 65535-tmr1+1 y listo.

ha y lo de declarar los puertos es para poder cambiar el puerto de esta forma

porta=0xff por ejemplo
en lugar de poner
output_a(0xff)
"Nada es imposible, no si puedes imaginarlo"

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: unas preguntitas :)
« Respuesta #7 en: 06 de Noviembre de 2011, 14:04:17 »
Ademas al poner 65536 ya superas el valor INT y trabajas con 3bytes (mas instrucciones). Yo es que soy muy optimizador  8)

Estas pensandolo como humano y no como computador :D

65536 en unsinged int16 es = 0 y se puede aplicar perfectamente  y hacer 0 - TMR. Digo, si te preocupan las optimizaciones...



"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: unas preguntitas :)
« Respuesta #8 en: 06 de Noviembre de 2011, 14:17:00 »
si, pero si tu pones 65536-tmr el compilador lo coge como si fuese mas de un INT, otra cosa muy distinta es que le pongas:
timer=(unsigned int)65536-tmr;

rivale ese calculo lo puedes hacer o no fuera del codigo, si es un valor constante si, pero y si tu idea es variar el timer?

El caso es que para volver a setear los registros TMR1H y L se toman varios Tcy dependiendo si usas una variable o constante, asi que con 65535 tenemos 1tcy de ventaja. Todo esto hablando de precision, porque para precision absoluta habria que ver cuantos tcy necesitamos para que se haga nuestra interrupcion.

Pero no hay que darle mas vueltas uno mas que menos es un error despreciable.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: unas preguntitas :)
« Respuesta #9 en: 06 de Noviembre de 2011, 14:30:55 »
si, comentaba que se hace afuera del programa para el caso especifico de felipe, pero me parecio interezante la poleminca que causo 1 bit que equivale a menos de 1 microsegundo  :D.

pero bueno, espero que le haya quedado claro a felipe como calcular su valor inicial del timer
"Nada es imposible, no si puedes imaginarlo"

Desconectado Felipe.aplaplac

  • PIC10
  • *
  • Mensajes: 5
Re: unas preguntitas :)
« Respuesta #10 en: 06 de Noviembre de 2011, 17:50:44 »
muchas gracias a todos por sus respuestas, entendí como hacer el calculo del tiempo que necesito pero como lo entro al código que estoy usando?

yo lo intente agregando al código el setup_timer_1(3036) dentro de la función timmer1_isr y también lo agregué bajo de setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); en la funcion main, pero funciona y es mas... ya no me funciona el timmer.

me preocupa que sea la version de mi CCS (4.120)

saludos a todos y gracias por las respuestas me han servido de mucho (aun que algunos temas de los que hablan ustedes no los manejo muy bien :P)

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: unas preguntitas :)
« Respuesta #11 en: 06 de Noviembre de 2011, 17:55:29 »
el setup_timer_1 solo lo usas una vez en el programa, para configurar tu timer. para asignarle el valor de inicio al timer usas set_timer1(3036)
"Nada es imposible, no si puedes imaginarlo"

Desconectado Felipe.aplaplac

  • PIC10
  • *
  • Mensajes: 5
Re: unas preguntitas :)
« Respuesta #12 en: 06 de Noviembre de 2011, 18:52:26 »
eso era lo que me faltaba :)
muchas gracias a todos

estoy recién comenzando mi camino por los microcontrolares así que nos veremos pronto.
saludos