fhjkghk hkcgk

Interrupt and timer on MCF52235RM

Discussion created by fhjkghk hkcgk on Jun 19, 2008
Latest reply on Jun 20, 2008 by fhjkghk hkcgk
Hi all,
I have some issue about timer and interrupt on a MCF52235RM µC.
I need to blink a LED every second (or ms or µs).
My code (inspirate of this code):
Code:
#ifndef __TIMER_H__#define __TIMER_H__voidmcf52235_interrupt_init(uint8 source, uint8 ipl, void (*handler)(void));/* FUNCTION: GPTA_Timer_Init() * * Initialise and enable General Purpose Timer A0 to work like * a PIT. * * PARAM2: Prescaler value - sets the tick frequency to *     (system clock/2) divided by 2^PCSR * * PARAM3: Modulo counter - sets the mumber of ticks per interrupt * * PARAM4: Interrupt handler * * RETURNS: none */#include "MCF52235.h"#define ADDRESS   uint32voidGPTA_Timer_Init(uint8 PCSR, uint16 PMR, void (*handler)(void)){  uint8 ipl = MCF_INTC_ICR_IL(2)     | MCF_INTC_ICR_IP(0); // Disable timer A MCF_GPTA_GPTSCR2 = 0; // Set up interrupt handler mcf52235_interrupt_init(44, ipl, handler);   // Set modulo count // (= number of ticks per interrupt) MCF_GPTA_GPTC0 = PMR;   // Tick frequency = (system clock/2) divided by 2^PCSR MCF_GPTA_GPTSCR2  = 0x87;//(uint8)(MCF_GPTA_GPTSCR2_PR(PCSR)); MCF_GPTA_GPTIOS = MCF_GPTA_GPTIOS_IOS0;  MCF_GPTA_GPTIE = MCF_GPTA_GPTIE_CI0;  // Enable timer A MCF_GPTA_GPTSCR2 = MCF_GPTA_GPTSCR2_TOI; MCF_GPTA_GPTSCR1 = MCF_GPTA_GPTSCR1_GPTEN;}/* FUNCTION: mcf52235_interrupt_init() * * Initialise an interrupt handler for an interrupt source * for INTC0. If the handler is a NULL pointer, then mask * this interrupt. * * PARAM1: Interrupt source (1..62) * * PARAM2: Interrupt level and priority * * PARAM3: Interrupt handler * * RETURNS: none */voidmcf52235_interrupt_init(uint8 source, uint8 ipl, void (*handler)(void)){// Only for user defined vectors in INTC0 if ((source > 0) && (source < 63)) {  // Interrupts should be disabled to avoid vector problems  // and to ensure that a spurious interrupt exception can't  // be generated.  uint8 sysint =(uint8) asm_set_ipl(7);  if (handler)  {   // Set interrupt priority level   MCF_INTC0_ICR(source) =(uint8)(ipl & 0x3F);   // Set vector   mcf5xxx_set_handler(source+64, (ADDRESS)handler);   // Clear mask for this handler   /*if (source < 32)    MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_INT(source);          | MCF_INTC_IMRL_MASKALL);   else   {*/    MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASKALL);    MCF_INTC0_IMRH &= ~(MCF_INTC_IMRH_INT_MASK44);//MCF_INTC_IMRH_INT(source)   //}  }  else  {   // Set vector   mcf5xxx_set_handler(source+64, (ADDRESS)handler);   // Set mask for this handler   /*if (source < 32)   {    MCF_INTC0_IMRL |= MCF_INTC_IMRL_INT(source);   }   else   {*/    MCF_INTC0_IMRH |= MCF_INTC_IMRH_INT_MASK44;   //}  }  // As you were...  //asm_set_ipl(sysint); }}/********************************************************************/#endif

My main:
Code:
/* * main implementation: use this sample to create your own application * */#define __interrupt__   __declspec(interrupt)#include "support_common.h" /* include peripheral declarations and more */#include "MCF52235.h"#include "timer.h"#if (CONSOLE_IO_SUPPORT || ENABLE_UART_SUPPORT) /* Standard IO is only possible if Console or UART support is enabled. */#include <stdio.h>#endif__interrupt__voidtimer_handler(void){ MCF_GPIO_PORTUB^=0x01;//Blink LED // Clear interrupt MCF_GPTA_GPTFLG2 = MCF_GPTA_GPTFLG2_TOF; }int main(void){ MCF_CLOCK_SYNCR=0x0705;//PLL bypass MCF_CLOCK_SYNSR=0x80;//External clock systeme  GPTA_Timer_Init(5, 65535, timer_handler); mcf5xxx_irq_enable(); MCF_GPIO_PORTUB=0; MCF_GPIO_DDRUB=0x07; while(1) {  MCF_GPIO_PORTUB^=0x02;  }}

 These code don't work, i can't set time of interrupt (second,milisecond,µs,etc) and when i change value of prescaler, this have no effect :/

Thanks for help





Message Edited by kedja on 2008-06-19 10:31 AM

Outcomes