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

 
 
> Проблема: спящий режим+ 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
сообщение Oct 9 2008, 01:43
Сообщение #5


Участник
*

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



Цитата(VladimirYU @ Oct 8 2008, 08:01) *
Действительно, я примерно делаю также. Попробуйте убрать спячку (заменить, например, на while с условием выхода по приему первого байта пакета ), и убедиться, что потеря 1-го байта связана именно с ней.

Уже пробовал.
Без спячки все прекрасно работает.
И еще, как я понял процессор просыпается от прерывания по RXC только в режиме Idle.
Пробовал другие режимы. В них процессор спит. 05.gif
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Oct 9 2008, 05:11
Сообщение #6


Местный
***

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



Цитата(Ruslan Konovalov @ Oct 9 2008, 05:43) *
Уже пробовал.
Без спячки все прекрасно работает.
И еще, как я понял процессор просыпается от прерывания по RXC только в режиме Idle.
Пробовал другие режимы. В них процессор спит. 05.gif

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.

Доки от Атмела, как русский язык по Черономырдину. Ни слова про RXC, является ли оно тем, что выделено, или речь только об интах? Ипользовал сам этот режим, но не помню подробностей, вроде делал в принципе все как у Вас, попробую паоднять старый проект, правда он был на меге128. Но это не принципиально. Может быть задействовал еще одну ногу.
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   Спасибо всем, кто откликнулся. Оказалось, что это ...   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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:56
Рейтинг@Mail.ru


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