Ответы пользователя по тегу Программирование
  • Нужна совместить работу фоторезистора и потенциометра. Кто поможет?

    @Emil2014
    А как узнать когда Вы хотите перейти на управление от потенциометра и наоборот?
    Сейчас у Вас: у кого абс. значение больше - тот и победил.
    Возможно, если нужно немного и ненадолго "поправлять" мозги автомату, то можно запоминать значение потенциометра и каждый опрос сравнивать с текущим. Если изменилось - то перешли на ручное управление. Через Н сек бездействия вернуть управление фоторезистору, а плавность перехода управления придумается.
    Ответ написан
    Комментировать
  • Инициализация регистра. Побочные эффекты?

    @Emil2014
    Оба варианта синтезируемы. Вариант 1:
    Прошили (вкл. питание) - регистр установился "100", изменили как-то, захотели вернуться к исходному состоянию - а нет сигнала установки! Будет до отключения питания хранить последнее измененное значение.
    Вариант 2:
    Прошили (вкл. питание) - регистр установился "100", изменили как-то, захотели вернуться к исходному состоянию - дернули rst!
    В синтезе даст разные конструкции - вариант 1, возможно будет быстрее и меньше по ресурсам, чем вариант 2.
    Кстати, в ISE Xilinx симуляторе вариант 2 даст неопределенное состояние по запуску до явной подачи rst = 1. В VHDL я совмещаю оба варианта в начале определяю регистр с исходным значением, а в процессе использую сигнал сброса(установки).
    Ответ написан
    3 комментария
  • Как реализовать систему навигации мобильного робота?

    @Emil2014
    Предлагаю схему со своей системой маяков. Вдоль двух перпендикулярных стен проложить провода- антенны. На каждый провод свой генератор со своейчастотой. Двумя амплитудными детекторами определять наведенное напряжение в приемной антенне. По мощности каждой амплитуды высчитывать удаление.
    Или решить обратную задачу. Камера сверху снимает всех роботов и передает ( ИК, радио, звук) пакет с координатами всех роботов.
    Ответ написан
  • Студент и Низкоуровневое программирование?

    @Emil2014
    Не перспективно. Железячники в разработческих фирмах расходный материал. Не имеет значения как много МК, ПЛИС знаешь, не имеет значения опыт. Из-за зарплаты (в среднем 30 -50 т.р. максимум) переток инженеров в другие отрасли громаден. Отношение соответствующее "Не нравиться- увольняйся!", при несоизмеримой ответственности (по сравнению с программистами). После разработки первого прибора разраб больше фирме не нужен, дальше торгаши и манагеры.

    Беги, парень беги!
    Ответ написан
  • Работа с АЦП cygnal c8051f320?

    @Emil2014
    Насколько я помню, у Silаbs есть визард -программа которая выдает заготовки на С. То есть хотите АЦП - ставьте галочку, надо в прерывании - ставьте галочку, хотите внешнюю опору- ставьте галочку и т.д. В конце программа выдаст заготовку Вашей программы.
    Ответ написан
    1 комментарий
  • C# com-порт получение информации, обработка старт-бита, стоп-бита?

    @Emil2014
    Я писал на С#,делал на BackgroungWorker. Грубо вырезанный кусок кода....
    private void TransferWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                // переменная для снятия из очереди
                Packet pkt;
                // массив для передачи
                byte[] wr_buf = new byte[6];
                // массив для приема
                byte[] rd_buf = new byte[6];
                // цикл до отмены работы или опустошения очереди запросов
                /// TODO теперь не выходит по завершению очереди - уменьшить на переключение контекста задач
                while ((_TransferWorker.CancellationPending == false))// && (_toTransfer.Count != 0))
                {
    
    
    case Mode_transfer.Read_ADC:// Чтение данных
                                Массив data = pkt.obj as Массив;
                                // читаем АЦП
                                wr_buf[0] = Convert.ToByte('A');
                                wr_buf[1] = (byte)0;
                                // Пишем отправляеммый пакет
                                _Serial.Write(wr_buf, 0, 2);
                                // ждем пока весь пакет уйдет или запросят отбой
                                while ((_TransferWorker.CancellationPending == false) && (_Serial.BytesToWrite != 0)) ;
                                // попытка поймать заголовок
                                try
                                {
                                    int dummy = 0, lenghtReadingPacket;
                                    bool end = false;
                                    int counter =0;
                                    while (end != true){
                                        dummy = _Serial.BytesToRead;
                                        if (dummy <= 3)
                                        {
                                            System.Threading.Thread.Sleep(1);
                                            if (counter++ > _Serial.ReadTimeout)
                                            {
                                                _dataLostArgs.ErrorPreambulaLen++;
                                                throw new TimeoutException("Preambula not full!");
                                            }
                                        }
                                        else end = true;
                                    }
                                    dummy = _Serial.Read(rd_buf, 0, 3);
                                    var dummy2 = dummy;
                                    if ((dummy != 3))
                                    {
                                        _dataLostArgs.ErrorPreambulaLen++;
                                        throw new TimeoutException("Preambula not full!");
                                    }
                                    if (rd_buf[(int)ADC_Packet.Name] != 'D'){
                                        _dataLostArgs.PreambulaLost ++;   
                                        throw new TimeoutException("Data preambula lost!");
                                    }
                                    // длина пакета в словах
                                    lenghtReadingPacket = rd_buf[(int)ADC_Packet.LenghtOfPacket];
                                    byte[] rd_buf_ADC = new byte[lenghtReadingPacket * 2 + 1];
                                    end = false;
                                    counter = 0;
                                    while (end != true){
                                        dummy = _Serial.BytesToRead;
                                        if (dummy < (lenghtReadingPacket * 2 + 1))
                                        {
                                            System.Threading.Thread.Sleep(1);
                                            if (counter++ > _Serial.ReadTimeout + 100)
                                            {
                                                var dummy3 = _Serial.Read(rd_buf_ADC, 0, lenghtReadingPacket * 2 + 1);
                                                _dataLostArgs.PoorPacket++;
                                                throw new TimeoutException();
                                            }
                                        }
                                        else end = true;
                                    }
    
                                    dummy = _Serial.Read(rd_buf_ADC, 0, lenghtReadingPacket * 2 + 1);
                                    if (dummy == (lenghtReadingPacket * 2 + 1))
                                        for (Int32 i = 0; i < lenghtReadingPacket * 2 ; i += 2)
                                        {
                                            int a = rd_buf_ADC[i];
                                            int b = rd_buf_ADC[i + 1];
                                            if (a != 0 || b != 0) data.Add(rd_buf_ADC[i] * 256 + rd_buf_ADC[i + 1]);
                                        }
                                    else {
                                        _dataLostArgs.PoorPacket++;
                                        throw new TimeoutException("Not all bytes received!");
                                    }
                                }
                                catch (TimeoutException)
                                {
                                    /// TODO ПОдумать при зависании считывания АЦП 
                                    OnADCDataLost(this, _dataLostArgs);
                                }
                                finally
                                {
                                    // Чистим за собой
                                    _Serial.DiscardInBuffer();
                                    _Serial.DiscardOutBuffer();
                                }
                                break;

    Работало на пределе из-за скорости 510416 Бод на RS485. Код довольно грязный... Но смысл был в том что, первое чтение возвращало не весь пакет. Надо ВСЕГДА проверять возвращаемые значения функций чтения. И что-то делать если пакет приходит не весь и кусками. И с задержкой, ставить timeout Exception что бы не провалится в Read навсегда.
    Ответ написан
    1 комментарий
  • Есть ли способ переслать сообщение из приложения на Android в ПК через USB?

    @Emil2014
    Android имеет в основе Linux. Возможно, если получить доступ к к системным usb/tty из приложения в Android то можно будет выводить. Лишь бы он определился на ПК как CDC - устройство.
    Ответ написан