Reply by aleksi May 9, 20102010-05-09
Hi There

I'm new with programming a microcontroller, so sorry for some questions.
I have a HCS08 SofTec starterkit.

I want to control the light intensity of a external LED with a PWM.
Therefor, I want to control the Duty Cycle of the PWM with the
potentiometer on my starterkit. The ATD conversion is working. But my timer
is not working and I have no idea why. To confirm that the timer is
working, I set an interrupt. When the Timer has reached the channel value,
port F on my starterkit should be increment (On port F are eight LEDs). But
as I said, it dosen't work.

Can you help me?

Here's my code:

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include <MC9S08GB60.h>

#define Input 0x00
#define Output 0xFF  

int low = 0;     //low-value from ADC
int high = 0;    //high-value from ADC

void interrupt ISR_Timer(void)
{
  PTFD++;                    //verification, that the flag is set
  TPM1C0SC = TPM1C0SC;	    //clear channel 0 interrupt falg
	TPM1C0SC_CH0F = 0;		
}

void InitPorts(void)
{
  SOPT_COPE = 0;          //disable Watchdog
  
  PTBDD = Input;
  PTDDD = Output;
  PTFDD = Output; 
}

void InitAD (void)
{	
    ATD1C_ATDPU   = 1;        /* power on */
    ATD1C_RES8    = 0;     	 /* 10-bit Resolution */
    ATD1SC_ATDCO  = 1;        /* continuous mode */
    ATD1PE_ATDPE0 = 1;        /* enable bit 1 */
    ATD1SC_ATDCH  = 0;      	 /* select channel 1 */
}

void InitTimer(void)

{
  //Timer 1 Control & Status Register
  TPM1SC_TOIE = 0;            //Timer 1 Overflow Interrupt disable
  TPM1SC_CPWMS = 1;           //Center aligned mode
  TPM1SC_CLKSA = 1;           //Internal Clock source
  TPM1SC_CLKSB = 0;
  TPM1SC_PS0 = 1;            //Prescaler = 128
  TPM1SC_PS1 = 1;            //Prescaler = 128
  TPM1SC_PS2 = 1;            //Prescaler = 128
  
  //Timer 1 Modulo Register
  TPM1MODH = 0xF4;
  TPM1MODL = 0x24;
  
  //Timer 1 Channel 0 Control Register
  TPM1C0SC_CH0IE = 1;         //Channel 0 Overflow Interrupt enable
  TPM1C0SC_MS0B = 1;          //PWM mode
  TPM1C0SC_ELS0A = 1;         //Edge aligned mode    
}
  

void main (void)
{ 
  InitPorts();
  InitAD();
  InitTimer();
  
  for (;;)
  {
  	if(ATD1SC_CCF == 1)
  	{
  		TPM1C0VL = ATD1RL;
  		TPM1C0VH = ATD1RH;
  		high = ATD1RH;
  		low = ATD1RL;
  	}
  }
}


Allocation in *.prm file:

VECTOR 8 ISR_Timer 



	   
					
---------------------------------------		
Posted through http://www.EmbeddedRelated.com