Loop e microcontrollori

Loop e microcontrollori


Questo è quello che sto cercando di capire, ho un MC9S08AW60. Ha due timer e sto provando a configurare o semplicemente controllare un segno di spunta dal timer, cioè voglio solo controllare quando cambia il flag di overflow. il design di base del codice è:


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;
}

L'idea è di verificare se il valore "j" E contemporaneamente decidere se i LED devono accendersi o meno!
Questo codice non funziona. È passato del tempo da quando ho usato la programmazione C. Sono un po' traballante e ho bisogno di aiuto. Sarebbe utile una spiegazione adeguata.
Si prega di considerare il seguente collegamento per il foglio dati dell'MCU:
http://cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08AW60.pdf


La funzione seguente può essere sostituita al posto del Mydelay esistente:


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();
}

Chiesto dasheetansh

Risposte:


Prima di tutto, potresti voler usare lo spostamento dei bit per semplificare in modo significativo il tuo codice (perché è quello che stai essenzialmente facendo, spostando un po').


Ciò significa che non devi avere 8 costanti per ogni posizione, ma usa semplicemente il << per spostare il bit di una posizione a sinistra ad ogni iterazione:


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;
}

Successivamente, il modo migliore del polling del valore del timer consiste nell'utilizzare le routine di interrupt. Devi impostare una funzione che verrà richiamata automaticamente ogni volta che il timer termina il conteggio.


Non sono sicuro che il tuo codice funzioni anche in questo modo. Lo scopo del tuo timer è quello di creare un ritardo tra i cambi dei LED? Il tuo timer si reimposta automaticamente? Qualcosa del genere sarebbe più logico se il timer servisse solo ad attendere prima della transizione:


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)
}