Цитата(Ljubitel @ May 4 2005, 04:22)
Цитата(dxp @ May 3 2005, 09:41)
В IAR'е есть специальные макросы для эмуляции периферийных устройств. Т.е. не для собственно симуляции того, как, например, таймерный регистр щелкает, а для эмуляции результатов работы периферийных устройств. По опыту скажу, что на деле это ценнее и лучше, нежели простая симуляция периферии, которая только и годится для того, чтобы проверить, а запустился ли таймер.
Вот где бы еще почитать об этом поподробнее,не скажете ?
Скудный хэлп все же в IARе.
Например я хочу периодически менять значение подаваемое на ножку
PIND_Bit2. Пишу макрос.
[...]
IAR вылетает с ошибкой.
Как правильно сделать ?
Это прерывание? Для эмуляции прерываний существует специальный макрос __orderInterrupt(), где задается периодичность и прочие условия, а также - очень важно - пользовательский макрос, который вызывается в этом
прерывании и выполняет нужную пользователю работу. Вот пример с упомянутым UART'ом:
Код
// Setting up a periodic interrupt simulation:
__var UART_Rx_period;
__var UDR;
__var fid;
__var err;
RxIn()
{
UDR = __readFile(fid);
__writeMemoryByte (UDR, 0x0c, "I/O-SPACE");
message "fid = ", fid, "\n";
message "UDR = ", UDR, "\n";
__printLastMacroError();
}
execUserSetup()
{
T_C0_period = 10000;
UART_Rx_period = 5000;
__cancelAllInterrupts();
__orderInterrupt("USART RXC", 1000, UART_Rx_period, 0, 0, 100); // set T_C0 overflow interrupt
__setBreak("0x0c", "I/O-SPACE", 1, 1,"", "TRUE", "I", "RxIn()");
err = __openFile(fid, "uart.dat", "r");
message "fid = ", fid, "\n";
message "err = ", err, "\n";
}
execUserExit()
{
__cancelAllInterrupts();
__closeFile(fid);
}
Здесь с периодом в 1000 тактов будет возникать прерывание "USART RXC", в нем у нас происходит обращение к регистру данных порта - и в этот самый момент, т.е. даже до считывания данных из UDR возникает immediate breakpoint ("I" - в спецификации брейка задает тип оного) - именно в при обращении к адресу UDR, но ДО считывания его значения. При этом вызывается наш макрос RxIn(), где мы и подсовываем значение из файла. Т.е. при считывании в программе из регистра данных UART'а каждый раз получаем следующее значение из файла.
Работоспособность именно этого примера не проверял (могут быть мелкие синтаксические огрехи), но почти такое прекрасно работает.
Для другого прерывания все делается по аналогии.
Все это неплохо описано в документации (не в хелпе, который очень краткий), в pdf'никах. Читайте, пробуйте и все получится.