TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: gioalex07 en 12 de Febrero de 2018, 23:30:56

Título: Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 12 de Febrero de 2018, 23:30:56
Hola comunidad,  estoy ingresando al mundo de atmel y micros de 8 bits, como primera parte se quiere saber cual es la frecuencia de una onda cuadrada por medio del uso de timers. He hecho la posible configuracion de TC0 y TC2 pero no se como llevarlo a cabo ya que no comprendo como puedo exportar el tiempo o el conteo del timer y usarlo para determinar dicha frecuencia y a su vez poder mostrarla en un lcd 2x16

agradezco puedan ayudarme ya que no existe mucha informacion para poder manejarlos de manera correcta.


#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
char variable = 0;

int main(void){
   CLKPR = 1 << CLKPCE; // Configuracion de prescaler bit 7
   CLKPR = 0; // Division del prescaler en 1
   TCCR0A = 0;
   TCCR0B = 0b00000101; //Determina conteo por flancos de subida
   TIMSK0 = (1<<TOIE0); //Habilitacion de la interrupcion
   TIFR0 = (1<<TOV0); // Flancos de voltaje
   TCNT0 = 0; // Timer reseteado en 0
   TCCR2A = 0;
   TCCR2B = 0b00000111; // Prescalizado 1024
   TIMSK2 = (1<<TOIE2); //Habilitacion de la interrupcion
   TCNT2 = 0; // Timer reseteado en 0
   sei();
   DDRA |= 1;
   DDRB = _BV(PB0);
   PORTB |= 0b00000000;
   PORTA |= 0b00000001;
   lcd_init(LCD_DISP_ON);
   lcd_clrscr();
   lcd_home();
   lcd_gotoxy(0,0);
   lcd_puts("Frecuencia:");
   
    while (1) {
            
    }
}
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 13 de Febrero de 2018, 07:02:12
¿Qué frecuencias quieres medir?
¿Con cuánta precisión?

¿Qué micro estás utilizando, un Atmega328?
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 13 de Febrero de 2018, 14:31:03
Se quiere medir la frecuencia de la toma de pared (60 Hz), ya se hizo la etapa de rectificación y cambio a señal cuadrada para que ingrese al puerto PB0 - T0 .. la precisión no sabria como manejar ya que hasta el momento estoy comprendiendo la prescalizacion del contador..

Gracias

*mi idea era usar TCNT0 para contar flancos de subida y TCNT2 para saber cuanto tiempo tardo entre flancos asi determinaría el periodo y por ende la frecuencia pero no se como lograrlo

** idealmente deberia mostrarme la frecuencia de cualquier señal
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: AleSergi en 13 de Febrero de 2018, 14:50:04
....  mundo de Atmel...  ,  ya fue,  ahora es  AVR Microchip  (muy a mi pesar! )

La historia por la cual preguntás,  esta en rumbo,  pero no es el camino mejor.

Resulta ser que muchos AVR,  tienen un hardware llamado ICP,  en modo "capture event"  hace lo que estás preguntando.
Entonces,  se pone a correr el Tmr1,  la fuente es el oscilador del micro,  con o sin pre-escalador según tu necesidad, se activa la interrupción de éste hardware,  cuando se presenta un evento en el pin icp,  dispara la interrupción,  del Tmr1 copias el valor al momento de la interrupcion,  pones a cero el Tmr1,  tambien has activado la interrupcion por desborde del Tmr1 y obvio agendas su ocurrencia.
Ahora con esos números haces los cálculos y obtenés el tiempo ocurrido entre dos eventos que ocurren en el pin icp.

mira los enlaces que dejo,  Yo lo aprendi de allí,  hasta código tienen.

http://www.nerdkits.com/forum/thread/1273/

http://www.avrprojects.net/index.php/avr-learn/getting-started-with-avr/51-programming-the-timer-counter-1?showall=1


 
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 13 de Febrero de 2018, 16:31:48
Algunos comentarios:

1º. Es muy importante que el detector de cruce por cero sea muy exacto para evitar jitter.
Intenta filtrar el ruido de alta frecuencia para que no te afecte.

2º La precisión de la frecuencia de red es bastante baja. Con 4 ó 5 decimales tendrás suficiente.
A la larga se ajusta la frecuencia para que el desfase sea pequeño y se pueda usar como base de los relojes, pero en tiempos cortos la frecuencia varía mucho.

Yo lo haría contando pulsos de reloj entre cruces por cero pares (uno de cada dos) de la señal de red.
Si lo haces con todos los cruces por cero no funcionará bien porque la onda no es simétrica.

Si utilizas un reloj de 10MHz, contarás unos 166666 ciclos cada dos cruces por cero (como te dijo AleSergi con el TMR1 y su desbordamiento).

Después la fórmula es:

   Frecuencia de red = Frecuencia de reloj / Ciclos contados =  10000000/166666 = 60.0000

Con numeros flotantes de simple precisión obtendrás 4 decimales con error de +-4 en el último decimal. De sobra para la frecuencia de red.


3º No pongas a cero el TMR1
Es preferible hacer 'continous timestamp' que significa que cuentas pulsos de reloj y desbordamiento con 32 bits y luego calculas la diferencia entre dos samples.
Eso compensa los errores sistemáticos de medida y si en una medida has contado de más, en la siguiente contarás de menos.
Además podrás hacer medias mucho más precisas durante un tiempo mayor.

Saludos.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 15 de Febrero de 2018, 13:51:46
Bueno intente las soluciones planteadas (gracias por todo ese apoyo) pero pues mi docente dijo que debia solo usar TCNT0 nada más. Que a medida que se subia la intensidad de la materia se usaban las diversas funciones pero como es el primer uso del timer solo debia usar ese puerto.


En resumen (Debo poder medir una señal que entre por cualquier puerto y en un display lcd mostrar la frecuencia a la cual opera dicha señal.) La meta era que con este manejo de timer se pudiera interpretar la señal de un control remoto con protocolo IR y mostrar el boton oprimido. Es por eso que no puedo dar uso de otros
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 17 de Febrero de 2018, 21:23:12
Alguien? No he podido..
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 07:16:26
Es que no está claro lo que quieres hacer.
Ahora de repente aparece la limitación de usar solo el Timer 0.
¿Cuánta precisión necesitas? Lo digo porque con ese timer nada más, te va a costar tener buena precisión.

Además parece que tienes que hacer más cosas. No es lo mismo medir frecuencia sin hacer nada más, que medir frecuencia con un solo timer y además hacer otras cosas de forma concurrente.

¿No querías medir la frecuencia de red? ¿O al final es la frecuencia de una señal IR?

Creo que el problema no está bien explicado, de manera que es difícil plantear una solución a algo que no se conoce.
Si nos explicas con detalle qué es lo que necesitas, quizás podremos ayudarte.


Un saludo.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: KILLERJC en 18 de Febrero de 2018, 11:00:06
Citar
¿Cuánta precisión necesitas? Lo digo porque con ese timer nada más, te va a costar tener buena precisión.

Si esta estudiando y recien comienza parece que no necesita tanta precisión. Primero que aprenda a manejar el TMR y luego las demas cosas, no introducirle todo junto, esa es la idea del profesor.

Citar
En resumen (Debo poder medir una señal que entre por cualquier puerto y en un display lcd mostrar la frecuencia a la cual opera dicha señal.) La meta era que con este manejo de timer se pudiera interpretar la señal de un control remoto con protocolo IR y mostrar el boton oprimido. Es por eso que no puedo dar uso de otros


Simple, pone a correr el TMR0... la idea ya te la dijeron como es..

Detecto un flanco descendente
Valor anterior =  el valor del TCNT0
Detecto otro flanco descendente
Valor actual =  el valor del TCNT0

Luego tenes que Valor actual - Valor anterior = Cantidad de ciclos que pasaron.

Sabiendo la entrada de reloj y de preescaler, podes calcular cuanto tiempo tarda en contar 1 el TMR0

Ejemplo con 10Mhz y preescaler de clk/1 te vas a encontrar conque cuenta 1 cada:

Preescaler * \frac{1}{Frecuencia} = Periodo del Timer

En este caso es de T = 0.1us
Si usas un preescaler de 1024, quedaria T = 102.4us

Conociendo el tiempo que pasa en cada cuenta, y conociendo cuantas cuentas pasaron ( gracias a tu resta de lso valores tomados del TMR0 ) podes conocer cuanto tiempo paso:

Suponiendo que

Valor actual - Valor anterior = 100
Y el periodo es T = 102.4us

Quiere decir que el periodo de la señal fue:
100 * 102.4us = 10.24ms
Y por consecuente su frecuencia es 1 / 10.24ms = 97.65625 Hz

----------------

Limitaciones y consideraciones en esto.
El TMR0 es de 8 bits si no mal me equivoco. Y existe un problema si es que ocurre un overflow.
El mayor problema esta en que si no se fija uno en este indicador, nos puede jugar una mala pasada.

Supongamos una frecuencia de 100Hz, pero esta ves vamos a usar un preescaler mas pequeño clk/1
El tema es que para conseguir este valor el Timer debe contar 100000, lo cual es imposible ya que su maxima cuenta es de 255.
Este caso es muy extremo, pero esto te da una idea que para una frecuencia baja tendrias que tener en cuenta esto. Si tu profesor te indica un rango de frecuencia msomenos fijo, entonces eso te sirve como para seleccionar adecuadamente el preescaler y no hacer demasiados artilugios para llevar bien la cuenta.

Sino vas a tener que observar siempre el indicador de overflow. Y como actuo sobre este?
Supongamos que tu primer flanco y el primer valor te dio 24, mientras esperas el segundo flanco, lees continuamente el bit de overflow y el del timer, si resulta que : TOV0 = 1 y TCNT0 >= 24 entonces a tu valor de resta le tenes que sumar 256, procedes a borrar el bit de TOV0, y esperar nuevamente el flanco y mirando esas 2 cosas.

Si pasa suponete en total 2 veces y el "Valor actual" es de 50, entonces el valor total va a ser de :

Ciclos totales = (Valor actual - Valor anterior) + (CantDeOV * 256)
En el ejemplo:
Ciclos totales = (50 - 24) + (2 * 256) = 538 ciclos

Y superaste el limite de contar solo 255 como maximo

PD: Valor actual y Valor anterior si o si son de 8 bits, asi aprovechar el overflow de estos al restar.

PD2:
Citar
) La meta era que con este manejo de timer se pudiera interpretar la señal de un control remoto con protocolo IR y mostrar el boton oprimido.

Es cierto que difiere bastante de la pregunta inicial, pero tu pregunta ya esta resuelta con este post.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 11:30:25
Uno de los problemas más frecuentes cuando un alumno comienza a aprender o cuando intenta resolver un problema consiste en que no comprende bien la pregunta que se le plantea.
Esto es también verdad para muchos profesionales con el 'culo pelado' de hacer proyectos.

Lo primero que hay que aclarar normalmente es el 'pliego de condiciones' o mejor dicho 'qué es realmente lo que el cliente/profesor quiere'

Es un error muy muy común comenzar a dar soluciones antes de entender realmente el problema.

A mí me parece que gioalex07 no tiene del todo claro qué tiene que hacer y eso es lo primero a solucionar.


Por ejemplo:
Si quieres poca precisión y la señal a medir es más o menos fija (60Hz de red o 38KHz de IR, ya veremos cómo queda al final) la respuesta es modificar el prescaler para que la medida sea menor de 256 cuentas y medir los pulsos con el TMR0.
También necesitas configurar una captura del valor del TMR0, pero con ese timer necesitas hacerla necesariamente con pooling por software y eso está peleado con realizar otras tareas mientras tanto.

O el profe se está haciendo pajas mentales y complicando mucho el problema de forma innecesaria (lo dudo) o el alumno no se entera de lo que le piden y nosotros tampoco.


Lo mejor es que el problema esté por escrito con todas las especificaciones con mucha claridad. De paso gioalex07 aprende a hacer las cosas bien desde el principio.


Un saludo.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: KILLERJC en 18 de Febrero de 2018, 12:31:14
Comprendo lo que decis Picuino. Pero tus expectativas son un poco altas para muchos diria. Yo los trato como si fueran alumnos de educacion media ( 14-18 años ). Si me dijeran que son estudiantes de universidad, el trato es totalmente distinto.

Citar
A mí me parece que gioalex07 no tiene del todo claro qué tiene que hacer y eso es lo primero a solucionar.

Y con eso agrupaste al 95% de los estudiantes de educacion media. Y no quiero hablar mal pero tambien gran parte de los docentes de niveles medios.
El gran problema del estudiante, la comprension lectora, no comprenden lo que lee y es algo que al menos aca en Argentina y en el colegio donde me encuentro lo tienen todos los alumnos.

No se en que nivel esta gioalex07, pero por experiencia al dar clases me toco que por mas que le especifiques completamente todo, y para que se trata, el alumno siempre toma la mitad de las cosas, asi que no es sorprendente que el llegue con solo una parte. Una persona que se encuentra en la universidad, deberia minimo ponerse el a buscar.

Si supiera exactamente que es lo que debe hacer, para que lo esta haciendo, ni siquiera estaria preguntando aca. Vos le estas pidiendo que defina "requisitos" antes de comenzar un proyecto, cuando ni siquiera tiene conocimiento de los mismos, ni cuales, ni cuantos.
Y ahi te encontras con dos tipos de personas distintas, personas que preguntan cosas que pueden ser buscadas por google facilmente, y que leyendo obtendrian la respuesta. Y personas que crean un post comentan cual es su situacion, todas las posibles soluciones que  probaron con detalles y que aun asi no les dio ningun fruto o divergen de lo esperado.

El dijo que queria medir frecuencia. Correcto, lo llevaron entre Ale y vos a eso. Se presento una primera limitacion, solo el TMR0. Ellos no les va a preocupar que sea 59.9999 o 60.0001 y al profesor tal ves tampoco, ya que luego lo hara menos limitado en hardware, lo que le dara no solo un espectro mayor de modulos a elegir sino la diferencia que obtienen con estos.
Pienso que su primera aproximacion es que aprendan a usar el Timer, pero no usarlo, sino a comprender que es lo que hace el Timer. Que es un simple contador de la frecuencia que entra. Creo que esto es suficiente para el docente en este punto teniendo en cuenta que jamas tocaron un timer. Tal ves la idea del docente es un avance a medida de prueba-error
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 14:14:11
Por el tipo de pregunta (manejo directo del timer, sin librerías ni Arduino) y el código adjunto en el primer post, he supuesto que gioalex07 es alumno de universidad que está comenzando con los microcontroladores.
La edad que he visto en el perfil parece confirmarlo.


gioalex07:
en estos casos se suele comenzar por algo muy básico que funcione y se va avanzando poco a poco.

Lo primero que yo suelo hacer es conectar con el PC a traves de la UART para poder comenzar a depurar. También puedes utilizar el programador en modo debugger. ¿Cómo programas y haces debug?

A partir de ahí vas poco a poco modificando el programa hasta que consigues lo que quieres.
Si en algún punto te atascas, entonces nos preguntas.
Así puedes ir poco a poco, comprendiendo cada paso y preguntar dudas concretas, que son las únicas que puedes esperar que te resolvamos aquí. El problema completo no te lo vamos a dar resuelto.

Un saludo.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 14:19:33
¿Qué frecuencias quieres medir?
¿Con cuánta precisión?

¿Qué micro estás utilizando, un Atmega328?
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 18 de Febrero de 2018, 14:44:20
Primero muchas gracias !
Segundo: Utilizo el atmega644a con programador usbasp, son dos trabajos en 1, primero tengo que ser capaz de medir frecuencia de la red osea en mi caso para colombia es de 60 hz aproximadamente y si solo con el timer0 porque presente dudas al docente con timer1 y decia que era otro caso para manejar dicho timer, es decir, solo puedo usar el timer0 para saberlo manejar sin problemas, ya siendo capaz de medir esa frecuencia toca con un sensor infrarrojo leer la señal emitida por un control remoto pero si yo no se como usar timers ni leer la frecuencia ni pulsos ni flancos ni nada literal pues no podre hacerlo.. es ese el problema.

Intentare hacer lo que me indicaron y volvere a comentar con lo sucedido, gracias infinitas por entenderme y no dejar de ayudarme
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 16:37:41
¿Tienes un conversor UART-USB parecido a este o un Arduino?
https://www.ebay.com/itm/1PC-PL2303-USB-To-RS232-TTL-Converter-Adapter-Module-F-Arduino-CAR-Detection-GPS/263224103111?hash=item3d496110c7:g:h6oAAOSwwGdZxc~J
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 18 de Febrero de 2018, 16:40:33
Bueno primero quise solo mostrar en LCD el conteo del timer tcnt0 y esto hice pero no entra si entiendo como hacer esto pues ya sera más facil aplicar lo que me han publicado



#define F_CPU 8000000UL
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
volatile uint8_t variable = 0;
char *txt;

int main(void){
   
   CLKPR = 1 << CLKPCE; // Configuracion de prescaler bit 7
   CLKPR = 0; // Division del prescaler en 1
   DDRA |= 0;
   PORTA |= 0b00000000;
   TCCR1A |= 0;
   TCCR1B |= 0b00000111;
   TCNT1 = 0;
   lcd_init(LCD_DISP_ON);
   lcd_clrscr();
   lcd_home();
   lcd_gotoxy(0,0);
   lcd_puts("Frecuencia");
   
   while (1) {
      TCNT0 = 0;
      while(PA0 == 0){
         
      }
      while(PA0 == 1){
         variable += TCNT0;
      }
      
      if(variable == 255){
         lcd_gotoxy(0,1);
         lcd_puts("OverFlow");
      }
   }
}

si si lo tengo el usb ttl
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 18 de Febrero de 2018, 16:41:06
Si lo tengo
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: tsk en 18 de Febrero de 2018, 17:14:09
Cita de: gioalex07
Segundo: Utilizo el atmega644a con programador usbasp, son dos trabajos en 1, primero tengo que ser capaz de medir frecuencia de la red osea en mi caso para colombia es de 60 hz aproximadamente y si solo con el timer0 porque presente dudas al docente con timer1 y decia que era otro caso para manejar dicho timer, es decir, solo puedo usar el timer0 para saberlo manejar sin problemas, ya siendo capaz de medir esa frecuencia toca con un sensor infrarrojo leer la se?al emitida por un control remoto pero si yo no se como usar timers ni leer la frecuencia ni pulsos ni flancos ni nada literal pues no podre hacerlo.. es ese el problema.

Sólo una pregunta

¿El profesor les enseño el uso de los timers?

Todavía fuera una sola materia en la que tienes dudas pensaría más del lado del profesor que te esta dando la materia donde estas viendo los microcontroladores AVR, pero veo que también tienes lagunas en la parte del manejo de C.

Veo que preguntas por todos lados cosas que no tienen ningún tipo complejidad (mediavida, el rincon del C, etc.), que me da a pensar si es el profesor, el alumno o ambos.

Así que no se si les enseño o no el uso de los timers, su configuración y la lectura de las hojas de datos para saber que hace cada bit de los registros que lo controla, o sólo los dejó a su suerte.

Por tu afirmación pareciera que ni siquiera se los enseño, pero dudo que sea ese el caso.

Por lo general en todos lados el profesor da una introducción al manejo de los periféricos, incluidos los timers y ya es cuestión de uno inferir otros usos, para ello son las prácticas y dentro de esas prácticas tenemos que ganar la habilidad de interpretar las hojas de datos e incluso tenemos que aprender a trabajar con los recursos que nos ofrecen los microcontroladores.


Y con eso agrupaste al 95% de los estudiantes de educacion media. Y no quiero hablar mal pero tambien gran parte de los docentes de niveles medios.
El gran problema del estudiante, la comprension lectora, no comprenden lo que lee y es algo que al menos aca en Argentina y en el colegio donde me encuentro lo tienen todos los alumnos.

No se en que nivel esta gioalex07, pero por experiencia al dar clases me toco que por mas que le especifiques completamente todo, y para que se trata, el alumno siempre toma la mitad de las cosas, asi que no es sorprendente que el llegue con solo una parte. Una persona que se encuentra en la universidad, deberia minimo ponerse el a buscar.

Y por ende bastantes profesionales que aprendieron de esos maestros.

No estoy en la educación pero me ha tocado ver que, aún a nivel universitario, suben proyectos como el que está pidiendo gioalex07, y no importa la nacionalidad o universidad que sean, ni aún usando mbed, arduino y derivados son capaces de entender lo que deben de hacer.

Como anécdota, de la cual no voy a decir nombres, para no quemarlos y advertirles que están haciendo las cosas mal, así menos competencia.

Hay unas personas que se promocionan como los mejores del ramo del diseño de sistemas embebidos e incluso ofrecen cursos para que aprendas con los profesionales (que son ellos, por supuesto).

Tienen una tienda en línea en la cual venden productos que por lo general son módulos y kits de diversos tipos. El año pasado les mande un comentario sobre uno de los productos que anuncian y que por obvias razones lo están anunciando mal, pero, a pesar de especificarles cual era el problema, su respuesta me indicó que no comprendieron ni la mitad de las observaciones que les hice y lo único que mostró su respuesta fue un total desconocimiento y el ego exacerbado que tienen.

Lo peor es que cuentan con estudios de Maestría.

Ves sus vídeos en youtube y lo único que ves son errores, tras errores en su código, no muestran la capacidad de siquiera seguir la ejecución de los programas para percatarse de los errores que están cometiendo y todo de lo que la mayoría en Internet conocen a cerca del diseño de sistemas embebidos, lo pasan por alto.

En sí ya hay un problema de fondo que incluye:

1.- Padres totalmente desconectados de la educación de sus hijos.
2.- Un modelo educativo que se ha degenerado para incrementar estadísticas (no calidad) y a la vez crear mano de obra barata que no piense por si misma.
3.- Estudiantes que se sienten agusto con la situación.

De nada me sirve ir pasando de año si voy arrastrando problemas fundamentales, como bien mencionaste la lectura de comprensión y eso se hace notar cuando llegamos a la Universidad.

Además, tengo la impresión de que ya se ha tratado en el foro temas relacionados con frecuencímetros.

Ya me imagino yo dando  clases, me agarraría a todos por parejo.

Así que a nuestro amigo gioalex07 le recomiendo que deje de ver esos vídeos de youtube que no le aportan nada como "¿Cómo Dejar de Preocuparse y Comenzar a Vivir una Vida Extraordinaria?" y se concentre en leer libros de programación y diseño de sistemas embebidos, también hay infinidad de tutoriales en internet.

Menos youtube, más lectura.
Menos facebook, más lectura.

Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: KILLERJC en 18 de Febrero de 2018, 17:40:43
Citar
Ya me imagino yo dando  clases, me agarraría a todos por parejo.

Jajajaj, me pasa lo mismo. Esto ya es Off-topic, pero llegas a un punto en el que comprendo a los docentes actuales.
Vos pones todo el esmero, explicas el PORQUE de las cosas, no es magia es lógico, la cual no deben aprender de memoria, le facilitas las cosas para que su desarrollo sea no mecanico, sino lógico, problemas extremadamente simples y como si nada no pueden hacerlo, la explicación es "Nunca lo vimos". Llegue al punto en que si no queres retrasarte en la materia por algunas personas, es dar la clase y aquel que desea molestar y no trabajar entonces lo lamento. Por supuesto, todas las dudas serán contestadas. Al menos el nivel medio aca es muy distinto de la universidad, el que va a la universidad va a aprender, en nivel medio van por obligación.
Por eso mismo voy a ser un poco mas justo con gioalex07, conociendo que ya no es un bebe de pecho.

Citar
¿El profesor les enseño el uso de los timers?
En mi caso en la universidad fue: "Tienen que hacer un proyecto con un PIC para final de año".. Y se paso hablando 1/4 de año de cualquier cosa. Cuando le preguntamos cuando nos iba a dar clases, aunque sea una introducción de como se programa en ASM, nos dijo, ahí tienen el datasheet, léanlo. Y esa fue toda la enseñanza.. Aprendí mas afuera de la universidad en tema programación que en la misma lamentablemente.


gioalex07:
Hay unos problemas con tu logica y GRAVES como ya menciono tsk (algunos no los voy a nombrar, solamente a los que incumben al Timer).

Código: C
  1. TCCR1A |= 0;
  2.    TCCR1B |= 0b00000111;
  3.    TCNT1 = 0;

Estas configurando el TC1 y luego usando el TC0

Código: C
  1. if(variable == 255){

El TCNT no queda siempre en 255, sino que al contar uno mas vuelve a 0. Esto es lo que se conoce como OVERFLOW
Se activa un bit que indica el mismo, el cual esta en uno de los registros del Timer.

Otra cosa es el tiempo en que llega a contar 256, o mejor dicho saber cuanto es el tiempo que le toma para contar una unidad... ESTO ES IMPORTANTE y que tenes que saber como calcularlo.
Tambien pensar que la rutina del LCD ocupa tiempo, y que ese tiempo puede ser mayor a la de la cuenta (y se produzca el overflow siempre), eso haria que se actualice el LCD muy rapidamente.
A tal punto que mejor es verlo con un osciloscopio y cambiar el estado de una salida. Asi ver el periodo del mismo y poder compararlo con la parte teorica

Código: C
  1. TCCR1B |= 0b00000111;

Suponiendo que sea el TC0
Para CS0x : 111 - External clock source on T0 pin. Clock on rising edge.

Es decir cuenta los pulsos externos que entren por el pin T0, y eso no es lo que planteamos, la idea es que cuenta lo del oscilador que posea el micro.

---------------------------------------

Te voy a decir algo, vos lo implementas si queres.
Cuando tengas que modificar registros y no poseas ninguna libreria para hacerlo o en este caso el entorno Arduino, si tenes que utilizar un modulo en CUALQUIER microcontrolador,
- Verifica TODOS los registros que involucran al funcionamiento del modulo.
- Configura cada uno de los registros, leyendo que hace cada bit. Y dandole el valor acorde a tu proposito.

Asi te vas a evitar sorpresas de que luego te falta algo. Y por demas esta decir que deberias leer el modulo, aunque sea la parte del Timer.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: gioalex07 en 18 de Febrero de 2018, 18:31:39
No quiero entrar en una discusión sin proposito.. No es mi fuerte la programación y si para ustedes es fácil los felicito pero no acusen porque si.. Si por haber pedido ayuda antes no puedo pedirla ahora es un problema ok simplemete no comentare más

Gracias
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 18:36:45
Si lo tengo

Bien,
Ahora intenta conseguir que el micro envíe caracteres a través de la UART:

   putchar("*");

En el PC los puedes recibir con cualquier programa de terminal serie, como realterm.

Eso te servirá para hacer debug más adelante.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 18:39:13
Con un Arduino esto iría mucho más rápido. (por si tienes uno por ahí)
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: Picuino en 18 de Febrero de 2018, 19:17:48
Con el display LCD también puedes hacer debug, aunque más limitado.
Título: Re:Uso de Timer para determinar frecuencia de una onda
Publicado por: KILLERJC en 18 de Febrero de 2018, 20:43:33
No quiero entrar en una discusión sin proposito.. No es mi fuerte la programación y si para ustedes es fácil los felicito pero no acusen porque si.. Si por haber pedido ayuda antes no puedo pedirla ahora es un problema ok simplemete no comentare más

Gracias

Por eso seguimos intentando ayudarte, nomas que el Off-topic gano.. Yo supongo lo peor de la otra persona, no porque así lo crea o conozca, es porque no doy por dado ningún conocimiento previo que posea la persona. La programación es "facil" luego de unos años pero nunca dejas de aprender, no me considero el mejor en el tema tampoco, y entiendo que vos estas iniciando recién. La única diferencia que hago es levantar la vara en la información dada a la persona según el conocimiento que demuestre. Por ejemplo si hubiera sabido de que cursabas la universidad te indicaba un par de preguntas para que buscaras en internet y no escribirlo por mi mismo. No por vagancia, sino que es la forma de hacerte buscar información y no darlo "servido en bandeja". Es un tema de aprendizaje para que luego vos puedas valerte por vos mismo. En el foro hay mucha gente que pregunta sin siquiera probar nada, y lo que tratamos de evitar es eso, es mas productivo que venga una persona y que demuestre lo que hizo, lo que probo y los resultados que obtuvo y que pregunte que esta mal, que hacer algo de cero como este tema. Este es mi ultimo post con Off-topic.

Respecto a seguir con el programa ahí te di algunos problemas que tenias, y que podrías hacer para solucionarlo.

Como ves cada uno tiene un punto de vista de como abarcar el problema. La cual comparto en algunos aspectos con Picuino (requisitos, la forma en que se debe dar la matricula, etc),  y otros no como hacer una comunicacion serie cuando solo se trata de un simple timer. Pero eso no deja de quitar que sean validas ambas.

Creo que la incognita para Picuino es... ¿Te permiten usar Arduino o su entorno?

Y espero tu solucion al tema. Sabes que si tenes alguna duda vamos a estar para responderla, de ahora en adelante solo voy a responder sobre el Timer.