|
Непонятна логика программы, Не могу найти ошибку. Подскажите. |
|
|
|
Feb 13 2008, 20:12
|

Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297

|
Пишу программу на С для AVR. Cуть - плавный пуск. Проблемный кусок: Цитата int n=0;
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // Place your code here n=n+1;
if (0<n<11) { TCNT0=0x83; TCCR0=0x03; }
if (10<n<21) { TCNT0=0x91; TCCR0=0x03; }
if (20<n<31) {
TCNT0=0x9D; TCCR0=0x03;
}
} Объявил глобальную переменную. Присвоил ей нулевое значение. При каждом внешнем прерывании переменная инкрементируется. В зависимости от количества прерываний запускается таймер с разной константой. То есть первых 10 прерываний - константа будет 0x83 Следующий 10 - 0x91 и т.д. Но на асемблере получилось не так, как планировалось. Программа проверяет каждое условие и всё равно выполняет все подряд операторы. Например в начале, когда n=1, она проверяет не меньше ли оно 10. Оно меньше. Значит выполняются операторы. Потом идёт вторая проверка. Тут условие не выполняется, но всё равно операторы выполняются.Программа на асемблере: Цитата ; 44 // Place your code here ; 45 n=n+1; MOVW R30,R4 ADIW R30,1 MOVW R4,R30 ; 46 second=0; CLR R6 CLR R7 ; 47 ; 48 if (0<n<11) { MOVW R30,R4 LDI R26,LOW(0) LDI R27,HIGH(0) CALL __LTW12 CPI R30,LOW(0xB) BRSH _0x3 ; 49 TCNT0=0x83; LDI R30,LOW(131) OUT 0x32,R30 ; 50 TCCR0=0x03; LDI R30,LOW(3) OUT 0x33,R30 ; 51 } ; 52 ; 53 if (10<n<21) { _0x3: MOVW R30,R4 LDI R26,LOW(10) LDI R27,HIGH(10) CALL __LTW12 CPI R30,LOW(0x15) BRSH _0x4 ; 54 TCNT0=0x91; LDI R30,LOW(145) OUT 0x32,R30 ; 55 TCCR0=0x03; LDI R30,LOW(3) OUT 0x33,R30
...................................
__LTW12: CP R26,R30 CPC R27,R31 LDI R30,1 BRLT __LTW12T CLR R30 __LTW12T: RET То что подчеркнул красным проблемные места. Получается R30 всегда либо 1, ли бо 0. Подскажите, в чём ошибка.
Сообщение отредактировал Владимир_КПИ - Feb 13 2008, 20:21
|
|
|
|
|
 |
Ответов
|
Feb 14 2008, 10:14
|

Частый гость
 
Группа: Свой
Сообщений: 99
Регистрация: 27-10-07
Из: СПб
Пользователь №: 31 797

|
Цитата(Владимир_КПИ @ Feb 14 2008, 12:57)  Есть массив:
int time[100]={0xFB04, 0xF8F2, .....}
Как из элемента массива отделить байты?
Чтобы потом сделать так:
TCNT1H=0xFB; //TCNT1H=high(time[0]) TCNT1L=0x04; //TCNT1L=low(time[0])
Коментарии условные. TCNT1H = (time[n] & 0xFF00) >> 8; TCNT1L = time[n] & 0xFF; ... и открыть ветку "изучаем С интерактивно"
Сообщение отредактировал Liseev - Feb 14 2008, 10:15
|
|
|
|
|
Feb 14 2008, 15:51
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Liseev @ Feb 14 2008, 13:14)  TCNT1H = (time[n] & 0xFF00) >> 8; TCNT1L = time[n] & 0xFF; ... и открыть ветку "изучаем С интерактивно"  TCNT1H = time[n] >> 8; TCNT1L = (unsigned char)time[n];
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 14 2008, 16:28
|

Частый гость
 
Группа: Свой
Сообщений: 99
Регистрация: 27-10-07
Из: СПб
Пользователь №: 31 797

|
Цитата(zltigo @ Feb 14 2008, 18:51)  TCNT1H = time[n] >> 8; TCNT1L = (unsigned char)time[n]; можно еще проще: TCNT1H = time[n] >> 8; TCNT1L = time[n]; результирующий код во всех трех случаях один, вопрос в наглядности написания.
|
|
|
|
|
Feb 14 2008, 18:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Liseev @ Feb 14 2008, 19:28)  результирующий код во всех трех случаях один, вопрос в наглядности написания. В первом Вашем варианте придется полностью положиться на способность компилятора соптимизировать, а зачем? Наглядность из-за обилия ненужных символов тоже оставдяет желать лучшего. В последнем все зависит от разрядности TCNT1L и реализации адресации, а зачем помнить о его разрядности, если сделав явное преобразование типов я получу и гарантированный, и читабельный код и без накладных расходов?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Владимир_КПИ Непонятна логика программы Feb 13 2008, 20:12 zltigo Проблема в том, что это написано не на "C... Feb 13 2008, 20:32 singlskv Цитата(zltigo @ Feb 13 2008, 23:32) Пробл... Feb 13 2008, 22:53 Владимир_КПИ Программа писалась в CodeVisionAVR. Языка особо не... Feb 13 2008, 20:43 zltigo Цитата(Владимир_КПИ @ Feb 13 2008, 23:43)... Feb 13 2008, 20:47 rezident Жесть! Зело позабавило
Владимир_КПИ, для нача... Feb 13 2008, 20:55 Владимир_КПИ Спасибо. Исправил. Сейчас проверю работу на практи... Feb 13 2008, 21:15 =AK= Цитата(Владимир_КПИ @ Feb 14 2008, 06:45)... Feb 13 2008, 23:49  zltigo Цитата(=AK= @ Feb 14 2008, 02:49) http://... Feb 14 2008, 00:20 SSerge Более эффективный способ проверок, требуется тольк... Feb 14 2008, 02:56 Владимир_КПИ Цитата__flash char table[] = { 131, 132, ..... 145... Feb 14 2008, 06:19 Gogan unsigned int n=0;
#define tcnt0_max 0xff
#define... Feb 14 2008, 06:50 Владимир_КПИ Спасибо Feb 14 2008, 10:48 Владимир_КПИ Вчера написал программу для плавного пуска с испол... Feb 14 2008, 15:45 Владимир_КПИ Исправил. Всё равно пока не работает.
Обновлённа... Feb 14 2008, 16:01 Владимир_КПИ Может проблема с тактированием. Устанавливал фъюзы... Feb 14 2008, 17:46 Владимир_КПИ Как же всё просто было. Я увеличил тактовую частот... Feb 14 2008, 18:30 Владимир_КПИ Добавил в схему кнопку для увеличения яркости. Сто... Feb 15 2008, 07:03 zltigo Цитата(Владимир_КПИ @ Feb 15 2008, 10:03)... Feb 15 2008, 07:22 Dog Pawlowa Цитата(Владимир_КПИ @ Feb 15 2008, 11:03)... Feb 15 2008, 07:31 Владимир_КПИ ЦитатаКаким генератором случайных текстов пользует... Feb 15 2008, 07:29 zltigo Цитата(Владимир_КПИ @ Feb 15 2008, 10:29)... Feb 15 2008, 07:48 Владимир_КПИ while (1)
{
while (PINC.0==1){} //кнопка подключе... Feb 15 2008, 07:37 Dog Pawlowa Цитата(Владимир_КПИ @ Feb 15 2008, 11:37)... Feb 15 2008, 07:55 Владимир_КПИ В постоянном цикле происходит проверка линия порта... Feb 15 2008, 07:56 Dog Pawlowa Цитата(Владимир_КПИ @ Feb 15 2008, 11:56)... Feb 15 2008, 08:17 Владимир_КПИ ЦитатаПопробуйте подумать, что будет дальше, если ... Feb 15 2008, 08:22 Dog Pawlowa Цитата(Владимир_КПИ @ Feb 15 2008, 12:22)... Feb 15 2008, 08:30 Владимир_КПИ И что из этого следует? Нужно увеличить задержку?
... Feb 15 2008, 08:34 Dog Pawlowa Цитата(Владимир_КПИ @ Feb 15 2008, 12:34)... Feb 15 2008, 09:19 Владимир_КПИ ЦитатаТо есть думать сами Вы категорически отказыв... Feb 15 2008, 09:25 BigCoster Цитата(Владимир_КПИ @ Feb 15 2008, 13:25)... Feb 15 2008, 13:23
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|