[an error occurred while processing this directive]
Cygnal 021. Внешняя память.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Егор 11 декабря 2002 г. 20:58

Не могу понять почему не могу корректно писать/читать внешнюю память.
Если пишу/читаю с внешней памятью в цикле и нет никаких запросов на прерывание, то все хорошо. Скорость обращения к памяти на уровне максимума. Аппаратной проблемы не должно быть. Если я пытаюсь записать/прочитать что-то в подпрограмме обработки прерывания ADC_end, то хотя бы один раз или больше на каждые 100000 происходит сбой.

Приведу куски кода. Они работают в разных тестовых программах

//Global variables
unsigned char TypeMemory; //store types: internal or external memory
unsigned long xdata *pRAM_CS; // RAM CS access pointer
unsigned long BufferRAM;
unsigned long Counter_ADC0;

...
//Ниже приведен код, который работает без сбоев
//Наблюдаю за переменной BufferRAM в точке приостанова программы.
//Ее значение кратно 100000.

TypeMemory = EMI0CF; //запоминаю, к какой памяти было
//обращение до прерывания
EMI0CF = 0x0F; //внешняя память

BufferRAM = 0;
Counter_ADC0 =0;
pRAM_CS = 3030;
*pRAM_CS = 0;

while (Counter_ADC0 < 1000000)
{
BufferRAM = *pRAM_CS;
BufferRAM = BufferRAM + 1;
*pRAM_CS = BufferRAM;
Counter_ADC0++;
if (Counter_ADC0 == 100000)
{
Counter_ADC0 = 0; // точка приостанова программы
}
}

//Этот код выполняется в теле подпрограммы обработки прерывания "преобразование АЦП закончено". По окончанию преобразования я записываю значение BufferRAM во внешнюю память один раз, выхожу из подпрограммы и по следующему "АЦП завершено" выполняюю тоже самое. Предварительно ячейку внешней памяти 3030 обнуляю. Чисто проходит только первые 100000.

void ADC0_END_ISR (void) interrupt 15
{
TypeMemory = EMI0CF; //запоминаю, к какой памяти было
//обращение до прерывания
EMI0CF = 0x0F; //внешняя память
ADC0CN &= ~(0x20); // clear flag
Counter_ADC0++;
pRAM_CS = 3030;
BufferRAM = *pRAM_CS;
BufferRAM = BufferRAM + 1;
*pRAM_CS = BufferRAM;
if (Counter_ADC0 == 100000)
{
Counter_ADC0 = 0; //точка приостанова программы
}
EMI0CF = TypeMemory;
}

В принципе в точках приостанова 2-х кусков программ значение BufferRAM должно быть кратно 100000. Во втором кусочке программы это не так.

Если кто-то сможет, подскажите в чем дело.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru