Задача такая - во время посылки пакета из 8 бит формировать на каком-либо пине импульс (нулевой или +5В - не столь важно) на время формирования этого байта. Делаю а CAVR. Микрик - Мега88
Вот что получилось:
Код
void main(void)
{
...
SPCR=0x52;
SPSR=0x00;
// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
PORTC.0 &= 0;
PORTD = SPSR;
SPDR = 0x15;
while(!((SPSR & 0x80) >> 7)); // Следим за SPIF
PORTC.0 |= 1;
delay_us(200);
};
};
{
...
SPCR=0x52;
SPSR=0x00;
// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
PORTC.0 &= 0;
PORTD = SPSR;
SPDR = 0x15;
while(!((SPSR & 0x80) >> 7)); // Следим за SPIF
PORTC.0 |= 1;
delay_us(200);
};
};
при этом коде всё нормально работает. Но когда в визарде проекта CAVR в опциях МЦУ SPI ставлю галочку Enable Interrupt то регистр SPCR приобретает значение 0xD2, т.е. "1" записалась в разряд SPE. При таком раскладе появляется ф-ция обработки прерывания interrupt [SPI_STC] void spi_isr(void).
Но в итоге код не работает. Ес-но я открыл литературу и там написано про SPE - что она активизирует SPI, а SPIF мол является флагом прерываний от SPI и флаг устанавливатеся когда произошла передача пакета. Но как показывает отладка если в SPCR записать 0xD2 то из цикла
Код
while(!((SPSR & 0x80) >> 7)); // Следим за SPIF
программа никогда не выходит.
Можно ли мне разжевать почему так происходит? И как сделать так чтобы программа выходила из while(!((SPSR & 0x80) >> 7)); ???
Заранее признателен!