Цитата(aaarrr @ Nov 24 2009, 20:02)

Вот с исправления этой проблемы и надо начинать. Все остальное пока забудьте.
regA, dummy
А зачем это делать вообще? Во-первых, зачем нужно использовать все три регистра (RA-RC)? Во-вторых, откуда следует необходимость их перезаписи?
Во-первых, я настраиваю таймер в соответствии с документацией. Таймер работает в таком режиме, что при равенстве RA бит сигнал устанавливается в 1, а при равенстве RC сбрасывается, при этом RB=RC.
Во-вторых, мне необходимо генерировать 32-битную последовательность импульсов с частотой 100кГц и с паузой между 32-битными словами 40мкс, то есть 4Т. Генерацию импульсов и паузу я осуществляю с помощью одного таймера, благодаря изменению регистров RA-RC в процессе его работы.
Ниже в комментариях к коду я объясняю работу:
Код
//обработчик прерываний таймера, который осуществляет подготовку каждого бита передаваемого слова
void timer0_irq_handler()
{
unsigned int regA;
int dummy;
int crc;
if(ii==1) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;} //останов таймера после передачи всего слова
MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;//настройка таймера на частоту передачи 100кГц
crc = crc^regs->PIOA_ODSR; //подсчет контрольной суммы
if(ii==2) //вычисление бита паритета
{ if(crc == 0) regA = 0x0;
else regA = 0x20000;
}
else
{
if(datA&0x80000000) regA = 0x20000;
else regA = 0x0;
}
regs->PIOA_ODSR = regA|front; //Вывод в порт следующего бита
datA = datA<<1; //Смещение буфера с передаваемым 32-битным словом
ii--; //счетчик переданных бит
dummy = MipsTimerBase->TC_SR;
}
//Функция подготавливающая 32-битные слова для передачи и запускающая таймер
void Write_TRA()
{
unsigned int regA;
//подготовка слова datA для последовательной передачи
//Вывод первого бита в порт, чтобы при возникновении прерывания он сразу был передан
if(datA&0x80000000) regA = 0x20000;
else regA = 0x0;
regs->PIOA_ODSR = regA|front;
datA = datA<<1; //сдвигаем слово
ii=32; //загружаем счетчик передаваемых слов
//запускаем таймер
MipsTimerBase->TC_CCR = AT91C_TC_CLKEN;
MipsTimerBase->TC_CCR = AT91C_TC_SWTRG;
while(ii!=0); //ожидаем, пока передадуться все 32 бита
//устанавливаем значения регистров таким образом, чтобы он начал работать с паузы 40мкс (чтобы выдержать необходимую по протоколу паузу), а затем был короткий импульс 5мкс, по которому ужебудет передаваться первый бит нового слова.
MipsTimerBase->TC_RA = 178; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 200;
}
поэтому я вынужден уже в обработчике прерывания устанавливать новые значения регистров, соответствующие 100кГц, чтобы оставшиеся 31 бит передавать с этой частотой.