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

 
 
> Проблема: спящий режим+ 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
Ответов
VladimirYU
сообщение Oct 7 2008, 08:07
Сообщение #2


Местный
***

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



Цитата(Ruslan Konovalov @ Oct 7 2008, 07:33) *
Всем добрый день.

Возникла проблема при использовании спящего режима(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 читает входящие данные нормально, за исключением первого байта.
.


Idle mode enables the MCU to wake up from external triggered interrupts as well as
internal ones like the Timer Overflow and USART Transmit Complete interrupts. If
wake-up from the Analog Comparator interrupt is not required, the Analog Comparator
can be powered down by setting the ACD bit in the Analog Comparator Control and Status
Register – ACSR. This will reduce power consumption in Idle mode. If the ADC is
enabled, a conversion starts automatically when this mode is entered.

Мне кажется функцию приема нужно организовать по прерыванию от RXC.



Цитата(VladimirYU @ Oct 7 2008, 12:04) *
Idle mode enables the MCU to wake up from external triggered interrupts as well as
internal ones like the Timer Overflow and USART Transmit Complete interrupts
. If
wake-up from the Analog Comparator interrupt is not required, the Analog Comparator
can be powered down by setting the ACD bit in the Analog Comparator Control and Status
Register – ACSR. This will reduce power consumption in Idle mode. If the ADC is
enabled, a conversion starts automatically when this mode is entered.

Мне кажется функцию приема нужно организовать по прерыванию от RXC.


Немного не так выделил.
Go to the top of the page
 
+Quote Post
Ruslan Konovalov
сообщение Oct 7 2008, 23:53
Сообщение #3


Участник
*

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



Цитата(VladimirYU @ Oct 7 2008, 11:07) *
Мне кажется функцию приема нужно организовать по прерыванию от RXC.

Все верно.
Функция Usart_read(); выглядит примерно так:

Код
void Usart_read(void)
{
  while(!received);  
}

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

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

  temp = UDR;  
  UsartBuff[UsartBuffPtr] = temp;
  UsartBuffPtr++;
  if(temp == 0x0D) received = 1; //0x0D - конец принимаемых данных.
}


Сообщение отредактировал Ruslan Konovalov - Oct 7 2008, 23:55
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 8 2008, 05:01
Сообщение #4


Местный
***

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



Цитата(Ruslan Konovalov @ Oct 8 2008, 03:53) *
Все верно.
Функция Usart_read(); выглядит примерно так:

Код
void Usart_read(void)
{
  while(!received);  
}

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

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

  temp = UDR;  
  UsartBuff[UsartBuffPtr] = temp;
  UsartBuffPtr++;
  if(temp == 0x0D) received = 1; //0x0D - конец принимаемых данных.
}


Действительно, я примерно делаю также. Попробуйте убрать спячку (заменить, например, на while с условием выхода по приему первого байта пакета ), и убедиться, что потеря 1-го байта связана именно с ней.
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
|- - 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
- - Ruslan Konovalov   Ладно. Было вот так: Кодvoid main(void) {...   Oct 13 2008, 07:37
|- - VladimirYU   [/quote] UCSRB |= (1 << RXCIE);//Разрешаем п...   Oct 13 2008, 09:09
|- - Ruslan Konovalov   Цитата(VladimirYU @ Oct 13 2008, 12:09) U...   Oct 13 2008, 10:11
- - 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 - 10:23
Рейтинг@Mail.ru


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