Schleifen und Mikrocontroller

Schleifen und Mikrocontroller


Das versuche ich herauszufinden, ich habe einen MC9S08AW60. Es hat zwei Timer und ich versuche zu konfigurieren oder nur nach einem Häkchen vom Timer zu suchen, dh ich möchte nur überprüfen, wann sich das Überlauf-Flag ändert. Das grundlegende Design des Codes ist:


PTFDD = 0xFF;
int j,ch_nbr;
// 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

void main()
{
While(j>0){
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
Mydelay();
}
}
void Mydelay(int *j)
{
if (TPM1SC_TOF == 0) j=0;
else j=1;
return j;
}

Die Idee ist, zu prüfen, ob der Wert "j" ist UND gleichzeitig zu entscheiden, ob die LEDs leuchten sollen oder nicht!
Dieser Code funktioniert nicht. Es ist irgendwann her, seit ich die C-Programmierung verwendet habe. Ich bin ein wenig wackelig und brauche etwas Hilfe. Eine ordentliche Erklärung wäre schön.
Bitte beachten Sie den folgenden Link für das Datenblatt der MCU:
http://cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08AW60.pdf


Kann die folgende Funktion anstelle des bestehenden Mydelay ersetzt werden:


int Mydelay(int& j)
{
if(TPM1SC_TOF == 0) j=0;
else j=1;
return j;
}
void main()
{
PTFDD = 0xFF;
int j,ch_nbr;
// 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
While(j==1)
{
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
}
Mydelay();
}

Gefragt vonsheetansh

Antworten:


Zuallererst möchten Sie vielleicht die Bitverschiebung verwenden, um Ihren Code erheblich zu vereinfachen (denn das ist es, was Sie im Wesentlichen tun, ein bisschen verschieben).


Das bedeutet, dass Sie nicht 8 Konstanten für jede Position benötigen, sondern einfach den << verwenden Operator, um das Bit bei jeder Iteration um eine Position nach links zu verschieben:


int MoveToLeft(int bitPosition)
{
// shift left
bitPosition = bitPosition << 1;
// reset to '1' when we shift through all 8 bits
if ((bitPosition & 0xFF) == 0)
bitPosition = 1;
return bitPosition;
}

Als nächstes ist die Verwendung von Interrupt-Routinen ein besserer Weg als das Abfragen des Timer-Werts. Sie müssen eine Funktion einrichten, die automatisch aufgerufen wird, wenn Ihr Timer mit dem Zählen fertig ist.


Ich bin mir nicht sicher, ob dein Code überhaupt so funktioniert. Ist der Zweck Ihres Timers, eine Verzögerung zwischen LED-Wechseln zu erzeugen? Setzt sich Ihr Timer automatisch zurück? So etwas wäre logischer, wenn der Timer nur dazu dient, vor dem Übergang zu warten:


while (1) // repeat indefinitely
{
// shift the bit
ch_nbr = MoveLeft(ch_nbr);
PTFD = ch_nbr;
// while the timer is counting, do nothing
while (TPM1_TOF == 0)
{ }
// reset the timer
(not sure about this part, check your docs)
}