|
|
  |
Два вложенных бесконечных цикла вызывают сбой USART |
|
|
|
Sep 27 2008, 15:24
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Sep 27 2008, 16:12
|
Участник

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

|
Цитата(rezident @ Sep 27 2008, 19:47)  У вас в четвертой строке закрывающий ; лишниий что ли? Или что-то пропустили? Стиль оформления просто ужасный  Что вообще тут должно выполнятся и как этот кусок связан с вложенными прерываниями? У оператора while(1) в третьей строке тело какое-то имеется или он в бесконечный цикл уходит? Конечно в цикле есть код, поместив который сюда у вас возникло бы раз в десять больше вопросов, в нем ничего необычного не происходит, присваивается несколько значений переменным, но корнями он уходит в глубину программы, я не думаю что у кого то здесь возникнет желание разбираться в программе из 1500 операторов. Плюс это не ничего не несет, что он там есть что его нет, результат один и тот же. А причем тут прерывания? Они вообще никакого отношения к этому циклу не имеют. Да он уходит в бесконечный цикл. Стиль от программистов trolltech, опираюсь так сказать на авторитетов...
|
|
|
|
|
Sep 27 2008, 16:18
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Anub @ Sep 27 2008, 20:12)  ..... в программе из 1500 операторов. ...... на контроллере Цитата ATTINY2313 во флеш которого помещаеться всего 1024 инструкции... Странно все это.... Анатолий.
|
|
|
|
|
Sep 27 2008, 16:28
|
Участник

Группа: Новичок
Сообщений: 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){}; } }; }
|
|
|
|
|
Sep 27 2008, 16:45
|
Участник

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

|
Цитата(aesok @ Sep 27 2008, 20:40)  Что делает фукция 'puts'? Ее код если она ваша, или описание если нет.
Анатолий. Это функция компилятора CodeVisionAVR, нареканий никогда не вызывала. Она отправляет символ по USART.
Сообщение отредактировал Anub - Sep 27 2008, 16:47
|
|
|
|
|
Sep 27 2008, 16:54
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Anub @ Sep 27 2008, 20:45)  Она отправляет символ по USART. Если функция работает с аппаратурой то она не является реентабельной (reentrant), вызавать такие функции одновременно из программы и прерывания нельзя. Анатолий.
|
|
|
|
|
Sep 27 2008, 17:03
|
Участник

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

|
Цитата(aesok @ Sep 27 2008, 20:54)  Если функция работает с аппаратурой то она не является реентабельной (reentrant), вызавать такие функции одновременно из программы и прерывания нельзя.
Анатолий. Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию.
|
|
|
|
|
Sep 27 2008, 17:05
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Anub @ Sep 27 2008, 21:03)  Одновременного вызова функции не происходит, как я уже говорил выше, наличие или отсутствие кода в цикле не влияет на ситуацию. Но может произойти! Какой размер откомпилированного кода? Анатолий.
Сообщение отредактировал aesok - Sep 27 2008, 17:06
|
|
|
|
|
Sep 27 2008, 17:22
|
Участник

Группа: Новичок
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|