реклама на сайте
подробности

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


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Motion
сообщение Feb 15 2008, 09:25
Сообщение #2


Местный
***

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



Цитата
То есть думать сами Вы категорически отказываетесь?


Хочу сам сообразить.


Цитата
while (PINC.0==1){} //кнопка подключена одним концом к земле, другим к PINC.0. Линия порта включена на ввод через поддягивающий резистор
if (user<100)
user=user+10;
else {}
delay_us(2000); //функция задержки на 2 мс



При появлении на выводе нуля (нажатия кнопки) выполняется проверка - если значение яркости меньше 100% значит увеличить его на 10%, в противном случае ничего не делать. После этого сделать задержку в 2 мс. Вы хотите сказать, что кнопку я держу более 2 мс? Сейчас попробую сделать задержку на 2 с.

Вроде всё правильно.
Go to the top of the page
 
+Quote Post
BigCoster
сообщение Feb 15 2008, 13:23
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 9-03-07
Из: г. Днепропетровск
Пользователь №: 26 009



Цитата(Владимир_КПИ @ Feb 15 2008, 13:25) *
Хочу сам сообразить.
При появлении на выводе нуля (нажатия кнопки) выполняется проверка - если значение яркости меньше 100% значит увеличить его на 10%, в противном случае ничего не делать. После этого сделать задержку в 2 мс. Вы хотите сказать, что кнопку я держу более 2 мс? Сейчас попробую сделать задержку на 2 с.

Вроде всё правильно.


Почему не пользуетесь таймерами?
Я недавно делал где-то вот так, тоже на лампочке smile.gif
Код
// Timer/Counter 2 initialization
// Clock source: System Clock 16МГц
// Clock value: 62,500 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x06;
TCNT2=0xC2;
OCR2=0x00;

#define key PINC.0
#define minPWM 1
#define maxPWM 1023

unsigned int T2count = 0;
unsigned char flag = 0;
int pwm = 0;
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
TCNT2=194;
//0.992 milisecond:  
    if (T2count <= 1007)   //default 1007
    {
    T2count++;
        if ((!key)&&(!flag))
        {
            if (pwm <= maxPWM) pwm++;
            else flag = 1;        
        }
        else if ((!key)&&(flag))
        {
            if (pwm >= minPWM) pwm--;
            else flag = 0;
        }    
    }
    else
    {
    //0,999936 second:  
    T2count=0;
    }    
}


Слышал здесь интерактивный курс по Си, поругайте и меня biggrin.gif

Сообщение отредактировал BigCoster - Feb 15 2008, 13:32
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Владимир_КПИ   Непонятна логика программы   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
- - Владимир_КПИ   Есть массив: int time[100]={0xFB04, 0xF8F2, ........   Feb 14 2008, 09:57
|- - Liseev   Цитата(Владимир_КПИ @ Feb 14 2008, 12:57)...   Feb 14 2008, 10:14
|- - zltigo   Цитата(Liseev @ Feb 14 2008, 13:14) TCNT1...   Feb 14 2008, 15:51
|- - Liseev   Цитата(zltigo @ Feb 14 2008, 18:51) TCNT1...   Feb 14 2008, 16:28
|- - zltigo   Цитата(Liseev @ Feb 14 2008, 19:28) резул...   Feb 14 2008, 18:12
- - Владимир_КПИ   Спасибо   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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th August 2025 - 00:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01797 секунд с 7
ELECTRONIX ©2004-2016