Timer und interner Taktgenerator auf Freescale MCU

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:

  1. LEDs sind eingeschaltet, aber sehr schwach, ich denke, sie schalten sehr schnell um. Habe ich recht?
  2. Muss ich außerdem die ICG-Einstellungen ändern, wenn ich TIMEr verwende?
  3. Außerdem habe ich das Gerät mit Processor Expert initialisiert und das gleiche als Code geschrieben. stört es. (Ich habe sichergestellt, dass beide die gleichen Werte darstellen, sonst hätte es mir einen Fehler angezeigt.

Auf dem Datenblatt finden Sie auf Seite 165 den Timer/PWM und auf Seite 129 den Inter Clock Generator.

Für Ihre erste Frage, haben Sie ein Oszilloskop, mit dem Sie überprüfen können? Wenn nicht, versuchen Sie, einen Haltepunkt zu setzen und schrittweise durchzugehen. Wenn Sie das tun, sollte jede LED mit voller Helligkeit leuchten und sich nur ändern, wenn Sie zum nächsten Schritt klicken.
@embedded.kyle: Ich habe das überprüft. Interessanterweise leuchten die LEDs nicht. Und ich habe auch gerade festgestellt, dass die LEDs und der Timer die gleichen Pins teilen. Kann das der Grund sein??
@embedded.kyle: Ja, ich kann ein Oszilloskop bekommen. Welche Pins überprüfe ich?
Sie leuchten nicht, wenn Sie durchtreten? Das ist neugierig. Ich bin mit dem Chip nicht vertraut, also muss ich das Datenblatt ein wenig überprüfen. Verwenden Sie jedoch im Normalbetrieb das Oszilloskop, um die Pins zu überprüfen, die jede LED ansteuern. Sie sollten über die Kopfzeilen darauf zugreifen können. Überprüfen Sie die Frequenz der Rechteckwelle, die sie antreibt.
Einstellung versuchen TPM1SC = 0x10. ELSnB:ELSnAmüssen beide 0 sein, damit der Timer die Ausgabe beim Vergleichen nicht umschaltet.
@embedded.kyle: Danke Kumpel, dass du dich damit befasst hast. Es macht immer noch keinen Unterschied. Die LEDs sind nur DIM.

Antworten (1)

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.

  1. 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?

  2. 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--;
}
"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?" Es ist möglich, dass die Timer-Hardware nicht mit einem Hardware-Prescaler ausgestattet ist, der groß genug ist, um die gewünschten Verzögerungen zu erzeugen.
"Außerdem, ist dieses "Tick" nicht dasselbe wie die Delay-Funktion?" Nein, weit gefehlt. Eine Verzögerungsfunktion ist etwas, das nur CPU-Zyklen in einer Schleife verbrennt, ohne sich um die Echtzeitgenauigkeit zu kümmern. Mit einer Interrupt-Lösung wie der von Ihnen geposteten kann die CPU sinnvolle Aufgaben erledigen, während sie auf Ihren Timer wartet. Beispielsweise kann es die Hauptschleife des Programms ausführen und die LED als "Hintergrundaufgabe" blinken lassen. Und gleichzeitig erhalten Sie eine viel bessere Echtzeitgenauigkeit.
@Lundin: danke Kumpel. das hat einiges geklärt.