Перейти к содержанию
    

vesago

Свой
  • Постов

    747
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные vesago


  1. Я в слике только пишу. Компилирую и отлаживаю в родной иде. Мне так показалось удобно. В большинстве случаев отладка в соответсвующей иде вне конкуренции. А вот писанина в слике в свою очередь вне конкуренции. Особенно, если проект не маленький.

  2. Вот вам коммутатор RS-232. Но в вашем случае, как правильно сказано выше, вполне можно обойтись LVCT125. Сразу два зайца убиваете - коммутируете + согласуете уровни 5В меги с GSM и GPS. Можно конечно еще прикрутить микросхему уарт, но имхо не бюджетно.

    P_CAD_EDA____Sheet1_.pdf

    commutator_v3.rar

  3. Действительно ли в конце происходит прерывание и из приемника принимается 0? Может софтовый указатель сбился. Имхо 0 в конце похож на результат пустого прерывания - допустим после последнего не почистился буфер. Еще как вариант - если у вас драйвер 485 постоянно на приеме, может быть результатом приема передаваемых данных. Мне не удалось при передаче избежать приема эха. Т.к. к прибору подключается или 485 или 232 пришлось решить радикально - при передаче переключал пинсел приемника на гпио.

  4. К LPC2214 подключена ADM485 у которой приемник постоянно включен. Т.е. при передаче я отключаю прерывание приемника, включаю разрешение пердачи ADM485 и передаю данные. Далее контролирую опустошение передатчика UART и сдвигового регистра и при фиксации сего, чищу фифо и активирую прерывание приемника. Проблема в том, что сразу после передчи и разрешения прерывания приемника, происходит прерывание и принимается переданный байт, не смотря на то, что я почистил фифо. Получается, фифо не всегда чистится или при каких-то условиях прерывание остается взведенным. Если под отладкой выполнять по шагам, такого не происходит. Помогите разобраться с данной ситуацией. Параметры уарта - скорость 38400, глубина фифо - 1 байт, остальное стандартно.

     

    Вот такой у меня иср уарта:

    //********************************************************************************
    **********
    //Обработчик прерывания UART0
    //******************************************************************** **********************
    void UART0_Handler(void) __irq
    {
        u8_t data;
        u8_t tmphead;
        u8_t tmptail;
    
        switch((data = U0IIR) & INTERRUPT_SOURCE_MASK)
        {
            //Прием
        case SOURCE_RX:
            data = U0RBR;
            if((uart0.flags & (1<<UART0_FLAG_TX_IN_PROGRESS)) == 0)
            {
                tmphead = (uart0.rx_head + 1) & UART0_RX_BUFFER_MASK;
                uart0.rx_head = tmphead;
                if(tmphead == uart0.rx_tail)
                {
                    //ERROR! Receive buffer overflow
                    uart0.flags |= (1<<UART0_FLAG_ERR);
                }
                uart0.rx_buf[tmphead] = data;
            }
    
            if(((data == 0x03) || (data == 0x06) || (data == 0x15)) && (avr.counter == 0))
            {
                data = 0x03;//Это для отлавливания ошибочной ситуации
            }
            break;
    
            //Прередача
        case SOURCE_THRE:
            tmptail = uart0.tx_tail;
            if(uart0.tx_head != tmptail)
            {
                tmptail = (uart0.tx_tail + 1) &    UART0_TX_BUFFER_MASK;
                uart0.tx_tail = tmptail;
    
                U0THR = uart0.tx_buf[tmptail];
            }
                else
                {
                    uart0.flags &= ~(1<<UART0_FLAG_TX_IN_PROGRESS);
                    uart0.flags |= (1<<UART0_FLAG_TX_COMPLETE);
                }
                break;
    
                //Таймаут приема
        case SOURCE_RX_TIMEOUT:
            data = U0LSR;
            data = U0RBR;
            break;
    
            //Ошибка
        case SOURCE_ERROR:
            data = U0LSR;
            data = U0RBR;
            break;
    
            //Хрень какая-то
        default:
            data = U0LSR;
            data = U0RBR;
        }
    
        VICVectAddr = 0;
    }

     

    Функции разрешения/запрещения передачи:

    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    // Запрет приема
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    void UART0_DisableReciveIRQ(void)
    {
        U0IER &= ~(1<<U0IER_RBR_Interrupt_Enable_BIT);
    }
    
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    // Разрешение приема
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    void UART0_EnableReciveIRQ(void)
    {
        u8_t temp;
        
        temp = U0LSR;
    
        U0FCR = (1<<U0FCR_FIFO_Enable_BIT) | (1<<U0FCR_Tx_FIFO_Reset_BIT) | (1<<U0FCR_Rx_FIFO_Reset_BIT);
    
        U0IER |= (1<<U0IER_RBR_Interrupt_Enable_BIT);
    }
    
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    // Старт передачи
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    void UART0_Transmit_On(void)
    {
        UART0_DisableReciveIRQ();
        IO0SET |= (1<<GL_BUS_DIR);        //Включим передатчик RS485
    }
    
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    // Стоп передачи
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    void UART0_Transmit_Off(void)
    {
        IO0CLR |= (1<<GL_BUS_DIR);        //Отключим передатчик RS485
        UART0_EnableReciveIRQ();        //Разрешим прием
    }

     

    Проверка опустошения сдвигового регистра:

    u8_t UART0_Check_Shift_Reg_Emty(void)
    {
        if((uart0.flags & (1<<UART0_FLAG_TX_COMPLETE)) != 0)
        {
            if((U0LSR & (1<<U0LSR_TEMT_BIT) != 0) && (U0LSR & (1<<U0LSR_THRE_BIT) != 0))
            {
                uart0.flags &= ~(1<<UART0_FLAG_TX_COMPLETE);
                return 1;
            }
        }
        return 0;
    }

     

    Применеие в майне:

        system.state = SYSTEM_STATE_SCPU_BOOT;
    
       while(1)
       {
            UART0_Transmit_On();
            UART0_Transmit(0x15);
    
            system.start_timer = TIME;
            do
            {
                if(UART0_Check_Shift_Reg_Emty() != 0)
                {
                    UART0_Buf_Clr();
                    UART0_Transmit_Off();
                }
            }while(system.start_timer != 0);
    
        }

  5. А как с этим делом в других средах обстоит?

     

    Конкретно по вашему случаю не скажу. В кейле я полностью отладил в симуляторе обмен с хостом с загрузкой данных в адреса соответсвующие внешнюю память и плюс обмен i2c с внешней памятью. Не считая таймеров и другой мелочи. В нем можно посмотреть даже что-то вроде осциллограммы на ногах. В общем имхо самый мощный симулятор по нынешним временам.

  6. В UxTCTL вродеж есть TXEPT. По крайней мере я его пользовал. Посмотрите мои дровишки - там есть функция USART0_Shift_Reg_Control() я ее когда нужно полю для переключения. Недостаток моей реализации - отсутсвие задержки >=1млс после опустошения сдвигового регистра - забил тогда.

    usart0_2008_08_07_140125.rar

  7. Ну вот для затравки известный проект. Ну и по указанной выше ссылке была пара проектов близких к сабжу. Можно еще глянуть микрочиповский стэк. В оригинале он заточен под ихний чип, но имхо не сложно прикрутить в качестве канального уровня ппп ну и добавить инициализацию тела как модема.

    AT_Modem__PPP__UDP__ICMP___TCP.zip

  8. Для реализации сабжа нужно организовать поддержку PPP протокола, IP и TCP. На фтп есть книга TCP-IP Lean--Web Servers for Embedded Systems (2nd Ed.) вместе с исходниками. Там отлично реализован ппп. Подрихтуйте его под свои нужды. IP и TCP можно самому написать, можно прикрутить готовый типа микроайпи. Но в любом случае придется почитать соответсвующие рфц. Пример можно посмотреть http://aly.ogmis.lt/index.html + в аттаче почитать по ппп.

    1.doc

  9. В общем - создаете файл *.ini, сохраняете его, допустем в папке с проектом. Открываете дебаг/функшн эдитор, подгружаете файл. В файле пишете скрипт и компилируете его. Если ошибок нету, скрипт можно запустить на выполнение из командной строки дебагера. В моем случае, я вводил в командной строке I2CMemory(). После этого симулятор начинал эмулировать внешнюю и2с память, с отображением ее внутреннего пространства на указанных адресах и отображением обмена в соответсвующем окне. У кейла ядерный симулятор. Я отладил в нем даже обмен с хостовой программой на PC.

  10. Вот из ихнего талмуда рисунок. Получается, когда работаем через GPRS обмен ведем через GPS модуль. Если нужно просто с GSM модемом - смс там отослать или еще чего, тогда через другой уарт модема.

    post-1263-1214640740_thumb.jpg

×
×
  • Создать...