Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как оптимизация влияет на работу портов ВВ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sirko
Чип - mega128.
Для связи с внешним миром на PORTB нацеплены несколько регистров-защелок.
С других пинов других портов идут стробы для каждой из защелок.
Инициализацию портов делаю единожды, при старте. Но, оказывается, регистр DDR где-то сбрасывается.
Перекопал весь код, закоментировал все лишнее.
После того, как разбил лоб в поисках проблемы, выявил, что ее можно победить двумя способами:
1. непосредственно перед использованием пина записывать "1" в его DDR;
2. отключить оптимизацию (чито случайно попробовал, никогда ни подумал бы).

Использую scmRTOS, копилятор GCC, make из операционки.

Инициализация вот такая:
Код
SMH_InputsOutputs::
SMH_InputsOutputs(OS::TMutex* pMutex) : mutex(pMutex){
    DRIVER(PIN_STNDBY,  OUT);
    DRIVER(PIN_TSTRD,  OUT);
    DRIVER(PIN_KBDRD,  OUT);
    DRIVER(PIN_RKRD,  OUT);
    DRIVER(PIN_RKWR,  OUT);
    DRIVER(PIN_DRS,  OUT);
    DRIVER(PIN_DEN,  OUT);
    OFF(PIN_STNDBY);
    ON(PIN_TSTRD);
    ON(PIN_KBDRD);
    ON(PIN_RKRD);
    ON(PIN_RKWR);
    ON(PIN_DRS);
    ON(PIN_DEN);
    outputs = 0;

}

проблема вот здесь:
Код
void SMH_InputsOutputs::
handler(void){

    mutex->Lock();

    // Опрос внешних входов DIN0 - DIN7
    SET_DATA_BUS_READ_MODE;
    OFF(PIN_RKRD);
//DRIVER(PIN_RKRD,    OUT);    //?????????? Не знаю, где сбрасывается DDRE5
    inputs0_7 = GET_DATA_BUS;    //    Сохранить результат с защелки
    ON(PIN_RKRD);


    // Установка внешних выходов
    SET_DATA_BUS_WRITE_MODE;        //    Перевести порт данных в режим "передача"
    SET_DATA_BUS = outputs;
    OFF(PIN_RKWR);
    ON(PIN_RKWR);
    SET_DATA_BUS_READ_MODE;



    mutex->Unlock();
}


Если раскоментировать строку
//DRIVER(PIN_RKRD, OUT); //??????????
проблема решается, а если ее же передвинуть выше на одну строку, то нифига не работает.
Ну или отключить оптимизацию, то эта строка вовсе не нужна.

Если есть мысли, поделитесь, пожалуйста.


Сергей Борщ
QUOTE (Sirko @ Dec 4 2010, 23:03) *
Если есть мысли, поделитесь, пожалуйста.
Чудес не бывает. Можно предположить, что какому-либо из процессов не хватает стека и он налезает на область РОН, портя их, в том числе и DDR. Можно предположить, что какому-то из процессов не хватает стека и он налезает на какой-то из указателей и портит его. А потом, обращаясь через этот указатель, вы портите DDR.
Sirko
Всем спасибо. Все разрулилось.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.