Autor Tema: AYUDA CON TIMER  (Leído 2854 veces)

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

Desconectado stevengalindom

  • PIC10
  • *
  • Mensajes: 18
AYUDA CON TIMER
« en: 19 de Agosto de 2011, 16:20:52 »
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;
}


Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: AYUDA CON TIMER
« Respuesta #1 en: 14 de Noviembre de 2011, 13:20:50 »
si configuras una interrupcion, y luego en tu programa no existe los resultados pueden ser inesperados.

Leete la guia de usuario C30, en google c30 user guide.

Busca informacion sobre las interrupciones, seria algo como void __attribute__((interrupt)) _T1Interrupt() { }

tambien puedes mirar en la info del pic, en el apartado timers.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: AYUDA CON TIMER
« Respuesta #2 en: 16 de Noviembre de 2011, 01:11:40 »
Disculpa para informacion tendrias q remitirte al datasheet o si queres profundizar mas a la hoja especifica del Timer para los dsPIC y PIC24, que lo encontras en la pagina de microchip.

Yo solo te puedo ayudar con una sola cosa y es un codigo que hice para probar el timer, pero... esta en ASM30

Código: [Seleccionar]
        .include "p33fj32mc204.inc"

;..............................................................................
; Configuracion, Palabras sacadas del include.
; Primero va el registro con 2 guion bajo (__FOSC) por ejemplo y luego la
; configuracion del mismo
;..............................................................................

config __FOSCSEL, FNOSC_LPRC & IESO_OFF
config __FOSC, POSCMD_NONE & OSCIOFNC_ON & FCKSM_CSDCMD
config __FWDT, FWDTEN_OFF
config __FPOR, FPWRT_PWR1 & ALTI2C_OFF & LPOL_ON & HPOL_ON & PWMPIN_ON
config __FGS, GCP_OFF


;..............................................................................
;Declaraciones Globales:
;Aca declaramos las etiquetas que pueden ser usadas por otros archivos y
;tambien los vectores de interrupcion, los nombres de estos se peuden ver en
;el archivo de linker p33fj32mc202.gld para este caso
;..............................................................................

        .global _wreg_init      ;No es necesario pero esta por si algun otro
                                ;archivo desea usarlo

        .global __reset         ;Indicador del vector de interrupcion.

        .global __T1Interrupt   ;Vector de interrupcion del TM1

        .global __T3Interrupt   ;Vector de interrupcion del TM3

;..............................................................................
;Iniciacion de Puntero de pila y registros W
;..............................................................................

.text                               ;Indicador para el compilador de inicio
__reset:                            ;de codigo de programa, para ubicarlo en la memoria
        MOV #__SP_init, W15         ;Inicializacion del puntero de pila, valor dado por
        MOV #__SPLIM_init, W0       ;el linker p33fj32mc202.gld
        MOV W0, SPLIM
        NOP                         ;Necesario un NOP luego de inicializar

_wreg_init:                         ;Limpieza de registros de W0 a W14
        CLR W0                      ;Siendo W0 la direccion 0x0000 del SFR
        MOV W0, W14
        REPEAT #12                  ;Se repite la instruccion que le sigue
        MOV W0, [++W14]             ;Con un pre incremento para ir borrando uno
        CLR W14                     ;por uno hasta W13 y luego se borra W14
                                    ;que sirvio de puntero


;..............................................................................
;Configuracion de pines
;..............................................................................

        mov #0xffff, W0
        mov W0, ADPCFG
clr PWM1CON1
clr PWM2CON2
;        bclr ADPCFG,#PCFG0  ;Configuro AN0 como entrada analogica
mov #0xFFFC, W0
        mov W0, TRISA       ; Ponemos los pines como salida a RA0-RA1
        mov #0x0000, W0
        mov W0, TRISB       ; Ponemos todos los pines de salida RB0-15
        mov W0, ODCB        ; Se configuran los pines para no trabajar como
                            ; como colector abierto.
mov W0, ODCA        ; Se configuran los pines para no trabajar como
                            ; como colector abierto.
        mov W0, PORTB       ; Limpio los valores del PuertoB , probando.
        mov W0, PORTA       ; Limpio los valores del PuertoB , probando.
        mov W0, LATB        ; Limpio los valores de los latch
        mov W0, LATA        ; Limpio los valores de los latch

;..............................................................................
;Configuracion del Timer 1
;..............................................................................

; Registro de interrupcion IEC0

        bset IEC0,#T1IE ; Habilito interrupcion del TM1
        bclr IFS0,#T1IF ; Limpio Flag TM1 por las dudas

;Registro TMR1
   
        clr TMR1 ; Limpio registro del TM1

;Registro PR1

        mov #0x3FF8,W0 ; Cargo periodo en PR1
        mov W0, PR1 ; Tiempo : 1s

; Registro T1CON

        clr T1CON ; Selecciono prescaler 1:1
        bset T1CON,#TON ; Activo TM1 para la cuenta

;..............................................................................
;Configuracion del Timer 2/3 - 32 bit
;..............................................................................

; Registro de interrupcion IEC0

        bset IEC0,#T3IE ; Habilito interrupcion del TM3
        bclr IFS0,#T3IF ; Limpio Flag TM3 por las dudas
; Las interrupciones se manejan con el TM3
; Para 32 bits
;Registro TMR3:TMR2
   
        clr TMR2 ; Limpio registro del TM2
clr TMR3 ; Limpio registro del TM3

;Registro PR3:PR2

        mov #0x0001,W0 ; Cargo periodo en PR3:PR2
        mov W0, PR3 ; quedaria 0x00013FF8
mov #0x3FF8, W0 ; Tiempo: 5s
mov W0, PR2

; Registro T2CON ; Al ser de 32 bits el registro
; T3CON no es tenido en cuenta

        clr T2CON ; Selecciono prescaler 1:1
bset T2CON,#T32
        bset T2CON,#TON ; Activo TM2 para la cuenta
;..............................................................................
;Programa Principal
;..............................................................................

MainLoop:

        nop
        bra MainLoop        ; Inicio nuevamente

;..............................................................................
;Rutina de interrupcion TM1
;..............................................................................

__T1Interrupt: ; Vector de interrupcion del TM1
        bclr IFS0,#T1IF ; Limpio bandera de interrupcion
        clr TMR1 ; Limpio registro de cuenta del TM1
        btg LATA,#LATA0 ; Mi codigo, cambio valor del PortB.RB0
retfie ; Vuelta de la interrupcion

;..............................................................................
;Rutina de interrupcion TMR 2/3 32 bit
;..............................................................................

__T3Interrupt: ; Vector de interrupcion del TM3
        bclr IFS0,#T3IF ; Limpio bandera de interrupcion
        clr TMR3 ; Limpio registro de cuenta del TM3
        clr TMR2 ; Limpio registro de cuenta del TM2
        btg LATA,#LATA1 ; Mi codigo, cambio valor del PortB.RB1
retfie ; Vuelta de la interrupcion

;----------------- Fin del codigo ---------------------------------------------

.end


 

anything