Петли и микроконтроллеры


Это то, что я пытаюсь выяснить, у меня есть MC9S08AW60. Он имеет два таймера, и я пытаюсь настроить или просто проверить тик от таймера, т. е. я просто хочу проверить, когда флаг переполнения меняется. основная конструкция кода такова:

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

Идея состоит в том, чтобы проверить, является ли значение " j " и одновременно решить, должен ли загораться светодиод или нет! Этот код не работает.Прошло некоторое время с тех пор, как я использовал программирование на языке Си. Я немного дрожу и нуждаюсь в помощи. Правильное объяснение было бы неплохо. Пожалуйста, обратите внимание на следующую ссылку для спецификации MCU: http://cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08AW60.pdf

Можно ли заменить вместо существующего Mydelay следующую функцию:

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

3 ответа:

Прежде всего, вы можете использовать сдвиг битов, чтобы значительно упростить свой код (потому что это то, что вы, по сути, делаете, сдвигая бит).

Это означает, что вам не нужно иметь 8 констант для каждой позиции, а просто использовать оператор <<, чтобы переместить бит на одну позицию влево на каждой итерации:

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

Далее, лучший способ, чем опрос значения таймера, - использоватьпрерывания . Вам нужно настроить функцию, которая будет вызвана автоматически, когда ваш таймер заканчивает отсчет.

Я не уверен, что ваш код вообще работает так. Является ли целью вашего таймера создание задержки между изменениями светодиода? Ваш таймер автоматически сбрасывается? Что-то вроде этого было бы более логичным, если таймер служит только для ожидания перед переходом:

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

Ну, если это вырезанная вставка вашего кода, вам нужно исправить несколько вещей:

  • 1-я эта строка: While(j>0){ я нигде не вижу J, объявленного или определенного. Компилятор должен был выдать ошибку на этом, и While должен быть в нижнем регистре while ( j > 0 ).

  • То же самое с ch_nbr.

  • Когда вы звоните MyDelay(), Вы написали его, чтобы взять &int, и вы, вероятно, имели в виду (int *j), тогда вы ничего не передали.

  • If должен быть в нижнем регистре if

  • И да, как показали комментарии, у вас есть 3 открывающие скобки { и 5 закрывающих }.

Исправьте их, убедитесь, что он компилируется время от времени, а затем займитесь любой логикой.

  1. У вас больше закрывающих скобок, чем открывающих. Попробуйте исправить это, сопоставив скобки (отступ поможет).

  2. Вы нигде не объявляли переменные j и cn_nbr, но вы их используете.

  3. Операторы C являются строчными (while, а не While).

  4. Вы вызываете Mydelay() без параметров, когда Mydelay(int &j) ожидает параметр. Кроме того, &j возвращает адрес переменной j. Я думаю, что вы хотите int *j здесь. Подробнее об указателях.

  5. Используйте switch или if ... else if вместо if ... if ... if .... Ваш код работает в обоих направлениях, но с помощью switch или if else быстрее.

Подумайте о том, чтобы узнать больше о программировании на языке Си здесь: http://www.cprogramming.com/