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

vesago

Свой
  • Постов

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

  • Посещение

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


  1. Если вы используете вачдог, убедитесь в правильной инициализации. Пример на 2 секунды.

    void Watchdog_Init(void)
    {
      __watchdog_reset();
      WDTCSR = (1<<WDCE)|(1<<WDE);
      WDTCSR = (1<<WDP0)|(1<<WDP1)|(1<<WDP2)|(1<<WDE);
    }

     

    Если не используете вообще, значит что-то одно - или фуз постоянного включения вачдога включили или стек проседает.

  2. По поводу полевика. Привожу кусок схемы. В ней на проц питанеи подается через узел на полевике, дабы в случае потери питания на конденсаторе сохранить журнал. Если откинуть ключ на транзисторе, получится аналог диода с низким падением.

    P_CAD_EDA____POWER_.pdf

  3. Убедитесь, что не залочен. Для этого флешмагиком слейте прошивку. Если залочен, бутлодер при старте отваливает жтаг. Насчет дров - дело тонкое. Иногда последние криво пашут. Я ставлю новые, потом длл накатываю с 3_48b.

    3_48b.rar

  4. Нет к сожаленю флешка. Хорошая штука стандарт. Хочешь ставишь AM29lv320, хочешь другого производителя. Они по ногам и командам как из одной бочки розлиты. Почти. На счет битых не знаю. Все - таки амд качественная контора. Разве что ошибка в коде и молотит в один сектор, в результате 100000 циклов расходуется. Приедет ворая плата подробнее посмотрю.

  5. Нда. Я еще ставлю атмеловские флехи, там пока не было такого. К слову сказать во флехе журнал на 300000 событий и в связи с недавностью начала выпуска мало где он полноценно пользовался. В первой плате флеха встала так в ступор, что ни сброс питания ни перешивка не помогла. Застопорилась программа на определенном указателе записи во флешку. Подсоединился мтлинком и руками в программе проставил, что якобы Get_Memory_Status() в норме. Как программа перевалила через этот адрес, пошло нормально. Причем выход реди/бази показывал вроде что флеха в норме. Приедет вторая плата повнимательнее посмотрю. Пока переписал статус проверять по ноге.

  6. У меня в приборе к LPC2214 подключена упомянутая флешка, поэтому и решил сюда написать. Возникали ли у вас проблемы при ее использовании? У меня возникла следующая ситуация. Во флешке я держу базу и журнал. Журнал пишется по кольцу. При записи события проц проверяет сначала возможность записи - флеха в пределах размера записи должна быть стерта. Если это не так - предварительно стирается сектор. Так вот уже в парочке приборов приключилась неисправность - зависает проц по причине неготовности флешки, которую я проверяю после записи. Готовность я проверяю не по ноге реди/бази а по командному интерфейсу. Поделитесь мыслями - когда такая ситуация может происходить?

  7. Для перехода в исп режим я запускал батник с содержимым:

    AVRDragon.exe -d ATmega168 -W. Потом не снимая питания подключал аврисп и убирал фуз дебагваре. На драконе исп чего-то не запускался. Я не стал разбираться особо. По поводу дисконнекта донгла - дебагваре чувствителен к емкости по сбросу. Уберите все кондеры по ресету, подтяжку оставьте.

  8. а UIIR_NO_INT случайно не равно нулю?

     

    Единичке она равна. Да я и просто iid инициализировал нулем. Я бы давно соскочил с этого поганого карма на реалвью, да память внешняя прицеплена - не разобрался со скратчем.

     

     

    1. Зачем цикл по флагу прерывания, если и так обработчик прерывания + циклы в приеме/передаче?

     

    2. Вполне допускаю, что keil "не понимает" такой конструкции while(((iid = U1IIR) & UIIR_NO_INT)

     

    3. iid=0, такая вот "отключенная оптимизация". Была похожая фигня, решалась через указатели...

     

    1 - все так и должно быть, дабы из фифо все выбрать - борюсь с невекторными прерываниями.

    2 - а в других местах отлично понимает. Видно с оптимизацией его переклинило. Эх, так хорошо все начиналось. Я уже и волатайл ставил перед перменной. Как только цикл вайл - заходит только если напрямую указать вайл(1){}

  9. Коллеги, не могу понять - что я не так делаю? Пишу обработчик уарта для LPC2214.

     

    //********************************************************************************
    **********
    //Обработчик прерывания UART1
    //********************************************************************************
    **********
    void UART1_Handler(void) __irq
    {
        u8_t iid;
        u8_t tmphead;
        u8_t tmptail;
    
    
        //iid = U1IIR;
    
        iid = 0;
        while(((iid & 1) == 0))
            //while(((iid = U1IIR) & UIIR_NO_INT) == 0)
        {
            switch(iid & UIIR_ID_MASK)
            {
    
            case UIIR_RLS_INT:                  //Receive Line Status
                U1LSR;                          //read LSR to clear
                break;
    
                //Прием
            case UIIR_CTI_INT:                  //Character Timeout Indicator
            case UIIR_RDA_INT:                  //Receive Data Available
                do
                {
                    iid = U1RBR;
                    if((uart1.flags & (1<<UART1_FLAG_TX_IN_PROGRESS)) == 0)
                    {
                        tmphead = (uart1.rx_head + 1) & UART1_RX_BUFFER_MASK;
                        uart1.rx_head = tmphead;
                        if(tmphead == uart1.rx_tail)
                        {
                            //ERROR! Receive buffer overflow
                            uart1.flags |= (1<<UART1_FLAG_ERR);
                        }
                        uart1.rx_buf[tmphead] = iid;
                    }
                }while(U1LSR & U1LSR_RDR_BIT);
                break;
        
                //Прередача
            case UIIR_THRE_INT:
                while(U1LSR & U1LSR_THRE_BIT)
                {
                    tmptail = uart1.tx_tail;
                    if(uart1.tx_head != tmptail)
                    {
                        tmptail = (uart1.tx_tail + 1) &    UART1_TX_BUFFER_MASK;
                        uart1.tx_tail = tmptail;
                        U1THR = uart1.tx_buf[tmptail];
                    }
                        else
                        {
                            uart1.flags &= ~(1<<UART1_FLAG_TX_IN_PROGRESS);    
                            uart1.flags |= (1<<UART1_FLAG_TX_COMPLETE);
                        }
                }
                break;
    
            case UIIR_MS_INT:                   //MODEM Status
                U1MSR;                          //read MSR to clear
                break;
    
            default:                            //Unknown
                U1LSR;
                U1RBR;
                U1MSR;
                break;
            }
        }
    
        VICVectAddr = 0x00000000;
    }

     

    Начал проверять - не работает. Начал разбираться, смотрю - при передаче байта выражение while(((iid = U1IIR) & UIIR_NO_INT) == 0) всегда ложно. Я тогда тупо iid проинициализировал 0 - все равно. Посмотрел в дизасме (см. картинку) компилятор вместо while сразу поставил выход из цикла. Что это значит? Оптимизацию вообще отключил. Пишу в кейл/карм.

     

    Еще - в автомате тоже циклы вида while(...){} не работают - компилер сразу ставит выход из цикла. Зато do{}while(...); отлично работает. Эх видно особенность карма.

    post-1263-1194953737_thumb.jpg

  10. Имхо отладка посредством уарта и светодиода сродни черчению на кульмане. В общем-то и жтаг и гонка отладочной инфы всего лишь инструменты. Применение их - дело вкуса и привычки. Все равно и там и там нужно анализировать ситуацию. А 256 мегу (может 2561?) дракон не задебажит - мк2 нужен.

  11. Я при старте всегда проверяю корректность данных в разрезе диапазона. Когда имею дело со внешней RTC то при каждом чтении. С LPC имел проблему следующего характера - бывало криво тикало. Подлечилось путем начального обнуления всех регистров RTC.

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