Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
signum
Встал на лапы
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Re: Вопросы по С/С++ (СИ)

Сообщение signum »

drac0Sha писал(а):Ребят, помогите, пожалуйста разобраться с USARTOM.
у меня такое задание:
Разработать программу, реализующую генератор изменяемой частоты. Начальная частота – 0.5 Гц, т.е. желтый индикатор 1 с горит, 1 с не горит и т.д. Нажатие кнопки 1 приводит к увеличению частоты на 40%, нажатие кнопки 2 уменьшает частоту на 40%. Для облегчения замера частот использовать красный и зеленый индикаторы: красный должен мигать с частотой в 10 раз большей основной частоты (желтого индикатора), а зеленый должен мигать с частотой в 10 раз меньше основной. Одновременное нажатие обеих кнопок должно возвращать генератор в исходное состояние – 0.5 Гц.

Должны обеспечиваться следующие форматы сообщений как от ПК к узлу, так и от узла к ПК:
SOF len message CS
SOF – Start of Frame, признак начала сообщения, 1 байт, 0x7E;
len – длина сообщения в байтах, 1 байт;
message – сообщение, len байт;
CS – контрольная сумма, 1 байт
Контрольная сумма CS должна вычисляться сложением байтов поля message при помощи операции «ИСКЛЮЧАЮЩЕЕ ИЛИ».
При передаче 8-битных байтов использовать проверку четности и 1 стоповый бит. Постараться организовать взаимодействие на максимально возможной скорости.
Что нужно сделать
o Запрос состояния (query). В ответ на этот запрос узел должен сообщить номер своего состояния, оставшееся время нахождения в нем (в единицах таймера) и состояние индикаторов.
o Установка состояния (set). Узел должен немедленно установить запрошенное состояние и оповестить ПК об успешном выполнении команды.
o Еще 2-3 команды по усмотрению.

Вот код:
Спойлер

Код: Выделить всё

#define F_CPU 8000000UL  // указываем частоту в герцах
#include <stdlib.h>
#include <avr/io.h>            // регистры ввода/вывода
#include <avr/interrupt.h>      // обработка прерываний
#include <avr/delay.h>          //задержка


unsigned int next_frequency = 0; // признак смены частоты
unsigned int current_message = 0; // текущее сообщение
unsigned int length_of_get_message = 0; // длина полчаемого сообщения
unsigned int data_message[100]; // получаемое сообщение
unsigned int control_summ; // контрольная сумма
volatile unsigned int Step; // общий шаг частоты
volatile unsigned int Step_inc; //шаг увеличения частоты
volatile unsigned int Step_dec; //шаг уменьшения частоты
volatile unsigned int Count_time_seconds; // счетчик для мигания зеленого
volatile unsigned int button; // признак нажатия кнопки
volatile unsigned int Frequency; // время таймера
volatile unsigned int Frequency_yellow; // частота желтого
volatile unsigned int Count_time_seconds_red; //счетчик для мигания красного
volatile unsigned int Frequency_yellow_temp;

#define Size_of_queue 150
#define SOF   0x7E

unsigned char Queue[Size_of_queue]; //очередь запросов
unsigned char* first_byte = Queue; //первый запрос в очереди
unsigned char* last_byte = Queue; //последний запрос в очереди
unsigned char queue_is_free = 1; //очередь пуста

//==================
//==================
/// запросы
enum Types_of_inquiry
{
   Get_status = 0x31, //получить статус
   Set_status = 0x32, // установить статус
   Decrease_status = 0x33, // уменьшаем частоту
   Increase_status = 0x34, // увеличиваем частоту
   Reset_control = 0x35, // перезапуск
   
   Control_was_restarted = 0x10, //факт рестарта
   Frequency_decrease = 0x11, // переход на уменьшение частоты
   Frequency_increase  = 0x12, // переход на увеличение частоты
   Status_was_getting = 0x13, // статус был получен
   Status_was_setting = 0x14, // статус был установлен

   UNDEFINED_COMMAND = 0x20, // неизвестная команда

   Next_step_by_timer = 0x16, // переход на след частоту по таймеру
   Button_was_pressed= 0x17, //нажали кнопку
   Control_summ_is_bad = 0x18 // неверная контрольная сумма
};

//==================
// добавление байта в очередь
void Add_byte_to_queue(unsigned char byte)
{
   if (last_byte != first_byte || queue_is_free == 1){
      *last_byte = byte;
      last_byte++;
      if (last_byte == Queue + Size_of_queue){
         last_byte = Queue;
      }
      queue_is_free = 0;
   }
}

//==================
// получение байта из очереди
unsigned char Get_byte_from_queue()
{
   unsigned char byte = *first_byte;
   first_byte++;
   if (first_byte == Queue + Size_of_queue){
      first_byte = Queue;
   }
   if (first_byte == last_byte){
      queue_is_free = 1;
   }
   return byte;
}

//==================
// отсылка байта через USART
void USART1_send_byte(unsigned char message)
{
   //Ждем пока данные передаются
   while ( !(UCSR1A & (1<<UDRE1)) );
   
   UDR1 = message;
}

//==================
// отсылка сообщения через USART
void USART1_send_message (unsigned char *message, unsigned char length)
{
   // посылаем признак начала сообщения
   USART1_send_byte(SOF);
   // длина сообщения
   USART1_send_byte(length);
   unsigned char control_Summ = 0;
   // посылаем сообщение
   for(unsigned char i = 0; i < length; i++)
   {
      USART1_send_byte(message[i]);
      control_Summ ^= message[i];
   }
   // контрольная сумма
   USART1_send_byte(control_Summ);
}

//==================
/*Функция уменьшения частоты */
void DecreaseFrequency()
{
   if (Frequency_yellow < (65535/1.4)) {
      Frequency_yellow = Frequency_yellow*1.4;
   }
}

//==================
/*   Функция увеличения частоту */
void IncreasedFrequency()
{
   if (Frequency_yellow > 1) {
      Frequency_yellow =Frequency_yellow*0.6;
   }
}

//==================
// ФУНКЦИЯ 3 установить состояние
void Set_status_function (unsigned int *data){
   // номер шага, соответственно, частота
   PORTB = data[1];
   PORTE = data[2];
   // поличуть текущее время на единичном интервале
   TCNT1 = data[3];
   TCNT1 = data[4]>>8;
   
}

//==================
// ФУНКЦИЯ 4 restart
void Restart_Controller()
{
   Frequency_yellow = 0.1*8000000/64;
}




//==================
// полное состояние контроллера
void Full_Status_Controller (unsigned int *data, unsigned int length,unsigned char _SOF )
{
   //  тип сообщени
   data[0] = _SOF;
   // номер шага, соответственно, частота
   data[1] = PORTB;
   data[2] = PORTE;
   // текущее время на данном шаге в единицах таймера
   data[3] = TCNT1>>8;
   data[4] = TCNT1;
   length = 5;
}

//==================
// передача полного сообщения
void Send_Status(unsigned char _SOF)
{
   unsigned char length = 10;
   unsigned char data[100];
   Full_Status_Controller(data, length,_SOF);
   USART1_send_message(data, length);
}


//==================
// разбор USART сообщегия
void USART_work (unsigned int *data){
   switch (data[0]){
      case Get_status: // если поличуть статус
      Send_Status (Status_was_getting); // сообщили
      break;
      case Set_status: // установить статус
      Set_status_function(data); // выполнить нужное действие
      Send_Status (Status_was_setting); // сообщить об этом
      break;
      case Decrease_status:
      DecreaseFrequency ();
      Send_Status (Frequency_decrease);
      break;
      case Increase_status:
      IncreasedFrequency();
      Send_Status (Frequency_increase);
      break;
      case Reset_control:
      Restart_Controller();
      Send_Status (Control_was_restarted);
      break;
      default: // ошибка
      Send_Status (UNDEFINED_COMMAND);
      break;
   }
}

//==================
// обработка комманды в очереди
void Work_command(){
   unsigned char answer_message[2]; // отправляемое сообщение об ошибке
   while (!queue_is_free){
      unsigned char byte = Get_byte_from_queue(); // взяли байт из очереди

      switch (current_message){
         case 0: // начинается сообщение
         if (byte == SOF){ // если первое это признак начала
         data_message[current_message] = byte; // взяли его
         current_message++; // след шаг
      }
      else{
         answer_message[0] = UNDEFINED_COMMAND;//если не признак начала - ошибка
         answer_message[1] = byte;
         USART1_send_message(answer_message, 2);    // сообщили
      }
      break;
      case 1: // если уже послали признак начала сообщения
      data_message[current_message] = byte;// формируем сообщение
      current_message++; // след шаг
      length_of_get_message = byte; // взяли длинку, тк это следующрий элемент
      control_summ = 0;
      break;
      default: // идет сам текст сообщения
      data_message[current_message] = byte; // взяли элемент
      current_message++; // слудующий
      if (length_of_get_message > 0){ // на каждом шаге считаем контрольную сумму
      length_of_get_message--; // ум длину
      control_summ ^= byte; // собственно, контрольная сумма
   }else{ // когда дошли до конца сообщения
   if (control_summ == byte){ // если реальная сумма равно теоретической
   USART_work(data_message); // передать на USART
        }else{ // если контрольная сумма не совпадает
              data_message[0] = Control_summ_is_bad; // ошибка
       USART1_send_message(data_message, data_message[1]);
               }
            current_message = 0;
            }
            break;
      }      
   }
}

//==================
//==================
// инициализация
//==================
//==================
void Ititual(){

// красная лампочка
   DDRE = (1<<PE1)|(1<<PE2)|(1<<PE3);
   PORTE = (1<<PE1)|(1<<PE2)|(1<<PE3);
   
// кнопка
   DDRB = (0<<PB5)|(0<<PB6);
   PORTB = (1<<PB5)|(1<<PB6);
   
// предделитель наймера 64
   TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10);
   
// разрешаем прерывание от таймера 1.
   TIMSK = (1<<TOIE1);
   
   TCNT1 = 65536 - 0.1*8000000/64;
   Frequency_yellow = 0.1*8000000/64;
   sei();

   
//задаем скорость обмена, устанавливаем USART в нужный режим работы
   UBRR1H = 0;
   UBRR1L = 51;
   
//разрешаем прием-передачу
   UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(0<<TXCIE1);
   
//устанавливаем асинхронный режим работы и формат посылки: 8 бит, 1 стопповый бит
   UCSR1C = (0<<USBS1)|(1<<UCSZ10)|(1<<UCSZ11)|(0<<UCSZ12)|(0 << UMSEL1)|(0<<UPM10)|(0<<UPM11);

}

//==================
SIGNAL(SIG_OVERFLOW1){

      TCNT1 = 65536 -  Frequency_yellow ;
   
      PORTE = PINE^(1<<PE3);
      if (Count_time_seconds == 10) {
      PORTE = PINE^(1<<PE2);
      Count_time_seconds = 0;
      Count_time_seconds_red++;
      if (Count_time_seconds_red == 10) {
         PORTE = PINE^(1<<PE1);
           Count_time_seconds_red=0;
               }
         }
   Count_time_seconds++;
//==================         
   

}
// прерывание при получении данных по USART
SIGNAL (SIG_USART1_RECV)
{
   Add_byte_to_queue(UDR1);
}
//==================
//==================

// главная программа
int main()
{
      Ititual(); // инициализация
      while (1){ // бесконечный цикл

      _delay_ms(500); // формируем задержку 0.5с
/*проверяем одновременное нажатие двух кнопок */
   if ((PINB & (1<<PB6 | 1<<PB5))==0) {
            Frequency_yellow = 0.1*8000000/64;
      }
      else{

/* если обе кнопки не нажаты, то перейдем к проверке нажатия одной из кнопок*/
// проверяем нажатие кнопки уменьшения частоты    
      if ((PINB & (1<<PB6)) == 0){ // проверяем нажатие кнопки
         if (Frequency_yellow < (65535/1.4)) {
            Frequency_yellow = Frequency_yellow*1.4;
         }
      }
// проверяем нажатие кнопки увеличения частоты         
      if ((PINB & (1<<PB5)) == 0){ // проверяем нажатие кнопки
         if (Frequency_yellow > 1) {
            Frequency_yellow =Frequency_yellow*0.6;
         }
      }

      }
      Work_command();

   }
   return 0;
}
//==================
//==================


Тестирую в протеусе : подключил к собранной схеме virtual terminal. Нажимаю на кнопку 3 ( ASCII код 33) - должна поидее уменьшится частота, но мне в ответ приходит такое сообщение :
7E 02 20 33 13 и частота не уменьшается..
7E - начало сообщения (правильно), дальше должна идти длина сообщения (1 байт), тут почему то выдает 02, далее само сообщение (20 - неизвестная команда) , 33 код кнопки (ASCII) и 13 - контрольная сумма.
Подскажите, пожалуйста, может я не так ввожу команду или что-то неправильно в коде ?


1. протеус г.. я на нем несколько раз крепко прокалывался, отрабатывать необходимо каждую функцию по отдельности например в авр студ(неудобно но работает правильно) а лучше на железе.
2. буфер для USARTA сила, минимум в два раза больше максимальной длины посылки.
3. используйте таблицы а не формулы где это возможно.
4. критические части кода пишите на ассемблере.
5. пишите более читабельный и "прямой код" если хотите чтоб его читали(у Вас код читабельный, общая рекомендация).
6. кварц лучше использовать USARTовский.
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: Вопросы по С/С++ (СИ)

Сообщение U235 »

drac0Sha писал(а):Тестирую в протеусе : подключил к собранной схеме virtual terminal. Нажимаю на кнопку 3 ( ASCII код 33) - должна поидее уменьшится частота

Вы уверены, что виртуальный терминал при нажатии кнопки посылает пакет нужного Вам формата, а не просто код кнопки?
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

код странный на всю голову.
При приеме с уарта необходимо допускать 2 вещи
1 с уарта может придти все, что угодно
2 пакет может прерваться в любом месте.
Исходя из этого, необходимо
1. Настроить еще 1 таймер, которым при длительной паузе считать, что пришел рваный пакет и сбрасывать указатель приема в начало буфера, при приеме последовательности байт каждым байтом его обнулять
2. Не запихивать в кольцевой буфер и не верить входящей информации до тех пор, пока не посчитается контрольная сумма.
Сделать временной буфер, в который пихать входящую инфу, уже посчитанную с кс - бросать в кольцевой буфер для обработки. Он там тоже безобразно сделан, но это отдельная песня.
3. Состояние устройства - возможные - 3 -
1 - поиск стартового байта
2 - прием пакета
3 - обработка, после которой отправляем устройство в 1 состояние.


пс Не знаю, что вы так все на прот ополчились.
(с) вам не нравятся кошки? вы просто не умеете их готовить
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

А так-же, перейти на прерывания, для этого их и придумали, и убрать все константы с плавающей точкой.
Строка типа

Код: Выделить всё

Frequency_yellow =Frequency_yellow*0.6;
не должна работать. Frequency_yellow будет всегда равно нулю.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

Аlex
я предлагал тс уйти от десятых и флоатов путем умножения на 100, но не был услышан.
Там всего 1 формула
tmr1=65536 - Fin/F
где F - требуемая частота, она в него в долях герца.
если умножить
tmr1=65536 - Fin*100/F*100
то приходим к целочисленной математике.
Ну :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Ну, так и нужно делать. Представить все вещественные числа в виде дробей с целыми числами.
Математика 5, ёпти... :))
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

U235 писал(а): Вы уверены, что виртуальный терминал при нажатии кнопки посылает пакет нужного Вам формата, а не просто код кнопки?

Я так понял входящий пакет это как раз и есть один символ входящего байта, но терминал может еще передавать символ перевода каретки и не отображать этого на экране.
Вообще код достаточно сложный, и нужно отработать отдельные его части, чтобы нормально определить в чем сейчас конкретно загвоздка.
Можно начать с обработки очереди на выполнение.Допустим если задать изначально массив той самой очереди, то выполняться уже должно по известной последовательности. Как только выполнится, то очередь будет уже пуста и можно пробовать с терминалом. Либо если в этой последовательности происходит сбой, то нужно в программе обработки очереди и искать проблему.

еще, это мне одному показалось или здесь ошибка?

Код: Выделить всё

 TCNT1 = data[3];
   TCNT1 = data[4]>>8;  

Вроде должно быть так:

Код: Выделить всё

 TCNT1 = data[3]|(uint16_t)data[4]<<8;//Это если data[3] младший байт 
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: Вопросы по С/С++ (СИ)

Сообщение U235 »

Судя по этой функции, программа ожидает именно пакет.
Спойлер

Код: Выделить всё

//==================
// обработка комманды в очереди
void Work_command(){
   unsigned char answer_message[2]; // отправляемое сообщение об ошибке
   while (!queue_is_free){
      unsigned char byte = Get_byte_from_queue(); // взяли байт из очереди

      switch (current_message){
         case 0: // начинается сообщение
         if (byte == SOF){ // если первое это признак начала
         data_message[current_message] = byte; // взяли его
         current_message++; // след шаг
      }
      else{
         answer_message[0] = UNDEFINED_COMMAND;//если не признак начала - ошибка
         answer_message[1] = byte;
         USART1_send_message(answer_message, 2);    // сообщили
      }
      break;
      case 1: // если уже послали признак начала сообщения
      data_message[current_message] = byte;// формируем сообщение
      current_message++; // след шаг
      length_of_get_message = byte; // взяли длинку, тк это следующрий элемент
      control_summ = 0;
      break;
      default: // идет сам текст сообщения
      data_message[current_message] = byte; // взяли элемент
      current_message++; // слудующий
      if (length_of_get_message > 0){ // на каждом шаге считаем контрольную сумму
      length_of_get_message--; // ум длину
      control_summ ^= byte; // собственно, контрольная сумма
   }else{ // когда дошли до конца сообщения
   if (control_summ == byte){ // если реальная сумма равно теоретической
   USART_work(data_message); // передать на USART
        }else{ // если контрольная сумма не совпадает
              data_message[0] = Control_summ_is_bad; // ошибка
       USART1_send_message(data_message, data_message[1]);
               }
            current_message = 0;
            }
            break;
      }     
   }
}
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

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

Вроде как терминал позволяет оправить произвольные символы, нужно тогда насильно отправить символ начала.
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Вопросы по С/С++ (СИ)

Сообщение Roman Venom »

такой вопрос: при использовании программатора Pickit2 в качестве отладчика (компилятор Microchip C18) доступны только три контрольные точки (breakpont). Можно как-то расширить их количество или это ограничение в железе?
Успех - императив!
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Вопросы по С/С++ (СИ)

Сообщение drac0Sha »

Аlex писал(а):А так-же, перейти на прерывания, для этого их и придумали, и убрать все константы с плавающей точкой.
Строка типа

Код: Выделить всё

Frequency_yellow =Frequency_yellow*0.6;
не должна работать. Frequency_yellow будет всегда равно нулю.


Работает )Во всяком случае в протеусе.

vitalik_1984 писал(а):Ну вот и разгадка, получается этого Первого ожидаемого символа и нет.Таким образом получается, что по приему любого байта , кроме начала пакета всегда будет одно и тоже происходить, пока он его не получит.И этот байт как раз обратно шлет.

Вроде как терминал позволяет оправить произвольные символы, нужно тогда насильно отправить символ начала.


Так получается мне нужно в виртуальном терминале набирать не просто код команды, например, 0х33 (код кнопки 3), а вначале признак сообщения и команду ?
Например, 7Е 0х33 ?
Подскажите, пожалуйста, как в виртуальном терминале самому набирать последовательность, а то я нажимаю кнопку и мне сразу выдает сообщение
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Вопросы по С/С++ (СИ)

Сообщение drac0Sha »

Опытным путем проверил, как Вы и говорили программа сваливается в функции Work_command из-за того, что первый байт не 0х7Е
Вот в этом месте :

Код: Выделить всё

void Work_command(){
   unsigned char answer_message[2]; // отправляемое сообщение об ошибке
   while (!queue_is_free){
      unsigned char byte = Get_byte_from_queue(); // взяли байт из очереди

      switch (current_message){
         case 0: // начинается сообщение
         if (byte == SOF){ // если первое это признак начала
         data_message[current_message] = byte; // взяли его
         current_message++; // след шаг
      }
      else{
         answer_message[0] = UNDEFINED_COMMAND;//если не признак начала - ошибка
         answer_message[1] = byte;
         USART1_send_message(answer_message, 2);    // сообщили
      }

Вот поэтому выдает одно и тоже сообщение.
Как самому набирать последовательности в виртуал терминал протеуса ? Подскажите, пожалуйста
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

Roman Venom писал(а):доступны только три контрольные точки (breakpont). Можно как-то расширить их количество или это ограничение в железе?

Если не изменяет память... это ограничение модуля отладки в самом МК... т.е. - никак...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

Как самому набирать последовательности в виртуал терминал протеуса ? Подскажите, пожалуйста

drac0Sha мои советы игнорирует, но может, кому-то будет интересно.
Как связать устройство или гипертерминал или putty через ком порт в протеусе - использовать элемент compim.
Для связки использовать драйвер виртуального ком порта - я пользуюсь VSPD.
Т.е гипертерминал натравливаем на 1 ком порт, а 2 устанавливаем в свойствах компима . Все.
Вложения
vspd.jpg
(71.95 КБ) 287 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Roman Venom писал(а):Можно как-то расширить их количество или это ограничение в железе?
Можно. Купить отладчик, который умеет ставить софтварные брекпоинты.
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Вопросы по С/С++ (СИ)

Сообщение drac0Sha »

urry, вот добавил на свою схему COMPIM.К каким портам его подключать к мк или к virtual terminal ?
Вложения
схемаРадиокот.PNG
(85.96 КБ) 305 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

drac0Sha, речь шла о подключении устройства или другой программы (гипертерминал, на пример) к протеусу. А куда подключать Вы его будете - Ваше дело.
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Вопросы по С/С++ (СИ)

Сообщение drac0Sha »

Так, вот я хочу подключить сторонний терминал к протеусу, как писал urry. Но ведь мне нужно взаимодействовать со своим мк, поэтому как мне кажется нужно же к чему подключить compim. Ведь так ? Или я чего то не понимаю?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

я хочу подключить сторонний терминал к протеусу
А в протеусе что хотите использовать, то-же терминал ?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

Так, по шагам - на моем ноуте нет ком портов, ставим драйвер, связываем пару, получаем 2 ком порта.
1 ком порт - на стороннюю программу, второй на ком пим. Картинки прилагаю.

ps Зачем нужен драйвер - сторонняя программа монопольно захватывает ком порт, подключить уже к компиму занятый нельзя, создавая пару с ним, мы устанавливаем нуль модемное соединение, данные с 1 порта пары идут на второй и наоборот.

Вылеченный от жадности драйвер здесь
http://depositfiles.com/files/hfgvrench
Вложения
3.jpg
(123.09 КБ) 331 скачивание
2.jpg
(66.88 КБ) 311 скачиваний
1.jpg
(74.51 КБ) 302 скачивания
Последний раз редактировалось urry Вс дек 09, 2012 19:03:00, всего редактировалось 1 раз.
Ответить

Вернуться в «Разные вопросы по МК»