реклама на сайте
подробности

 
 
> Не работает os_wait для RTX-166 Tiny (Keil)
IvanObs
сообщение May 26 2011, 13:18
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 26-05-11
Пользователь №: 65 286



Доброго времени суток! Не работает os_wait для RTX-166 Tiny (Keil).

Задача:
- мигать диодом

Код
#include <reg166.h>                  // special function registers 80C166
#include <rtx166t.h>                 // RTX-166 tiny functions & defines

#define BLINKING  0                   // task number of task:  blinking

sbit  vd = P2^1;                         // I/O Pin:  vd    lamp output

/******************************************************************************/
//                              Task 0 'blinking'
/******************************************************************************/
void blinking (void) _task_ BLINKING  {        // blink vd
  DP2 = 0xFFFF;                                          // data direction register
  vd = 0;                                                    // all lights off
  while (1)  {                                              // endless loop

    vd = 1;                                                 // vd light on
    os_wait (K_TMO, 300, 0);                       // wait for timeout: 300 ticks
    vd = 0;                                                 // vd light off
    os_wait (K_TMO, 300, 0);                       // wait for timeout: 300 ticks
  }

}


Причём:
- в дебагере работает, а на железе - нет
- сам hex-файл загружается нормально.

То что грузиться нормально, проверил так:
- сначала загрузил этот код:
Код
#include <reg166.h>                  // special function registers 80C166
#include <rtx166t.h>                 // RTX-166 tiny functions & defines

#define BLINKING  0                   // task number of task:  blinking

sbit  vd = P2^1;                         // I/O Pin:  vd    lamp output

/******************************************************************************/
//                              Task 0 'blinking'
/******************************************************************************/
void blinking (void) _task_ BLINKING  {        // blink vd
  DP2 = 0xFFFF;                                          // data direction register
  vd = 0;                                                    // all lights off
  while (1)  {                                              // endless loop
  }

}


Диод не загорелся.

- потом загрузил этот код:
Код
#include <reg166.h>                  // special function registers 80C166
#include <rtx166t.h>                 // RTX-166 tiny functions & defines

#define BLINKING  0                   // task number of task:  blinking

sbit  vd = P2^1;                         // I/O Pin:  vd    lamp output

/******************************************************************************/
//                              Task 0 'blinking'
/******************************************************************************/
void blinking (void) _task_ BLINKING  {       // blink vd
  DP2 = 0xFFFF;                                         // data direction register
  vd = 1;                                                   // vd light on
  while (1)  {                                             // endless loop
  }

}


Диод загорелся.

А мигать не получается

Использовал Startup по умолчанию.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
gosha
сообщение Jun 2 2011, 05:20
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30



Внутрисхемная отладка не работает?
Go to the top of the page
 
+Quote Post
IvanObs
сообщение Jun 7 2011, 08:21
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 26-05-11
Пользователь №: 65 286



Цитата(gosha @ Jun 2 2011, 09:20) *
Внутрисхемная отладка не работает?


Я не знаю, как её реализовать. Если есть возможность по шагам выполнять программу прямо на аппаратуре, то было бы проще. Очень нужно что бы эта программа заработала. Мучаюсь не могу разобраться.

Моё последнее достижение - проверка того, что возвращает функция os_wait (K_TMO, 1000, 0), здесь K_TMO-таймаут (задержка) на 1 секунду. В зависимости от возвращаемого значения загорается тот или иной диод. У меня загорается VD4. Пробовал на разных контроллерах. Проверил, что VD4 загорается в тему, менял VD4 (на другие порты). То есть os_wait () срабатывает с ошибкой и возвращает не то что нужно.

Ещё оно наблюдение. Если раскомментировать настройку последовательного канала передачи, то диод вообще не загорится. И я не могу проверить какое число возвращает функция os_wait().

Лазал в исходный код этой операционной систеты (RTX-166 Tiny). Там есть реализация os_wait() на ассемблере, буду разбираться, может пойму. Может внутрисхемная отладка выручит?

Код:
Код
#include <reg166.h>                   /* special function registers 80C166    */
#include <rtx166t.h>                  /* RTX-166 tiny functions & defines     */

#define BLINKING  0                   /* task number of task:  blinking       */

sbit  vd1 = P2^1;                      /* I/O Pin:  vd    lamp output          */
sbit  vd2 = P2^2;                      /* I/O Pin:  vd    lamp output          */
sbit  vd3 = P2^3;                      /* I/O Pin:  vd    lamp output          */
sbit  vd4 = P2^0;                      /* I/O Pin:  vd    lamp output          */
int idata event;
/******************************************************************************/
/*        Task 3 'blinking':                       */
/******************************************************************************/
void blinking (void) _task_ BLINKING  {        /* blink vd                    */

//  P3  |= 0x0400;             /* set PORT 3.10 output latch (TXD)              */
//  DP3 |= 0x0400;             /* set PORT 3.10 direction control (TXD output)  */
//  DP3 &= 0xF7FF;             /* reset PORT 3.11 direction control (RXD input) */
//  S0TIC = 0x45;              /* transmit interrupt enable; ILVL = 1; GLVL = 1 */
//  S0RIC = 0x46;              /* receive  interrupt enable; ILVL = 1; GLVL = 2 */
//  S0BG  = 15;              /* set baudrate to 57600 BAUD                    */
//  S0CON = 0x8011;            /* set serial mode                               */

  DP2 = 0xFFFF;                                /* data direction register     */
  
  vd1 = 0;                                      /* all lights off              */
  vd2 = 0;                                      /* all lights off              */
  vd3 = 0;                                      /* all lights off              */
  vd4 = 0;                                      /* all lights off              */

    event = os_wait (K_TMO, 1000, 0);                  /* wait for timeout: 1000 ticks */
  switch (event)
    {
    case NOT_OK:
      vd1 = 1;
      break;
    case TMO_EVENT:
      vd2 = 1;

      break;
    case SIG_EVENT:
      vd3 = 1;
      break;
    default:
      vd4 = 1;
      break;
   }

  while (1)  {                                 /* endless loop                */
  }


}
Go to the top of the page
 
+Quote Post
Аматер
сообщение Jun 14 2011, 08:03
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616



Я обычно брал стандартный пример и переделывал.
С 166 не работал, но думаю стоит обратить внимание на startup.

Сообщение отредактировал Аматер - Jun 14 2011, 08:06
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 03:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016