TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: pampateam en 22 de Junio de 2010, 22:34:37
-
hola a todos, estoy trabajando con un dspic30f6014A.
Estoy utilizando un cristal externo de 7.3728 MHZ para llevarlo lo mas cercano que se pueda a 30 MIPS.
Estoy haciendo un dispositivo tipo holter, para medir presion durante 24 hs, y la almaceno en una memoria SD
En mi aplicacion es bastante necesaria la precision temporal.
Mi problema es que segun la hoja de datos yo utilizo el timer3 para que desborde a 1K, pero esta desbordando a un menor tiempo 0.0009 S.
hice la prueba de prender un led, durante un tiempo conocido ( en realidad conosco la cantidad de instrucciones) y apagarlo.
eso me da un tiempo distinto al teorico. EJ
en vez de estar trabajando a 29.4912 MHZ, me da 29.47 MHZ.
es posible?
es normal?
Tengo casi todas las patas usadas y estoy, creo, al borde de la corriente del micro ya que me calienta bastante ( lo tengo que disipador)
desde ya muchas gracias
-
Hola pampateam:
me da la impresión que la ISR del timer la atiendes un ciclo después de lo que tu necesitas, quizás si cargas el contador a 999 tengas el resultado que esperas.
suerte y cuéntanos cómo te va
-
me pueden ayudar a implementar un timer yo no e podido no ahcer aprpadear el led sera que puedes colocar el codigo que tienes del timer sin embargo yo aca coloco el que estoy implementando estoy usando un oscilador de 4 Mhz pero solo apra probar por que lo que necesito en realidad es garantizar un tiempo para que me envie unos datos por el usart y necesito cambiar el oscilador a 24 Mhz que me da una medida del baud rate con poco error para trabajar a 115200 les agradesco toda la ayuda de antemano NO ME SALE NINGUN ERRRO AL COMPILAR Y LOS IMULO EN MPLAB SIM Y EN TEORIA FUNCIONA PERO AL CONECTARLO NO PUEDO TRABAJO CON UN DSPIC 30F4011 SI TIENEN INFORMACION O TUTORIALES LES AGRADECERIA QUIERO PORLOMENOS PODER AHCER PARAPDEAR EL LED A UN TIEMPO CONOCIDO GRACIAS
CPODIGO
///////////////////////* LIBRERIAS *//////////////////////////////////////
#include<p30f4011.h>
#include <reset.h>
#include <uart.h>
#include <timer.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<adc10.h>
///////////////////////* CONFIGURACION DEL DISPOSITIVO *//////////////////////////////////////
_FOSC(CSW_FSCM_OFF & XT_PLL4); /* Oscilador XT con 4xPLL */
_FWDT(WDT_OFF); /* Watchdog timer desactivado */
_FBORPOR(PBOR_OFF & MCLR_EN); /* Brown-out reset desactivado, MCLR reset activado */
_FGS(CODE_PROT_OFF); /* Proteccion de codigo desactivada*/
///////////////////////* VARIABLES *//////////////////////////////////////
unsigned char banderatimer=0;
unsigned char contadortimer =0;
///////////////////////* INICIALISACION DE REGISTROS *//////////////////////////////////////
void timer(void)
{
PR1=0xffff;//Valor maximo del contador
T1CONbits.TCS=0;//trabajar con reloj interno
T1CONbits.TCKPS=0b11;// se define el pre-escaler como 1:256
T1CONbits.TGATE=0; // debe ser cero junto con TCS
T1CONbits.TSIDL=0;//seguir trabajando en modo idle
TMR1=0x0000;// se inicializa el registro en 0
IPC0bits.T1IP=0b001; // interrupcion prioridad 1 tiemr 1
IEC0bits.T1IE=1; // interrupcion del tiemr habilitada
T1CONbits.TON=1; // Inicializa timer
}
///////////////////////* MAIN *//////////////////////////////////////
int main (void)
{
TRISB=0;
timer();
while(1)
{
PORTB=1;
if(IFS0bits.T1IF==1)
{
IFS0bits.T1IF=0;
contadortimer=contadortimer+1;
}
if(contadortimer==40)
{
banderatimer=1;
}
if(banderatimer==1)
{
PORTBbits.RB0=0;
banderatimer=0;
}
}
return 0;
}