COM2 в RTU188MX |
Ответить |
Автор | |
Новичок Присоединился: 17 Февраль 2006 Категория: Russian Federation Online Status: Offline Публикации: 11 |
Опубликовано: 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( do{ printf ("Zdem\n"); } // Ждем прерывания while(looping); puts("End"); // Восстанавливаем старый вектор _AX=(inport(MskRg))|Msk; // Запрещаем прерывания outportb(MskRg,_AL); setvect(Vector,out); return 0; } Заранее спасибо |
|
Новичок Присоединился: 17 Февраль 2006 Категория: Russian Federation Online Status: Offline Публикации: 11 |
|
Извиняюсь небольшие опечатки #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) { _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( do{ printf ("Zdem\n"); } // Ждем прерывания while(looping); puts("End"); // Восстанавливаем старый вектор _AX=(inport(MskRg))|Msk; // Запрещаем прерывания outportb(MskRg,_AL); return 0; } |
|
Новичок Присоединился: 23 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 3 |
|
Давно писал, сейчас не скажу точно - где собака зарыта, но после обработки прерывания нужно что-то поменять в каком-то регистре - посмотрите дополнительные сведения в документации по сpu188, там есть и пример проги. Кстати, а в процессоре после обработки прерывания нужно сбрасывать флажок запрета прерываний.
|
|
Новичок Присоединился: 17 Февраль 2006 Категория: Russian Federation Online Status: Offline Публикации: 11 |
|
Одну ошибку мы нашли #define Vector 11, а долно быть 11h, но контроллер все ровно не заходит в программу обработки прерывания |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
|
Было что-то у меня на эту тему, очень давно, подробностей уж не вспомню. Вот все что есть: http://forum.cta.ru/forum_posts.asp?TID=1246 (за правильность, конечно, ручаться не могу, хотя вроде работало на объекте). |
|
Инженер-системотехник
+7 (916) 477 3925 |
|
Новичок Присоединился: 06 Июль 2006 Категория: Ukraine Online Status: Offline Публикации: 3 |
|
Всем привет! У меня такой вопрос. Мы написали программу для передачи через СОМ2 RTU188 на комп несколько байт. Она не содержит обработчики прерываний. Просто настраивает СОМ2 на нужную частоту, паритет, стоп-биты и включает его, а потом в цикле передает. Программа подобная выше написанной. Она передает правильное количество байт, но при всем при этом всегда обнуляет старший бит каждого байта. то есть передаем 0хАА - приходит 0х2А передаем 0хВЕ - приходит 0х3Е. Может кто знает, что происходит??? Еще, дайте плиз ссылку на описание функций 14-ого прерывания. А то я о них узнаю только с форумов. А никакой документации найти не могу :( |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 25 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 116 |
|
У вас скорее всего передается 7 бит (передача текста), а не 8. Проверте настройки СОМ порта!
|
|
Vel
|
|
Новичок Присоединился: 06 Июль 2006 Категория: Ukraine Online Status: Offline Публикации: 3 |
|
_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. Пробовали так же передавать непосредственно записью в порт, а не через прерывание - результат аналогичный. |
|
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |