Anub 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 (изменено) · Жалоба ATTINY2313 8мГц while(1){ if (setTimeFunctionEnabled){ while(1){ ; }; } if (PINB==0b11111011){ setTimeFunctionEnabled = 1; while(PINB==0b11111011){}; } }; Вот такая конструкция приводит к тому что USART начинает работать хз как. При отправке одного или двух символов все приходит нормально, при отправке трех приходит битая строка в которой частично или все другие символы, при попытке отправить четыре и более символов не приходит вообще ничего, либо приходит полный бред. При удалении цикла из строки три все приходит в норму. Я подозреваю что происходит нехватка производительности и контроллер не успевает в такт протоколу отправки. Какие мнения, что это еще может быть? Изменено 27 сентября, 2008 пользователем Anub Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба У вас в четвертой строке закрывающий ; лишниий что ли? Или что-то пропустили? Стиль оформления просто ужасный :( Что вообще тут должно выполнятся и как этот кусок связан с вложенными прерываниями? У оператора while(1) в третьей строке тело какое-то имеется или он в бесконечный цикл уходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anub 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба У вас в четвертой строке закрывающий ; лишниий что ли? Или что-то пропустили? Стиль оформления просто ужасный :( Что вообще тут должно выполнятся и как этот кусок связан с вложенными прерываниями? У оператора while(1) в третьей строке тело какое-то имеется или он в бесконечный цикл уходит? Конечно в цикле есть код, поместив который сюда у вас возникло бы раз в десять больше вопросов, в нем ничего необычного не происходит, присваивается несколько значений переменным, но корнями он уходит в глубину программы, я не думаю что у кого то здесь возникнет желание разбираться в программе из 1500 операторов. Плюс это не ничего не несет, что он там есть что его нет, результат один и тот же. А причем тут прерывания? Они вообще никакого отношения к этому циклу не имеют. Да он уходит в бесконечный цикл. Стиль от программистов trolltech, опираюсь так сказать на авторитетов... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба ..... в программе из 1500 операторов. ...... на контроллере ATTINY2313 во флеш которого помещаеться всего 1024 инструкции... Странно все это.... Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба Прошу прощения. "... цикла" у меня почему-то трансформировалось в "... прерывания". :( А как осуществляется выход из этого бесконечного цикла? Второй if внутри него располагается или вслед за ним? Видите какие вопросы возникают при таком оформлении :( И причем тут вообще UART? В бы лучше сам алгоритм описали. По приведенному куску кода мало что понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anub 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба 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 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба Что делает фукция 'puts'? Ее код если она ваша, или описание если нет. Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anub 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 (изменено) · Жалоба Что делает фукция 'puts'? Ее код если она ваша, или описание если нет. Анатолий. Это функция компилятора CodeVisionAVR, нареканий никогда не вызывала. Она отправляет символ по USART. Изменено 27 сентября, 2008 пользователем Anub Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба Вот такая конструкция приводит к тому что USART начинает работать хз как. Есть предложение посмотреть листинг в этом самом месте, а не хз что. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба Она отправляет символ по USART. Если функция работает с аппаратурой то она не является реентабельной (reentrant), вызавать такие функции одновременно из программы и прерывания нельзя. Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anub 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба Если функция работает с аппаратурой то она не является реентабельной (reentrant), вызавать такие функции одновременно из программы и прерывания нельзя. Анатолий. Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 (изменено) · Жалоба Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию. Но может произойти! Какой размер откомпилированного кода? Анатолий. Изменено 27 сентября, 2008 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anub 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 · Жалоба 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 0 27 сентября, 2008 Опубликовано 27 сентября, 2008 (изменено) · Жалоба Множественный вызов функции setTimeFunctionEnabled из-за дребезга контактов кнопки. * раз не сказано обратное, делаю предположение что на PB.2 стоит кнопка с подтяжкой к Vcc. Изменено 27 сентября, 2008 пользователем VDG Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться