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

 
 
> как бы реализовать условие?
naskar
сообщение May 17 2011, 10:45
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 14-01-11
Пользователь №: 62 219



Здравствуйте. Программа по запросу с Мастера должна передать по SPI данные другому МК, но разрешенное временя на ожидание передачи ограничено. О говности Подчиненного к передаче сигнализирует соотв.уровень на линии порта С.
1. Запускается 16 разр. счетчик
2. Выставляем сигнал готовности
3. Ожидается запрос на передачу
4. Если запрос не произошел в течение периода пока счетчик не насчитал допустим 100 -> Конец подпрограммы.
5. Если пришел запрос в разрешенном интервале -> передача 3 байта данных -> Конец подпрограммы.
В общем вопрос такой - как организовать такой условный переход? МК mega48.
привожу отрывок программы:

void SPI_Transmit(unsigned long data)
{
SPDR=(unsigned char)(data>>16);
while(!(SPSR&(1<<SPIF)));
SPDR=(unsigned char)(data>>8);
while(!(SPSR&(1<<SPIF)));
SPDR=(unsigned char)data;
while(!(SPSR&(1<<SPIF)));
};

...
Запуск таймера;
...
ClearBit(PORTC,PORTC1); // transmit ready
SPI_Transmit(narabotka);
SetBit(PORTC,PORTC1); // busy
return;
};
...

Прошу прощения, написал не совсем в тему, прошу переместить в AVR.

Сообщение отредактировал naskar - May 17 2011, 10:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smalcom
сообщение May 18 2011, 14:25
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



эммм, есть конструкция с оператором if
Go to the top of the page
 
+Quote Post
naskar
сообщение May 18 2011, 16:27
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 14-01-11
Пользователь №: 62 219



Цитата(smalcom @ May 18 2011, 18:25) *
эммм, есть конструкция с оператором if

И что? поставлю я if, выполнится это условие, начнет выполнятся п\п, вопрется в первый же while и будет ждать запрос на передачу. Счетчик пройдет допустимое значение, а цикл так и будет продолжать ждать, а нужно чтобы он в этот момент завершил выполнение подпрограммы и вернулся в главный цикл...

Поэтому я подумал, что если сделать так, чтобы в тот момент когда счетчик досчитал до допустимого значения, а запроса на передачу так и не произошло - происходит прерывание, а в теле обработчика прерывания записать в стек адрес возврата в гл. программу, и указатель после return минуя цикл передачи перейдет сразу в тело главного цикла main, так cработает?
например, очень упрощенно:


//-----------------------------SPI_transmit_func-------------------------------------//

void SPI_Transmit(unsigned long data)
{
SPDR=(unsigned char)(data>>16);
while(!(SPSR&(1<<SPIF))) // Ждем запроса на передачу
ClearBit(TIMSK1,OCIE1B); //Отключаем прерывание по В
SPDR=(unsigned char)(data>>8);
while(!(SPSR&(1<<SPIF)))
SPDR=(unsigned char)data;
return;
};

//---------------------------Timer_1_interrupt_B---------------------------------------//

#pragma vector = TIMER1_COMPB_vect // Счетчик досчитал до 100, передача не произошла, нам нужно вернуться обратно в main
__interrupt void timer_compb_isr(void)
{
SetBit(PORTC,PORTC1); // busy
ClearBit(TIMSK1,OCIE1B); // Отключаем прерывание по В
SP = adr; // Заполняем обратно в стек адрес возврата - так можно делать? вернемся ли мы в main?
return;
};

//---------------------------Timer_1_interrupt_A--------------------------------------//

#pragma vector = TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void) //таймер 1 переполнился
{
adr = SP; // Адрес возврата в main - так можно делать? заполнится ли в adr реальный адрес возврата???
.
.
SetBit(TIMSK1,OCIE1B); // Включаем прерывание по В
ClearBit(PORTC,PORTC1); // готов к передаче
SPI_Transmit(narabotka); // идем на пп передачи см.выше
SetBit(PORTC,PORTC1); // занят
return;
};

//------------------------------main-----------------------------------//

int main(void)
{
.
OCR1A = 32000;
OCR1B = 100;
SetBit(TCCR1B,CS11); // 0b00001010 T/C1 run in CTC mode f = Fclk/8.
.
.
while(1)
{
//ждем прерывание А, прерывание В пока отключено
};
}

Сообщение отредактировал naskar - May 18 2011, 16:30
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:09
Рейтинг@Mail.ru


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