Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Два вложенных бесконечных цикла вызывают сбой USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Anub
ATTINY2313
8мГц
Код
while(1){
          if (setTimeFunctionEnabled){
              while(1){
                      ;                  
             };
          }
          if (PINB==0b11111011){  
              setTimeFunctionEnabled = 1;
              while(PINB==0b11111011){};
          }        
    };

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

Конечно в цикле есть код, поместив который сюда у вас возникло бы раз в десять больше вопросов, в нем ничего необычного не происходит, присваивается несколько значений переменным, но корнями он уходит в глубину программы, я не думаю что у кого то здесь возникнет желание разбираться в программе из 1500 операторов. Плюс это не ничего не несет, что он там есть что его нет, результат один и тот же. А причем тут прерывания? Они вообще никакого отношения к этому циклу не имеют. Да он уходит в бесконечный цикл.
Стиль от программистов trolltech, опираюсь так сказать на авторитетов...
aesok
Цитата(Anub @ Sep 27 2008, 20:12) *
..... в программе из 1500 операторов. ......

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

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

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

Анатолий.
rezident
Прошу прощения. "... цикла" у меня почему-то трансформировалось в "... прерывания". sad.gif
А как осуществляется выход из этого бесконечного цикла? Второй if внутри него располагается или вслед за ним? Видите какие вопросы возникают при таком оформлении sad.gif
И причем тут вообще UART? В бы лучше сам алгоритм описали. По приведенному куску кода мало что понятно.
Anub
Код
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){};
          }        
    };
}
aesok
Что делает фукция 'puts'? Ее код если она ваша, или описание если нет.

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

Анатолий.

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

Есть предложение посмотреть листинг в этом самом месте, а не хз что. smile.gif
aesok
Цитата(Anub @ Sep 27 2008, 20:45) *
Она отправляет символ по USART.


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

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

Анатолий.

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


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

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

Анатолий.
Anub
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)
VDG
Множественный вызов функции setTimeFunctionEnabled из-за дребезга контактов кнопки.
* раз не сказано обратное, делаю предположение что на PB.2 стоит кнопка с подтяжкой к Vcc.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.