Петли и микроконтроллеры
Это то, что я пытаюсь выяснить, у меня есть 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 ответа:
Прежде всего, вы можете использовать сдвиг битов, чтобы значительно упростить свой код (потому что это то, что вы, по сути, делаете, сдвигая бит).
Это означает, что вам не нужно иметь 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 закрывающих}
.Исправьте их, убедитесь, что он компилируется время от времени, а затем займитесь любой логикой.
У вас больше закрывающих скобок, чем открывающих. Попробуйте исправить это, сопоставив скобки (отступ поможет).
Вы нигде не объявляли переменные
j
иcn_nbr
, но вы их используете.Операторы C являются строчными (
while
, а неWhile
).Вы вызываете
Mydelay()
без параметров, когдаMydelay(int &j)
ожидает параметр. Кроме того,&j
возвращает адрес переменнойj
. Я думаю, что вы хотитеint *j
здесь. Подробнее об указателях.Используйте
switch
илиif ... else if
вместоif ... if ... if ...
. Ваш код работает в обоих направлениях, но с помощью switch или if else быстрее.Подумайте о том, чтобы узнать больше о программировании на языке Си здесь: http://www.cprogramming.com/