реклама на сайте
подробности

 
 
> Вопрос по SPI
Halfback
сообщение Jan 5 2009, 19:46
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Только начинаю нормально осваивать AVR и столкнулся со следующей проблемой.
Задача такая - во время посылки пакета из 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);
      };
};


при этом коде всё нормально работает. Но когда в визарде проекта 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)); ???
Заранее признателен!

Сообщение отредактировал Halfback - Jan 5 2009, 20:16
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 06:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016