|
Два вложенных бесконечных цикла вызывают сбой 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: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
|
|
|
|
Сообщений в этой теме
Anub Два вложенных бесконечных цикла вызывают сбой USART Sep 27 2008, 15:24 rezident У вас в четвертой строке закрывающий ; лишниий что... Sep 27 2008, 15:47 Anub Цитата(rezident @ Sep 27 2008, 19:47) У в... Sep 27 2008, 16:12  aesok Цитата(Anub @ Sep 27 2008, 20:12) ..... в... Sep 27 2008, 16:18 rezident Прошу прощения. "... цикла" у меня почем... Sep 27 2008, 16:19 _Pasha Цитата(Anub @ Sep 27 2008, 19:24) Вот так... Sep 27 2008, 16:48 Anub HEX: 2600 байт
Со всеми обвесами 2609 операторов
... Sep 27 2008, 17:22 VDG Множественный вызов функции setTimeFunctionEnabled... Sep 27 2008, 18:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|