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

 
 
> Проблема: спящий режим+ USART
Ruslan Konovalov
сообщение Oct 7 2008, 03:33
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-07-07
Пользователь №: 29 364



Всем добрый день.

Возникла проблема при использовании спящего режима(Idle mode) в Atmega8.
Вот код(не полный):
Код
void main(void)
{
  MCUCR |= (0<<SM2)|(0<<SM1)|(0<<SM0); //Idle mode
  init_Usart();
  __enable_interrupt();

for(;;)
{
   MCUCR |= (1<<SE); //Разрешение спящего режима
   asm("sleep");  //Сон
   Usart_read(); //Читаем строку
   Usart_Send_Str(UsartBuff); //Возвращаем принятое
}
}


Проблема заключается в том, что при использовании спящего режима Usart читает входящие данные нормально, за исключением первого байта.
Я так понимаю он пропускает его из-за того что процессор просыпается и начинает нормально работать в момент прихода 2-го байта.
Как решить эту проблему ?

А что если соеденить ножку RX и INT0 и будить процессор по этому прирыванию ?
Может кто нибудь уже с этим сталкивался ?
Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ruslan Konovalov
сообщение Oct 13 2008, 07:37
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-07-07
Пользователь №: 29 364



Ладно.
Было вот так:

Код
void main(void)
{
  MCUCR |= (0<<SM2)|(0<<SM1)|(0<<SM0); //Idle mode
  init_Usart();
  __enable_interrupt();
  UsartRxOn = 0;
  for(;;)
{
   MCUCR |= (1<<SE); //Разрешение спящего режима
   asm("sleep");  //Сон
   UsartRxOn = 1;//Разрешаем прием байтов
   Usart_read(); //Читаем строку
   UsartRxOn = 0; //Запрещаем прием байтов
   Usart_Send_Str(UsartBuff); //Возвращаем принятое
}
}



void Usart_read(void)
{  
  while(!received);  
}

//А вот само прерывание

#pragma vector = USART_RXC_vect
__interrupt void Recieve()
{
  unsigned char temp = 0;    

  temp = UDR;  
  if(UsartRxOn) //Если прием байтов разрешен
   {
  UsartBuff[UsartBuffPtr] = temp;
  UsartBuffPtr++;
  if(temp == 0x0D) received = 1; //0x0D - конец принимаемых данных.
  }
}

Вся проблема была в том, что процессор просыпается по прерыванию RXC, но на тот момент
UsartRxOn = 0. И по этому 1-й байт в UsartBuff не заносился.
Я просто поставил UsartRxOn = 1; перед функции засыпания и все исправилось.
Но по првильному вместо UsartRxOn лучше делать так:
Код
UCSRB |= (1 << RXCIE);//Разрешаем прерывание
UCSRB |= (1 << RXCIE);//Запрещаем прерывание

Вот такие кривые ручки. smile.gif
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 13 2008, 09:09
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



[/quote]
UCSRB |= (1 << RXCIE);//Разрешаем прерывание
UCSRB |= (1 << RXCIE);//Запрещаем прерывание
[/code]
Вот такие кривые ручки. smile.gif
[/quote]

А найдите два отличия в Ваших строчках smile.gif
Go to the top of the page
 
+Quote Post
Ruslan Konovalov
сообщение Oct 13 2008, 10:11
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-07-07
Пользователь №: 29 364



Цитата(VladimirYU @ Oct 13 2008, 12:09) *
UCSRB |= (1 << RXCIE);//Разрешаем прерывание
UCSRB |= (1 << RXCIE);//Запрещаем прерывание
[/code]
Вот такие кривые ручки. smile.gif
А найдите два отличия в Ваших строчках smile.gif


CTRL+C и CTRL+V рулит. smile.gif
Надо так:
UCSRB |= (1 << RXCIE); //Разрешаем прерывание
UCSRB &=~ (1 << RXCIE); //Запрещаем прерывание

А вот теперь думую все.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ruslan Konovalov   Проблема: спящий режим+ USART   Oct 7 2008, 03:33
- - Николай Иванович Приходько   Цитата(Ruslan Konovalov @ Oct 7 2008, 07...   Oct 7 2008, 06:36
|- - Ruslan Konovalov   Цитата(Николай Иванович Приходько @ Oct 7 200...   Oct 7 2008, 07:06
- - VladimirYU   Цитата(Ruslan Konovalov @ Oct 7 2008, 07...   Oct 7 2008, 08:07
|- - Ruslan Konovalov   Цитата(VladimirYU @ Oct 7 2008, 11:07) Мн...   Oct 7 2008, 23:53
|- - VladimirYU   Цитата(Ruslan Konovalov @ Oct 8 2008, 03...   Oct 8 2008, 05:01
|- - Ruslan Konovalov   Цитата(VladimirYU @ Oct 8 2008, 08:01) Де...   Oct 9 2008, 01:43
|- - VladimirYU   Цитата(Ruslan Konovalov @ Oct 9 2008, 05...   Oct 9 2008, 05:11
- - Ruslan Konovalov   Спасибо всем, кто откликнулся. Оказалось, что это ...   Oct 9 2008, 12:59
- - GDI   Все же поборите свой стыд и расскажите в чем была ...   Oct 9 2008, 13:11
|- - VladimirYU   Цитата(GDI @ Oct 9 2008, 17:11) Все же по...   Oct 10 2008, 05:19
- - defunct   Цитата(Ruslan Konovalov @ Oct 7 2008, 06...   Oct 13 2008, 17:43


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:30
Рейтинг@Mail.ru


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