Ich verwende MC9S08AW60A mit DEMO9S08AW60E Board (Freescale). Ich habe mich mit den Timern befasst, die mit der MCU angegeben sind. Ich möchte wissen, wie man Timer per Code genau implementiert. Die Freescale-Suite enthält auch Processor Expert (eine GUI zum Konfigurieren der MCU).
Ich habe den folgenden Code geschrieben, um die LEDs sequentiell aufleuchten zu lassen, OHNE eine DELAY-Funktion zu verwenden, dh nur durch Ändern/Verwenden von TIMERS und INTERNAL CLOCK GENERATOR.
//------------CODE BEGINS------------
PTFDD = 0xFF;
TPM1SC = 0x0E;//configures the Timer 1 Status and Control Register
TPM1C2SC = 0x98;//configures the TImer 1 CHANNEL 2 Status and Control Register
ICGC1= 0xE8; //Have altered the ICG with respect to TPM.
ICGC2= 0x8E;
//As you can see i have not altered the ICG in any way.And the same values as above
//(for TPM) i have emulated using the Processor Expert.
for (i=1;i<=8;i++)
{
if (i==8) i = 1;
if (i==1) PTFD = 0x01;
if (i==2) PTFD = 0x02;
if (i==3) PTFD = 0x04;
if (i==4) PTFD = 0x08;
if (i==5) PTFD = 0x10;
if (i==6) PTFD = 0x20;
if (i==7) PTFD = 0x40;
}
//----------CODE ENDS-----------------
Aber alles, was ich bekomme:
Auf dem Datenblatt finden Sie auf Seite 165 den Timer/PWM und auf Seite 129 den Inter Clock Generator.
Da die Timer-Frequenz sehr hoch ist, würden wir anscheinend eine große Prescaler-Einstellung benötigen, um sie einzurichten (ich habe das Maximum bei 128 erreicht). Nach einem Gespräch mit meinem Kollegen sagt er, dass ich einen periodischen "Tick" erzeugen muss, bei dem die Blinkperiode für jede LED entsprechend eingestellt ist. Um sicherzustellen, dass die LED (EIN oder AUS) eher dem TICK als der Bustaktfrequenz entspricht. Ja, das funktioniert, aber ich bin immer noch verwirrt.
Wenn Sie das Datenblatt verwenden können, um die verschiedenen Registerfunktionen zu verstehen, warum funktioniert es dann nicht, die Frequenz des Timers gemäß den Anforderungen einzustellen?
Außerdem, ist dieses "Tick" nicht dasselbe wie die Delay-Funktion??
Hier ist der Code für dasselbe (übrigens wurde mir dieser Code im Freescale-Forum vorgeschlagen, aber er könnte auch jemand anderem helfen; ich nehme keine Anerkennung für diesen Code):
// Assumed bus frequency: 8.0 MHz
// TPM prescale divisor: 4
// Global variables:
byte tic_cnt; // Timer tick counter
byte ch_nbr; // LED channel number
// LED mask values:
#define mLED0 0x01
#define mLED1 0x02
#define mLED2 0x04
#define mLED3 0x08
#define mLED4 0x10
#define mLED5 0x20
#define mLED6 0x40
#define mLED7 0x80
#define TIC_INCR 20000 // 10 ms tick period, with prescale 4
//***************************************************************
// LED blink polling function
void LED_poll( void)
{
if (!tic_cnt)
{ // Timeout occurred
tic_cnt = 50; // Start new 500ms timing interval
ch_nbr++;
if (ch_nbr == 8) ch_nbr = 0;
if (ch_nbr == 0) PTFD = mLED0; // Turn LED0 on, other LEDs off
if (ch_nbr == 1) PTFD = mLED1; // Turn LED1 on, other LEDs off
if (ch_nbr == 2) PTFD = mLED2; // Turn LED2 on, other LEDs off
if (ch_nbr == 3) PTFD = mLED3; // Turn LED3 on, other LEDs off
if (ch_nbr == 4) PTFD = mLED4; // Turn LED4 on, other LEDs off
if (ch_nbr == 5) PTFD = mLED5; // Turn LED5 on, other LEDs off
if (ch_nbr == 6) PTFD = mLED6; // Turn LED6 on, other LEDs off
if (ch_nbr == 7) PTFD = mLED7; // Turn LED7 on, other LEDs off
}
}
__interrupt VectorNumber_Vtpm1ch0 void ISR_TPM1_ch0( void)
{
TPM1C0_CH0F = 0; // Clear TPM channel flag
TPM1C0V += TIC_INCR; // Set next software compare
if (tic_cnt) tic_cnt--;
}
eingebettet.kyle
Blattansch
Blattansch
eingebettet.kyle
eingebettet.kyle
TPM1SC = 0x10
.ELSnB:ELSnA
müssen beide 0 sein, damit der Timer die Ausgabe beim Vergleichen nicht umschaltet.Blattansch