TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: xixonplus en 07 de Septiembre de 2003, 11:00:00
-
necesito un programa en lenguaje c que a traves de la interrupcion tmr0 me produzca una señal de reloj de 100khz por el puerto A1
gracias de antemano
-
Hola xixonplus.
Es muy sencillo de hacer. Te doy las pistas y a ver si lo haces tú.
Si la f=100Khz --> T=1/f=10us Es decir la señal cuadrada estará 5us en estado alto y 5us en bajo.
El TMR0 se desbordará cada 5us y cuando lo haga entrará en la rutina de atención a la interrupción donde lo único que se hará será voltear (bascular) el valor de por ejemplo RA0 que será el pin por donde saldrá la onda.
Cuando termine la rutina de atención a la interrupción otra vez regresará al bucle sin fin, y otra vez a desbordarse ...
Espero te ayuden estas pìstas, si quieres tú empiezas el programa y yo te voy guiando.
Un saludo
-
GRACIAS POR LA RESPUESTA, SERIA ABUSAR MUCHO SI ME PRECISAS UN POCO MAS.
ES PARA UN PROYECTO FIN DE CARRERA EN DONDE LA ULTIMA PARTE SE UTILIZA UN PIC Y UNA LCD, EL PROBLEMA ES QUE NO TENGO NI IDEA DE C ESTOY INTENTANDO APRENDER UN POCO. EL ESAMBLADOR LO MANEJO MEJOR PERO EL PROBLEMA ES QUE TENGO QUE HACER UN LOGARITMO Y ADEMAS EN EXPOSICION QUEDA MEJOR HACERLO EN C. EL PROYECTO TRATA DE OBTENER LA SEÑAL Q TE COMENTE PARA CONTROLAR UN FILTRO Y DESPUES POR OTRO PUERTO RECIVIR UNA SEÑAL ANALOGICA DOS VECES HACER UNAS OPERACIONES CON ELLAS Y ENVIARLA A LA LCD. ESTO ES A GROSO MODO,
SI ME DAS ALGUNA SUGERENCIA TE LO AGRADECERIA.
GRACIAS DE ANTEMANO
-------------------------------------------------------------------------------------
Este sería el programa por interrupción del TMR0 tal como pedías:
// 100KHz.C
#include <16f873.h>
#use delay(clock=40000000)
#byte port_a = 5
#bit RA0 = 0x05.0
#INT_RTCC
interrupcionTMR0()
{
output_bit(PIN_A0,!RA0);
set_rtcc(251);
}
main()
{
port_a = 0;
RA0=0;
set_tris_a(0x00);
setup_counters (RTCC_INTERNAL, RTCC_DIV_1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
set_rtcc(251);
while(1)
{
restart_wdt();
}
}
Tiene un defecto, y es que al pasar las instrucciones de la interrupción a ensamblador el tiempo consumido por los ciclos máquina va a ser considerable (Para 4MHz de frecuencia de oscilación sale 1 C.M.=1us) y seguramente mayor que el tiempo perdido por el TMR0 (5us)
Mide con un osciloscopio la frecuencia que sale (¡saldrá mal!)
Prueba con un cristal de 20MHz, para reducir el tiempo consumido por 1C.M. a 200ns (el valor a cargar en el TMR0 en este caso sería 231)
Si aún así sale mal tendrás que ir pensando en hacerlo en ensamblador o buscar otra frecuencia inferior a 100KHz si se puede
Ya me dirás que resultados se obtienen en el osciloscopio
Un saludo
-
RE: RE: HOLA OTRA VEZ
gracias por tu tiempo.
el equivocado era yo, el programa funciona bien era un error en el diseño de la placa.muchas gracias. la frecuencia max obtenida es entorno 40kh, lo ideal seria 100 o en su defecto la mitad (50) por que es para controlar un filtro paso bnada(mf10), habra alguna manera de conseguirlo? tengo que probar en ensamblador.
una pregunta de "c": con este pic la conversion a/d la almacena en dos direcciones (10 bits) como hago para tratarla como una variable para despues hacer operaciones con ella, gracias.
he visto que manejas el proteus yo lo he intentado pero no me aclaro mucho con el, saves de algun tutorial o unas nociones basicas para utilizarlo. el problema surgia con el tratamiento de la lcd ya que la operaciones con decimales no las muestra bien (ej: 2.xxxxx), cual es el problema, gracias de nuevo
espero tus respuestas, gracias .
un saludo
-
Te pediría que preguntases aquí en lugar de en privados.
- En respuesta a tu 1ª pregunta simplemente se hace así:
valor=read_adc();
El valor de la conversión es asignado a la variable valor.
Otra cosa: puedes trabajar, por defecto, con una resolución de 10 bits, pero también se puede con 8 bits.
- En cuanto a la 2ª pregunta, mira en:
http://miarroba.com/foros/ver.php?temaid=936823&foroid=58549
Hay un manual en inglés y un tutorial sencillo en castellano
3ª pregunta: las operaciones con decimales sí las muestra bien. El error debe estar en tu programación
Un saludo
-
gracias por tu ayuda me ha sido muy util, ya me funciona mas o menos, tengo problemas con rom la tengo al 100%, no se si es devido a la funcion logaritmo o a las variables float, como puedo solucionarlo?
utilizo un pic 16f819 con 3584 de flash y 2048 de single word instructions, si utilizo la ram solucionaria el problema? como se hace?
gracias de nuevo
un saludo
-
Las variables float ocupan mucha memoria.
¿No puedes pasarte a otro micro?, por ejemplo un 16F876 (8K de memoria flash)
¿Qué significa: 2048 de single word instructions?
Con la RAM no se soluciona el problema
-
He estado mirando en Microchip el PIC 16f819 y tiene:
- 2K (2048) de memoria flash
- 256 de memoria RAM
Quizá se te quede un poco corto para tu proyecto
-
hola de nuevo ahora estoy con otro pic que tiene 8k es el pic18f1320, ahora supongo q no tenga problemas con eso, pero me surje otro y es que no soy capaz de configurar una interrupcion con el icprog, las ordenes de "c" son las mismas que antes, es decir que esto esta bien, el problema es que tengo q en la ventana del ic prog que hacer 7 configuraciones y el id, es donde debo estar metiendo la pata, te volveria agradecer tu ayuda una vez mas.
muchas gracias
un saludo
-
¡¡¡Ahí sí que me has pillado!!!. A la serie 18 todavía no le ha tocado el turno. A ver si dentro de unos meses me meto con ella, ahora imposible.
De todas formas he estado mirando por microchip.com y el PIC18F1320 no tiene 8K de flash, tiene 4K y 256 de RAM, tenlo en cuenta para tu proyecto.
Respecto a las instrucciones de C, sí valen las mismas, lo único que al compilar lo tendrás que hacer con el compilador PCH (gama alta, también sirve para los de gamas inferiores) en lugar de PCM (gama media).
Como todavía no he programado ninguno no te puedo ayudar respecto a la configuración del ICPROG.
A ver si alguien del FORO que haya utilizado esta serie 18(¡¡¡ y hay varios !!!) te puede ayudar, o por lo menos darte alguna idea más.
Un saludo
-
Hola

Necesito generar una señal de reloj por el pin B0.
He visto como se puede hacer, y parece que va en función de la frecuencia del oscilador.
El problema es que necesito una señal de reloj menor de 50ns de periodo, es decir <25ns en estado alto y <25ns en estado bajo. Esto sería una frecuencia de F>20MHz.
Llevo poco tiempo con los pics y aún no había tocado este tema, así que voy algo perdido. ¿Bastará con configurar el oscilador a 20MHz?
Mi pic es un 18F2550, que admite hasta 48MHz. Supongo que sería conveniente que pusiera un cristal lo más alto posible para así cumplir los tiempos y que los ciclos máquina de las instrucciones me ocupen el mínimo tiempo posible.
Espero vuestros comentarios.
Salu2 a to2
-
He visto que no es tan fácil como parece.
Para conseguir que el timer 0 desborde a 25ns, tendría que tener el oscilador a 160MHz
Frec = 4 / TiempoDesbordamientoMinimo = 4 / 25ns = 160MHz
No se si esque estaré haciendo algo mal o qué, pero un pic a 160MHz como que no lo hay... así que revisaré las especificaciones del dispositivo para el que necesito dicha señal de reloj, ya que no es posible que necesite un micro tan potente.
De todos modos, si alguien sabe la manera de conseguir una señal de reloj con 25ns de estado alto y 25ns de estado bajo que me lo diga.
Un saludo
-
Si la señal de clock que necesitas generar va a ser fija y estable, a 20MHz (50ns de periodo), yo le pondría un cristal de 20MHz al micro y cogería la señal de clock del propio cristal.
Si por el contrario, necesitas modificar dicha frecuencia y/o poder encenderla y apagarla, no veo forma de hacerlo con el micro que has elegido, dado que aunque puede ir a 40MHz, cada ciclo de instrucción necesita 4 ciclos de reloj.
En ese caso yo optaría por hacerlo con un dsPIC.
-
Gracias Nocturno, pero parece ser que es una errata en el datasheet del dispositivo.
He preguntado por ahí y eso parece, deben referirse a tiempos mínimos ya que no es posible controlar una señal así con un pic normal, y para la función que desempeña no es necesaria una comunicación tan rápida.
Será cuestión de probarlo, cuando lo haga ya contaré que tal...
Un saludo