DTForuM


:brindis:    BIENVENIDO AL NUEVO DTForuM -- YA FUNCIONA EL BOTÓN ARCHIVOS -- -- Si tienes alguna duda sobre el uso de este nuevo formato, puedes publicar tu mensaje en MENSAJES PARA EL STAFF ... .... D T F o r u M .... El de siempre, pero mejor !! 
..:: DTForuM.INFO ::.. Manuales de Servicio y toda la Información técnica - Uniendo a los amantes de la electrónica de todo el mundo. From here, to the world !!! 
..:: DTForuM.INFO ::.. Antes de pedir información, búsquela presionando el botón BUSCAR.

..:: DTForuM.INFO ::.. Punto de reunión de amantes de la electrónica.
DESTACADOS, la zona con lo mejor de DTForuM.INFO  ( Hacé click ) ..:: DTForuM.INFO ::.. ..:: 2005- 2006- 2007- 2008- 2009-2010- 2011- 2012- 2013- 2014- 2015- 2016- 2017-2018 ::..
..:: DTForuM.INFO ::.. Uniendo Técnicos desde hace más de 13 años !! ...::DTForuM.INFO::... ...:::La mayor Comunidad de intercambio de Información Técnica:::... El de siempre, pero mejor !!

Premium Membership

Si abona su suscripción

con PAYPAL

solo costará

U$D 18 POR AÑO

Pague con Paypal o con Tarjeta de Crédito de forma SEGURA!

Nota: Si Ud. anula, elimina o desactiva la suscripción, perderá su calidad de Miembro Premium.

¿Qué es PayPal?

SUSCRÍBASE YA !

Otras formas de pago:

Donar + PREMIUM

Conviertase en MIEMBRO PREMIUM y acceda a más de 5 TeraBytes de información, de forma ilimitada.


No cobramos los archivos ni el material que los usuarios suben, solo les pedimos que cada uno pague por el ancho de banda que consume, ya que cada vez es más costoso el bandwidth y no podemos pagar lo que los usuarios descargan sin ningún tipo de control.

Bienvenido(a), Visitante. Por favor, ingresa o regístrate. ¿Perdiste tu email de activación?
noviembre 21, 2018, 07:55:00 am

Ingresar con nombre de usuario, contraseña y duración de la sesión

AllDataSheets

Buscar Datasheet
Buscar en AllDatasheet.com

CuentaDigital

Web Amiga

Clase Nro 10 Curso C para PICs

Visitante · 19 · 14798

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

Lucho2007

  • Visitante
Respuesta #19 on: septiembre 08, 2009, 01:27:40 am
Cargué el Hex del TP37 en el PIC y no leia nada el frecuencimetro, revisando el programa encontré :
TRISA = 0b00000111
le puse:
TRISA = 0b00011111
y funcionó.
Tuve problemas para conseguir el conector BNC para placa por eso lo probé con un cable.
Medí como ven en el video la frecuencia del cristal del PIC del entrenador y lo mide aceptable. Recuerden que el cristal es de 4.00Mhz.
Saludos


[youtube=425,350]U9Wif-PcWgQ[/youtube]


Lucho2007

  • Visitante
Respuesta #18 on: septiembre 06, 2009, 20:36:52 pm
Aqui va el video del TP36

Saludos

[youtube=425,350]lJzni8fh-PI[/youtube]


Lucho2007

  • Visitante
Respuesta #17 on: septiembre 06, 2009, 19:29:35 pm
Mas claro ni el agua
 graciassss                        abrazoo


hector27

  • Visitante
Respuesta #16 on: septiembre 06, 2009, 12:48:27 pm
Una interrupcion de alta prioridad puede interrumpir una interrupcion de baja prioridad, es decir puede ocurrir una "interrupcion de una interrupcion". Esta particularidad no existe en la serie 16Fxxx. La serie 18Fxxxx se puede configurar de ambas maneras, es decir sin prioridades, como la serie 16, en la que si ocurre una interrupcion mientras ocurrió previamente una interrupcion de otro dispositivo, tendrá que esperar que termine la interrupcion previa; o bien con prioridades. En las PCs tenemos algo parecido (no igual), hay interrupciones con prioridades y enmascarables, y una interrupcion que tiene prioridad absoluta y no se puede enmascarar, se trata de la NMI, que incluso puede interrumpirse a si misma:
http://www.eie.fceia.unr.edu.ar/proyectos/apunte-tec-dig/Interrupcionesconel8088.html

Respecto a lo del LAT:
esto:
LATCbits.LATC2 = !LATCbits.LATC2;
debería ser totalmente equivalente a:
 PORTCbits.RC2 =  !PORTCbits.RC2 ;

Y en nuestra aplicacion si bien se comportan de manera equivalente y no notaremos ninguna diferencia, en realidad trabajan de forma difrente.
PORTCbits.RC2 trabaja sobre el puerto y LATCbits.LATC2 trabaja sobre el latch interno.
Es por ello que en algunos casos se puedan notar diferencias, como ser este:
Supongamos que tenemos un pin del puerto C, ej el bit 2 configurado como salida y con él exitamos un led con mucho brillo y por lo tanto consumo de corriente. Esto hace que sobre el pin ya no tengamos 5 V sino mucho menos, por ejemplo 2V.
Ahora supongamos que quiero leer el estado de ese bit del puerto, si lo leo con PORTCbits.RC2 como no tengo ya 5V y leo sobre el puerto, la lectura podría ser un 0, por el contrario si uso LATCbits.LATC2 la lectura sera un 1, no importando lo que pasó en el pin, pues leo el latch.

Esta posibilidad de usar el latch es una ventaja de la serie 18Fxxx, pues la 16Fxxx no tiene nada de eso.

Saludos!
Héctor



Lucho2007

  • Visitante
Respuesta #15 on: septiembre 06, 2009, 02:44:40 am
Estoy en la primera parte de la clase 10 y queria hacer un par de preguntas, conozco algo del tema de las interrupciones, pero con este tipo de microcontroladores, usan el termino de interrupciones de alta prioridad y baja prioridad. Cual es la diferencia entre ellos, a parte de tener cada una un diferente vector de interrupcion? Y otra pregunta . Porque al manejar el puertoC como en el primer programa usas esta instruccion:

//cambio el estado del LED del puerto RC2
      LATCbits.LATC2 = !LATCbits.LATC2;

me refiero a LATCbits.LATC2,, lo tratas como LAT; cual es la diferencia con un puertoA por ejemplo?

 graciassss


hector27

  • Visitante
Respuesta #14 on: agosto 27, 2009, 22:01:27 pm
Finalmente en el programa principal, si llego el tiempo de conteo a un segundo (lo sabemos por el Flags.Bit.Timeout, cuado es igual a 1), calculamos la frecuencia, para ello:

Tomamos el conteo en la variable Lectura:
Lectura=(long)Conteo;

Tomamos el desbordamiento del timer 0 en la variable LecturaH
LecturaH=(long)LecturaDesbordes;

Multiplicamos LecturaH (es decir los desbordamientos del timer 0) por 65536:
LecturaH=LecturaH*65536;

Sumamos ambas variables y tenemos el conteo total en un segundo, es decir la frecuencia
Lectura=Lectura+LecturaH;

Finalmente pasamos la Lectura (que contiene la frecuencia) a ASCII, para poder mostrarlo en el display:
ultoa(Lectura,mybuff);






hector27

  • Visitante
Respuesta #13 on: agosto 26, 2009, 08:38:23 am
Respecto al timer no lo usamos para temporizar (para ello usamos el timer 3), sino para contar pulsos cada segundo. Cada segundo indicado por timer 3 leemos el timer 0 y luego lo ponemos a cero.
Como el timer 0 es solo de 16 bits, no podriamos contar mas que 65535 pulsos por segundo, para poder medir frecuencias mayores debemos contar tambien los desbordamientos (cada vez que superó 65535 pulsos). Eso es lo que hacemos en la interrupcion del timer 0. Si hubo interrupcion de timer 0 es porque se superaron los 65535 pulsos, y entonces cada vez que hubo un desbordamiento lo cuento incrementando una variable, que denominamos ConteoDesbordes:

  if (INTCONbits.TMR0IF)
    {                                   //check for TMR0 overflow
      INTCONbits.TMR0IF = 0;            //clear interrupt flag
     ConteoDesbordes=ConteoDesbordes+1;
    }


hector27

  • Visitante
Respuesta #12 on: agosto 24, 2009, 20:20:30 pm
Respecto al funcionamiento del programa, utilizamos al timer 3 de la misma manera que en el TP anterior utilizabamos el timer0, pero esta vez realizamos 12 interrupciones por segundo:
El timer 3 recibe el clock interno, es decir 24MHz/4= 6MHz
Utiliza preescaler 1:8, por lo cual la frecuencia de conteo será 6MHz/8=0,75MHz => 750KHz
Inicializamos el timer (y cargamos ese valor en cada interrupcion) con 0x0BDC, es decir el timer empezará a contar a partir de ese número y no desde 0. El timer desbordara (es decir superará un conteo de 16 bits) cuando llegue a 0x10000, y cuando desborda produce la interrupcion.
Los pulsos contados hasta que se produce la interrupcion seran 0x10000 - 0x0BDC =0xF424 (en decimal sería 65536 - 3036 =62500).
La frecuencia con la cual se produciran interrupciones será 750000Hz / 62500Hz= 12 Hz
Nosotros necesitamos temporizar cada segundo, por lo cual utilizamos un contador de interrupciones y cada 12 interrupciones será un segundo.
Y cuando detecto este evento que ocurre cada segundo, leo los pulsos externos contados por el timer 0 y sus debordamiento. Teniendo el conteo de pulsos en un segundo, tengo la frecuencia de pulsos en hertz, que es el objetivo del programa.


Dentro de la funcion de interrupcion tenemos:
//Aqui verifico si hubo desborde de timer3 (ocurre 12 veces por segundo)
  if (PIR2bits.TMR3IF)
    {                                   //check for TMR0 overflow
//pongo a cero el flag que indicó la interrupcion del timer3
      PIR2bits.TMR3IF = 0;            //clear interrupt flag
//cargo nuevamente el valor necesario en timer 3 para obtener 12 interrupciones por segundo
   WriteTimer3 (0x0BDC);
//cuento las interrupciones en la variable ContaTick
   ContaTick=ContaTick+1;


//Aqui veo cuando la variable ContaTick llega a contar las 12 interrupciones (1 segundo)
      if(ContaTick==12){
//conte un segundo, cambio el estado del LED para indicarlo
        LATCbits.LATC2 = !LATCbits.LATC2; //toggle LED on RB0
//Vuelvo a 0 la variable Contatick, para repetir el conteo hasta 12 del proximo segundo
        ContaTick=0;
//indico en un flag que llegue al conteo de un segundo
       Flags.Bit.Timeout = 1;            //indicate timeout
//Aqui leo el timer 0 y sus eventuales desbordamientos.
      LecturaDesbordes=ConteoDesbordes;
       Conteo=ReadTimer0 ();
//pongo a cero timer0
      WriteTimer0 ((int)0);
      ConteoDesbordes=0;
      }
    }


hector27

  • Visitante
Respuesta #11 on: agosto 23, 2009, 22:33:09 pm
Para escribir los timers utilizamos:

En el caso del timer 0, al cual lo ponemos a cero en el inicio:
WriteTimer0 ((int)0);

Y para el timer 3:
WriteTimer3 (0x0BDC);

La lectura del timer 0 (que tiene el conteo) lo hacemos con:
Conteo=ReadTimer0 ();


hector27

  • Visitante
Respuesta #10 on: agosto 22, 2009, 14:35:12 pm
DE manera similar, con la funcion OpenTimer3 configuramos el timer3, en este caso la entrada de pulsos es interna al clock de sistema, con un preescaler de 1:8, y con contador de 16 bits.

//tmr3 lect16bits, prescaler 1:8, clock interno, tmr3 on
OpenTimer3(T3_16BIT_RW&T3_SOURCE_INT&T3_PS_1_8);

En la ayuda del MPLab C18 tenemos:

1.2.5        OpenTimer3 (V2, V4)
For TMR_V2 and TMR_V4

Function:
 Configure and enable timer3.
 
Include:
 timers.h
 
Prototype:
 void OpenTimer3( unsigned char config );
 
Arguments:
 config

A bitmask that is created by performing either a bitwise AND operation (‘&’) or bitwise OR operation (‘|’) , which is user configurable, with a value from each of the categories listed below. These values are defined in the file timers.h.
 
 
 Enable Timer3 Interrupt:

            TIMER_INT_ON            Interrupt enabled

            TIMER_INT_OFF          Interrupt disabled

Timer Width:

            T3_8BIT_RW                8-bit mode

            T3_16BIT_RW              16-bit mode

Clock Source:

            T3_SOURCE_EXT          External clock source (I/O pin)

            T3_SOURCE_INT          Internal clock source (Tosc)

Prescale Value:

            T3_PS_1_1                  1:1 prescale

            T3_PS_1_2                  1:2 prescale

            T3_PS_1_4                  1:4 prescale

            T3_PS_1_8                  1:8 prescale
 
 
 Synchronize Clock Input:

      T3_SYNC_EXT_ON                Sync external clock input

      T3_SYNC_EXT_OFF              Don’t sync external clock input
 
Remarks:
 This function configures timer3 according to the options specified and then enables it.
 
File Name:
 t3open.c
 
Code Example:
 With bitwise AND (‘&’) mask:

OpenTimer3( TIMER_INT_ON    &

            T3_8BIT_RW      &

            T3_SOURCE_EXT   &

            T3_PS_1_1       &

            T3_SYNC_EXT_OFF );

 

With bitwise OR (‘|’) mask:

OpenTimer3( TIMER_INT_ON    |

            T3_8BIT_RW      |

            T3_SOURCE_EXT   |

            T3_PS_1_1       |

            T3_SYNC_EXT_OFF );
 

 



hector27

  • Visitante
Respuesta #9 on: agosto 21, 2009, 22:05:06 pm
Con OpenTimer0 configuramos el timer0 en formas sencilla:

//habilito la interrupcion de timer0, contador de 16 bits, ajusto entrada externa de pulsos, conteo con flancos ascendentes,sin preescaler (1:1) e interrupcion de timer0 activada
OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_EXT&T0_EDGE_RISE&T0_PS_1_1&TIMER_INT_ON);

Y aqui tenemos el help de microchip para esta funcion:

1.2.1        OpenTimer0
For TMR_V1, TMR_V2, TMR_V3, TMR_V4, TMR_V5 and TMR_V6

Function:
 Configure and enable timer0.
 
Include:
 timers.h
 
Prototype:
 void OpenTimer0( unsigned char config );
 
Arguments:
 config

A bitmask that is created by performing either a bitwise AND operation (‘&’) or bitwise OR operation (‘|’) , which is user configurable, with a value from each of the categories listed below. These values are defined in the file timers.h.
 
 
 Enable Timer0 Interrupt:

            TIMER_INT_ON             Interrupt enabled

            TIMER_INT_OFF           Interrupt disabled

Timer Width:

            T0_8BIT                       8-bit mode

            T0_16BIT                     16-bit mode

Clock Source:

            T0_SOURCE_EXT           External clock source (I/O pin)

            T0_SOURCE_INT           Internal clock source (Tosc)

External Clock Trigger (for T0_SOURCE_EXT):

            T0_EDGE_FALL             External clock on falling edge

            T0_EDGE_RISE             External clock on rising edge
 
 
 Prescale Value:

            T0_PS_1_1                   1:1 prescale

            T0_PS_1_2                   1:2 prescale

            T0_PS_1_4                   1:4 prescale

            T0_PS_1_8                   1:8 prescale

            T0_PS_1_16                 1:16 prescale

            T0_PS_1_32                 1:32 prescale

            T0_PS_1_64                 1:64 prescale

            T0_PS_1_128               1:128 prescale

            T0_PS_1_256               1:256 prescale
 
Remarks:
 This function configures timer0 according to the options specified and then enables it.
 
File Name:
 t0open.c
 
Code Example:
 With bitwise AND (‘&’) mask:

OpenTimer0( TIMER_INT_OFF &

            T0_8BIT       &

            T0_SOURCE_INT &

            T0_PS_1_32 );

 

With bitwise OR (‘|’) mask:

OpenTimer0( TIMER_INT_OFF |

            T0_8BIT       |

            T0_SOURCE_INT |

            T0_PS_1_32 );
 

 

 



hector27

  • Visitante
Respuesta #8 on: agosto 19, 2009, 08:28:32 am
Este es el TP37, muy similar al anterior, pero se configura el timer 0 como contador de pulsos y el timer 3 como temporizador, obteniendose un frecuencimetro. Lo he probado con frecuencias desde 100 Hz a 200KHz y funciona correctamente.
Los pulsos TTL a medir se ingresan por el conector BNC JP5
La configuracion de los timers, a diferencia del TP anterior, usa las funciones del C18 y no se configuran como en assembler.
A compilar !!!


hector27

  • Visitante
Respuesta #7 on: agosto 16, 2009, 13:46:19 pm
Declaramos una estructura para tener una variable que se usa como flag para que la interrupcion le indique al programa principal cuando se prudujo una interrupcion:

  struct
  {
    unsigned Timeout:1;         //flag to indicate a TMR0 timeout
//    unsigned None:7;
  } Bit;
  unsigned char Byte;


En la interrupcion lo poniamos en 1:


      Flags.Bit.Timeout = 1;            //indicate timeout

Y en el programa principal detectamos cuando está en 1 y si es así lo ponemos en cero:

 while (1)
    {
      if (Flags.Bit.Timeout == 1)
        {                                  //timeout?
          Flags.Bit.Timeout = 0;           //clear timeout indicor
        }
    }

Así como está no sirve a ningun propósito, solo está como ejemplo de como indicarle al programa principal que se produjo una interrupcion.

La estructura de Flags esta dentro de una union, esto es asi porque si declaramos mas flags de un bit, como el del ejemplo, al estar dentro de una union, compartiran la misma direccion de memoria, lo que nos ahorra el consumo de la misma.
Las uniones son parecidas a las estructuras, y no fueron vistas con las practicas de C en la PC, pero dada una consulta de lucho2007 se comentaron aqui:

http://www.dtforum.info/index.php?topic=80230.msg1010817853#msg1010817853



hector27

  • Visitante
Respuesta #6 on: agosto 15, 2009, 12:23:02 pm
Poniendo a 1 el bit 7 (GIE) del registro INTCON habilitamos las interrupciones, de la misma manera que lo hacemos en assembler

INTCONbits.GIE = 1;          //enable interrupts


Como no usamos ningun periferico, no habilitamos ninguna interrupcion de los mismos, por lo tanto los registros PIE estaran a cero:

PIE1=0b00000000;
PIE2=0b00000000;




hector27

  • Visitante
Respuesta #5 on: agosto 12, 2009, 19:43:09 pm
//aqui configuramos el registro INCON para habilitar la interrupcion de timer 0
INTCON=   0b00100000;


//Aqui configuramos el regitro INTCON2 para darle alta prioridad al timer 0 y no ponemos las resistencias de pull up en puerto B
INTCON2 = 0b10000100;  //TMR0 high priority

//Configuramos INTCON3
INTCON3=0b00000000;

//Configuramos RCON, eligiendo el sistema de interrupcion con prioridades, propio de la serie 18Fxxx (de otra manera seria compatible con la serie 16F, es decir sin prioridades.
RCONbits.IPEN = 1;            //enable priority levels

//Inicializamos el valor del timer 0
TMR0H = 0;                    //clear timer
TMR0L = 0;                    //clear timer


Tags: