Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Встраиваемые системы
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

COM2 в RTU188MX

 Ответить Ответить
Автор
Сообщение
SL555 Смотреть выпадающим
Новичок
Новичок


Присоединился: 17 Февраль 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 11
Свойства публикации Свойства публикации   Ответить, цитируя автора - SL555 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: COM2 в RTU188MX
    Опубликовано: 14 Апрель 2006 13:42

Здравствуйте

Мы пытаемся написать программу для передачи и приема данных от COM2 в RTU188MX

С передачей проблем не возникает прекрасно все проходит наша SCADA система ловит данные, а вот с приемом возникают проблемы. Что бы  не занимать лишние ресурсы процессора решили сделать прием данных по прерыванию, но ни чего не получаться.

Вот привожу пример программы. Смысл программы в том , что мы передаем один байт

0xFE на соседний компьютер и ждем от него ответа. Судя по осциллографу, ответ нам приходит, но контроллер не реагирует. Наш  байт до компьютера доходит нормально

Может, скажите, в чем наша ошибка

 

#include <stdio.h>

#include <dos.h>

#include <bios.h>

 

 

#define _CPPARGS  ...

#define Msk1 0             // Маска для разрешения все  прерываний

#define Msk  0xffff      // Маска для запрещения  всех прерываний

#define Vector 11        // Номер вектора прерывания

#define MskRg 0xFF28  // Регистр масок

#define EOIRg 0xFF22  // Регистр окончания обработки прерывания

void interrupt out(_CPPARGS);

void interrupt(*oldfunc)(_CPPARGS);

int looping=1;

 

void interrupt func(_CPPARGS)  // Подпрограмма обработки прерывания

{

printf("interrput");

looping=0;                          // Сброс бесконечного цикла

 

// Завершаем прерывание

_AX=Vector;

outportb(EOIRg,_AX);

 

}

int main(void)

{

 

_AH=0x80; _AL=0x63; _DX=COM2; asm int 0x14 // Настройка COM2 9600 1stop

_AH=0x84; _AL=1; _DX=COM2; asm int 0x14  //Подключаем выход COM2

 

do { _AH=3; _DX=COM2; asm int 0x14     //Ждем готовности выходного регистра

  status=_AX&RdyOut;

  } while (status!=RdyOut);

 

   _AH=1; _AL=0xFE; _DX=COM2; asm int 0x14   // Передаем 0xFE

_AH=0x84;  _AL=0;  _DX=COM2 asm int 0x14; // Выключаем выход COM2

 

// Инициализируем новый вектор прерывания

 

oldfunc=getvect(Vector);

setvect(Vector,func);

 

_AX=(inport(0xFF28))&Msk1;  // Разрешаем все прерывания

outportb(MskRg, AL);

 

    do{

    printf ("Zdem\n");

        } //  Ждем прерывания

 

while(looping);

 

 

 

puts("End");

// Восстанавливаем старый вектор

_AX=(inport(MskRg))|Msk; // Запрещаем прерывания   

outportb(MskRg,_AL);

setvect(Vector,out);

 

return 0;

}

 

Заранее спасибо

Наверх
SL555 Смотреть выпадающим
Новичок
Новичок


Присоединился: 17 Февраль 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 11
Свойства публикации Свойства публикации   Ответить, цитируя автора - SL555 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Апрель 2006 13:59

Извиняюсь небольшие опечатки

#include <stdio.h>

#include <dos.h>

#include <bios.h>

 

 

#define _CPPARGS  ...

#define Msk1 0             // Маска для разрешения все  прерываний

#define Msk  0xffff      // Маска для запрещения  всех прерываний

#define Vector 11        // Номер вектора прерывания

#define MskRg 0xFF28  // Регистр масок

#define EOIRg 0xFF22  // Регистр окончания обработки прерывания

void interrupt func(_CPPARGS);

void interrupt(*oldfunc)(_CPPARGS);

int looping=1;

 

void interrupt func(_CPPARGS)  // Подпрограмма обработки прерывания

{

printf("interrput");

looping=0;                          // Сброс бесконечного цикла

 

// Завершаем прерывание

_AX=Vector;

outportb(EOIRg,_AL);

 

}

int main(void)

{

 int status;

_AH=0x80; _AL=0x63; _DX=COM2; asm int 0x14 // Настройка COM2 9600 1stop

_AH=0x84; _AL=1; _DX=COM2; asm int 0x14  //Подключаем выход COM2

 

do { _AH=3; _DX=COM2; asm int 0x14     //Ждем готовности выходного регистра

  status=_AX&RdyOut;

  } while (status!=RdyOut);

 

   _AH=1; _AL=0xFE; _DX=COM2; asm int 0x14   // Передаем 0xFE

_AH=0x84;  _AL=0;  _DX=COM2; asm int 0x14 // Выключаем выход COM2

 

// Инициализируем новый вектор прерывания

 

oldfunc=getvect(Vector);

setvect(Vector,func);

 

_AX=(inport(0xFF28))&Msk1;  // Разрешаем все прерывания

outportb(MskRg, AL);

 

    do{

    printf ("Zdem\n");

        } //  Ждем прерывания

 

while(looping);

 

 

 

puts("End");

// Восстанавливаем старый вектор

_AX=(inport(MskRg))|Msk; // Запрещаем прерывания   

outportb(MskRg,_AL);

 

 

return 0;

}

Наверх
greg Смотреть выпадающим
Новичок
Новичок


Присоединился: 23 Сентябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 3
Свойства публикации Свойства публикации   Ответить, цитируя автора - greg Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 02 Май 2006 19:46
Давно писал, сейчас не скажу точно  - где собака зарыта, но после обработки прерывания нужно что-то поменять в каком-то регистре - посмотрите дополнительные сведения в документации по сpu188, там есть и пример проги. Кстати, а в процессоре после обработки прерывания нужно сбрасывать флажок запрета прерываний. 
Наверх
SL555 Смотреть выпадающим
Новичок
Новичок


Присоединился: 17 Февраль 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 11
Свойства публикации Свойства публикации   Ответить, цитируя автора - SL555 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Май 2006 10:43

Одну ошибку мы нашли  #define Vector 11, а долно быть 11h,  но контроллер все ровно не заходит в программу обработки прерывания

Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 04 Май 2006 18:17

Было что-то у меня на эту тему, очень давно, подробностей уж не вспомню. Вот все что есть: http://forum.cta.ru/forum_posts.asp?TID=1246 (за правильность, конечно, ручаться не могу, хотя вроде работало на объекте).

Инженер-системотехник
+7 (916) 477 3925
Наверх
Grendis Смотреть выпадающим
Новичок
Новичок


Присоединился: 06 Июль 2006
Категория: Ukraine
Online Status: Offline
Публикации: 3
Свойства публикации Свойства публикации   Ответить, цитируя автора - Grendis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Июль 2006 21:34

Всем привет! У меня такой вопрос.

Мы написали программу для передачи через СОМ2 RTU188  на комп несколько байт. Она не содержит обработчики прерываний. Просто настраивает СОМ2 на нужную частоту, паритет, стоп-биты и включает его, а потом в цикле передает. Программа подобная выше написанной.

Она передает правильное количество байт, но при всем при этом всегда обнуляет старший бит каждого байта. то есть

передаем 0хАА - приходит 0х2А

передаем 0хВЕ - приходит 0х3Е.

Может кто знает, что происходит???

Еще, дайте плиз ссылку на описание функций 14-ого прерывания. А то я о них узнаю только с форумов. А никакой документации найти не могу :(

Наверх
Vel_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 25 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 116
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vel_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Июль 2006 04:52
У вас скорее всего передается 7 бит (передача текста), а не 8. Проверте настройки СОМ порта!
Vel
Наверх
Grendis Смотреть выпадающим
Новичок
Новичок


Присоединился: 06 Июль 2006
Категория: Ukraine
Online Status: Offline
Публикации: 3
Свойства публикации Свойства публикации   Ответить, цитируя автора - Grendis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Июль 2006 19:31

Первоначально опубликовано Vel_

У вас скорее всего передается 7 бит (передача текста), а не 8. Проверте настройки СОМ порта!

_AH=0x80; _AL=0x63; _DX=COM2; asm int 0x14 // Настройка COM2 9600 1stop

Нет, дело не в этом, настройка правильная, на 8 бит. Пробовали передавать 7-битной передачей - получается полная чепуха.

Передаем подряд один и тот же байт 0хАА, а приходит 0х2А, передаем 0х31 прходит 0х31. Это говорит о том, что именно обнуняет, а не инвертирует или что-то там еще. На физическом уровне это RS232. Cоответственно COM2 настроен на RS232 (перемычки).

Гипер-терминал настроен на такую-же частоту и количество передаваемых бит. По таким же пааметрам, что и RTU188.

Пробовали так же передавать непосредственно записью в порт, а не через прерывание - результат аналогичный.

Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz