Для связи с внешним миром на 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;
}
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();
}
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); //??????????
проблема решается, а если ее же передвинуть выше на одну строку, то нифига не работает.
Ну или отключить оптимизацию, то эта строка вовсе не нужна.
Если есть мысли, поделитесь, пожалуйста.