Перейти к содержанию
    

Два вложенных бесконечных цикла вызывают сбой USART

ATTINY2313

8мГц

 while(1){
          if (setTimeFunctionEnabled){
              while(1){
                      ;                   
             };
          }
          if (PINB==0b11111011){  
              setTimeFunctionEnabled = 1;
              while(PINB==0b11111011){};
          }        
    };

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

Изменено пользователем Anub

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас в четвертой строке закрывающий ; лишниий что ли? Или что-то пропустили? Стиль оформления просто ужасный :( Что вообще тут должно выполнятся и как этот кусок связан с вложенными прерываниями? У оператора while(1) в третьей строке тело какое-то имеется или он в бесконечный цикл уходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас в четвертой строке закрывающий ; лишниий что ли? Или что-то пропустили? Стиль оформления просто ужасный :( Что вообще тут должно выполнятся и как этот кусок связан с вложенными прерываниями? У оператора while(1) в третьей строке тело какое-то имеется или он в бесконечный цикл уходит?

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

Стиль от программистов trolltech, опираюсь так сказать на авторитетов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

..... в программе из 1500 операторов. ......

на контроллере

ATTINY2313

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

 

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

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения. "... цикла" у меня почему-то трансформировалось в "... прерывания". :(

А как осуществляется выход из этого бесконечного цикла? Второй if внутри него располагается или вслед за ним? Видите какие вопросы возникают при таком оформлении :(

И причем тут вообще UART? В бы лучше сам алгоритм описали. По приведенному куску кода мало что понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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){};
          }        
    };
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Анатолий.

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

Изменено пользователем Anub

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот такая конструкция приводит к тому что USART начинает работать хз как.

Есть предложение посмотреть листинг в этом самом месте, а не хз что. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Она отправляет символ по USART.

 

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

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Анатолий.

Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию.

 

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

 

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

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Множественный вызов функции setTimeFunctionEnabled из-за дребезга контактов кнопки.

* раз не сказано обратное, делаю предположение что на PB.2 стоит кнопка с подтяжкой к Vcc.

Изменено пользователем VDG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...