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

 
 
 
Reply to this topicStart new topic
> Два вложенных бесконечных цикла вызывают сбой USART
Anub
сообщение Sep 27 2008, 15:24
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



ATTINY2313
8мГц
Код
while(1){
          if (setTimeFunctionEnabled){
              while(1){
                      ;                  
             };
          }
          if (PINB==0b11111011){  
              setTimeFunctionEnabled = 1;
              while(PINB==0b11111011){};
          }        
    };

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

Сообщение отредактировал Anub - Sep 27 2008, 15:26
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 27 2008, 15:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



У вас в четвертой строке закрывающий ; лишниий что ли? Или что-то пропустили? Стиль оформления просто ужасный sad.gif Что вообще тут должно выполнятся и как этот кусок связан с вложенными прерываниями? У оператора while(1) в третьей строке тело какое-то имеется или он в бесконечный цикл уходит?
Go to the top of the page
 
+Quote Post
Anub
сообщение Sep 27 2008, 16:12
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Цитата(rezident @ Sep 27 2008, 19:47) *
У вас в четвертой строке закрывающий ; лишниий что ли? Или что-то пропустили? Стиль оформления просто ужасный sad.gif Что вообще тут должно выполнятся и как этот кусок связан с вложенными прерываниями? У оператора while(1) в третьей строке тело какое-то имеется или он в бесконечный цикл уходит?

Конечно в цикле есть код, поместив который сюда у вас возникло бы раз в десять больше вопросов, в нем ничего необычного не происходит, присваивается несколько значений переменным, но корнями он уходит в глубину программы, я не думаю что у кого то здесь возникнет желание разбираться в программе из 1500 операторов. Плюс это не ничего не несет, что он там есть что его нет, результат один и тот же. А причем тут прерывания? Они вообще никакого отношения к этому циклу не имеют. Да он уходит в бесконечный цикл.
Стиль от программистов trolltech, опираюсь так сказать на авторитетов...
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 27 2008, 16:18
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Anub @ Sep 27 2008, 20:12) *
..... в программе из 1500 операторов. ......

на контроллере
Цитата
ATTINY2313

во флеш которого помещаеться всего 1024 инструкции...

Странно все это....

Анатолий.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 27 2008, 16:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Прошу прощения. "... цикла" у меня почему-то трансформировалось в "... прерывания". sad.gif
А как осуществляется выход из этого бесконечного цикла? Второй if внутри него располагается или вслед за ним? Видите какие вопросы возникают при таком оформлении sad.gif
И причем тут вообще UART? В бы лучше сам алгоритм описали. По приведенному куску кода мало что понятно.
Go to the top of the page
 
+Quote Post
Anub
сообщение Sep 27 2008, 16:28
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Код
USHORT H = 23;
USHORT M = 31;
USHORT S = 40;
USHORT fi, se, th, fo;
bit FuncEnabled = 0;
char SetCountCommand[7] = {':','1','3','4','6','/'};
bit setTimeFunctionEnabled = 0;

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{  
    TCNT1=57723;//57723
    if (S!=59){
        S++;
    } else {
        S=0;
        M++;
    }
    if (M==60){
        M=0;
        H++;
    }
    if (H==24){
        H=0;
    }
    //PAINT(M/10, M%10, S/10, S%10);
    
    if (FuncEnabled!=1){
        SetCountCommand[1]=M/10+48;
        SetCountCommand[2]=M%10+48;
        SetCountCommand[3]=S/10+48;
        SetCountCommand[4]=S%10+48;
        
        puts(SetCountCommand);          
    } else {
       ;
    }
}
void scanCP(void)
{
    USHORT pos = 1;
    while(1){
          if (setTimeFunctionEnabled){
              while(1){                                                       //Программа работает идеально до появления этого цикла
                       if (PINB==0b11110111){   //JoyUp     //Наличие с содержимое кода на ситуацию никак не влияют
                            if (pos==1){
                                fi++;
                                SetCountCommand[1]=fi;
                                puts(SetCountCommand);
                            }
                       }
             };
          }
          if (PINB==0b11111011){  
              FuncEnabled = 1;
              setTimeFunctionEnabled = 1;
              while(PINB==0b11111011){};
          }        
    };
}
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 27 2008, 16:40
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Что делает фукция 'puts'? Ее код если она ваша, или описание если нет.

Анатолий.
Go to the top of the page
 
+Quote Post
Anub
сообщение Sep 27 2008, 16:45
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Цитата(aesok @ Sep 27 2008, 20:40) *
Что делает фукция 'puts'? Ее код если она ваша, или описание если нет.

Анатолий.

Это функция компилятора CodeVisionAVR, нареканий никогда не вызывала. Она отправляет символ по USART.

Сообщение отредактировал Anub - Sep 27 2008, 16:47
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 27 2008, 16:48
Сообщение #9


;
******

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



Цитата(Anub @ Sep 27 2008, 19:24) *
Вот такая конструкция приводит к тому что USART начинает работать хз как.

Есть предложение посмотреть листинг в этом самом месте, а не хз что. smile.gif
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 27 2008, 16:54
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Anub @ Sep 27 2008, 20:45) *
Она отправляет символ по USART.


Если функция работает с аппаратурой то она не является реентабельной (reentrant), вызавать такие функции одновременно из программы и прерывания нельзя.

Анатолий.
Go to the top of the page
 
+Quote Post
Anub
сообщение Sep 27 2008, 17:03
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Цитата(aesok @ Sep 27 2008, 20:54) *
Если функция работает с аппаратурой то она не является реентабельной (reentrant), вызавать такие функции одновременно из программы и прерывания нельзя.

Анатолий.

Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию.
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 27 2008, 17:05
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Anub @ Sep 27 2008, 21:03) *
Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию.


Но может произойти!

Какой размер откомпилированного кода?

Анатолий.

Сообщение отредактировал aesok - Sep 27 2008, 17:06
Go to the top of the page
 
+Quote Post
Anub
сообщение Sep 27 2008, 17:22
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



HEX: 2600 байт
Со всеми обвесами 2609 операторов

Chip: ATtiny2313
Memory model: Tiny
Optimize for: Size
(s)printf features: int, width
(s)scanf features: int, width
Promote char to int: No
char is unsigned: Yes
8 bit enums: Yes
Enhanced core instructions: On
Automatic register allocation: On

2609 line(s) compiled
No errors
7 warning(s)

Bit variables area: 2h to 2h
Bit variables size: 1 byte(s)

Data Stack area: 60h to 7Fh
Data Stack size: 32 byte(s)
Estimated Data Stack usage: 16 byte(s)

Global variables area: 80h to CAh
Global variables size: 75 byte(s)

Hardware Stack area: CBh to DFh
Hardware Stack size: 21 byte(s)

Heap size: 0 byte(s)

EEPROM usage: 0 byte(s) (0,0% of EEPROM)
Program size: 466 words (45,5% of FLASH)
Go to the top of the page
 
+Quote Post
VDG
сообщение Sep 27 2008, 18:43
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193



Множественный вызов функции setTimeFunctionEnabled из-за дребезга контактов кнопки.
* раз не сказано обратное, делаю предположение что на PB.2 стоит кнопка с подтяжкой к Vcc.

Сообщение отредактировал VDG - Sep 27 2008, 18:44


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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