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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Непонятна логика программы, Не могу найти ошибку. Подскажите.
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
zltigo
сообщение Feb 13 2008, 20:32
Сообщение #2


Гуру
******

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



Проблема в том, что это написано не на "C" sad.gif. Начните с изучения языка.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 13 2008, 20:43
Сообщение #3


Местный
***

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



Программа писалась в CodeVisionAVR. Языка особо не знаю. Писал по логике.

Возможно проблема вот здесь - "(10<n<21)".

Сообщение отредактировал Владимир_КПИ - Feb 13 2008, 20:47
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 13 2008, 20:47
Сообщение #4


Гуру
******

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



Цитата(Владимир_КПИ @ Feb 13 2008, 23:43) *
Учить язык, чтобы выявить ошибку? Не вижу смысла. Проще у кого-то спросить.

Хорошая фраза. Можете занести эту фразу себе в подпись.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 13 2008, 20:55
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Жесть! Зело позабавило smile.gif
Владимир_КПИ, для начала выражение вида if (0<n<11) запишите как if ((n>0)&&(n<11)).
Но вот эту книгу на полку себе поставьте http://www.lib.ru/CTOTOR/kernigan.txt
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 13 2008, 21:15
Сообщение #6


Местный
***

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



Спасибо. Исправил. Сейчас проверю работу на практике.

Всё отлично работает. Программа своё отрабатывает. Единственное, что плавный пуск делается за 10 шагов. Нужно сделать чаще, чтобы для зрения не было замерно. Чтобы был именно планым, а не рывками.
Но если добавлю ещё операторов if будет не совсем хорошо - при каждом прерывании делать множество проверок. Нельзя ли как-то оптимизировать код?

Видео

Сообщение отредактировал Владимир_КПИ - Feb 13 2008, 21:23
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2008, 22:53
Сообщение #7


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Feb 13 2008, 23:32) *
Проблема в том, что это написано не на "C" sad.gif.

Да ладно Вам, вполне жизненная конструкция, и кстати очень даже на C biggrin.gif

Например так:
unsigned char a;
a = 0;
if (1>a>0) ......
a = 1;
if (1>a>0) ......

Шучу... a14.gif
Go to the top of the page
 
+Quote Post
=AK=
сообщение Feb 13 2008, 23:49
Сообщение #8


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(Владимир_КПИ @ Feb 14 2008, 06:45) *
Но если добавлю ещё операторов if будет не совсем хорошо - при каждом прерывании делать множество проверок. Нельзя ли как-то оптимизировать код?

http://en.wikipedia.org/wiki/Switch_statement
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 14 2008, 00:20
Сообщение #9


Гуру
******

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



Цитата(=AK= @ Feb 14 2008, 02:49) *

Дык, чую,что совсем незачем принципиально так строить алгоритм - там что-то системного подхода в упор не видать sad.gif.
А co switch он такого в обнимку с волшебником натворит smile.gif.
Ладно пример со switch:
Код
    switch( n++ / 10 )
    {
    case 0:    
        TCNT0=0x83;
        break;
    case 1:    
        TCNT0=0x91;
        break;
    case 2:    
        TCNT0=0x9D;
        break;
    case .......
         .......
        break;               

    default:
            ;
    }          
    TCCR0=0x03;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 14 2008, 02:56
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Более эффективный способ проверок, требуется только одно сравнение для каждого поддиапазона.
Код
if( n < 11 ) TCNT0=0x83;
else if( n < 21 ) TCNT0=0x91;
else if( n < 31 ) TCNT0=0x9D;

если хочется ещё быстрее - придётся за это заплатить размером памяти кода.
Например так:

Код
__flash char table[] = { 131, 132, ..... 145  /*... и так далее */ };
// а вместо кучи if одна строка
TCNT0= table[n];

разумеется, нужно позаботиться о случаях когда n меньше 0 (можно объявить как unsigned) и когда n становится больше максимального индекса в массиве table.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 06:19
Сообщение #11


Местный
***

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



Цитата
__flash char table[] = { 131, 132, ..... 145 /*... и так далее */ };
// а вместо кучи if одна строка
TCNT0= table[n];


Вот это по-моему лучший вариант для моего случая. Объявлю массив со 100 значениями. При каждом прерывании будет инкрементироваться n. За 2 секунды - 100 раз по 1%. Будет и плавнее.


Цитата
когда n становится больше максимального индекса в массиве table

Да, думал над этим. Сейчас что-нибудь придумаю.
Go to the top of the page
 
+Quote Post
Gogan
сообщение Feb 14 2008, 06:50
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 25-10-07
Из: Киев
Пользователь №: 31 728



unsigned int n=0;

#define tcnt0_max 0xff
#define tcnt0_min 0x83
#define nmax 100

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
if(n<nmax){n=n+1;}

TCNT0=tcnt0_min+((tcnt0_max-tcnt0_min)*n)/nmax;
TCCR0=0x03;

}

если nmax>0xff тогда нужно "TCNT0=tcnt0_min+((tcnt0_max-tcnt0_min)*(unsigned long int)n)/nmax;"
операция деления для int (или long int) выполняется не помню сколько, но не более 500 клоков (на 8мГц потратится не более 0,1 мс времени, или 1% полпериода сетевого питания, я бы сделал так. )
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 09:57
Сообщение #13


Местный
***

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



Есть массив:

int time[100]={0xFB04, 0xF8F2, .....}

Как из элемента массива отделить байты?

Чтобы потом сделать так:

TCNT1H=0xFB; //TCNT1H=high(time[0])
TCNT1L=0x04; //TCNT1L=low(time[0])

Коментарии условные.

Сообщение отредактировал Владимир_КПИ - Feb 14 2008, 09:58
Go to the top of the page
 
+Quote Post
Liseev
сообщение Feb 14 2008, 10:14
Сообщение #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;

... и открыть ветку "изучаем С интерактивно" smile.gif

Сообщение отредактировал Liseev - Feb 14 2008, 10:15
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 10:48
Сообщение #15


Местный
***

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



Спасибо
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 15:45
Сообщение #16


Местный
***

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



Вчера написал программу для плавного пуска с использованием Timer0 (8 bit).

Сегодня решил усовершенствовать программу. Сделать на Timer1 (16 bit). Чтобы увеличить точность и плавность включения.

Пол дня промучался - ничего не получается.

Прошу помощи.

Сначала что имею. Имею МК ATMega 16. Вчера ещё всё включалось на 1МГц. Сегодня поставил кварц на 16МГц и прошил фузы.

Моя программа - Прикрепленный файл  alpha.rar ( 33.08 килобайт ) Кол-во скачиваний: 87
(есть подробные коментарии)

Cкорее всего проблема в синтаксисе языка или логике выполнения.


Каждый блок программы проверял с помощью светодиода, установленого на плате. Если блок выполнялся - светодиод загорался. Например в блоке подачи импульса на симистор - светодиод загорается, но лампа не зажигается. Хотя если просто подать длительный импульс на симистор - лампа зажигается.

Не пойму в чём дело.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 14 2008, 15:51
Сообщение #17


Гуру
******

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



Цитата(Liseev @ Feb 14 2008, 13:14) *
TCNT1H = (time[n] & 0xFF00) >> 8;
TCNT1L = time[n] & 0xFF;
... и открыть ветку "изучаем С интерактивно" smile.gif

TCNT1H = time[n] >> 8;
TCNT1L = (unsigned char)time[n];


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 16:01
Сообщение #18


Местный
***

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



Исправил. Всё равно пока не работает.

Обновлённая программа - Прикрепленный файл  alpha.rar ( 33.07 килобайт ) Кол-во скачиваний: 84


Обидно, что не осталась рабочая версия программы для 8-ми битного счётчика.

Сообщение отредактировал Владимир_КПИ - Feb 14 2008, 16:13
Go to the top of the page
 
+Quote Post
Liseev
сообщение Feb 14 2008, 16:28
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 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];

результирующий код во всех трех случаях один, вопрос в наглядности написания.
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 17:46
Сообщение #20


Местный
***

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



Может проблема с тактированием. Устанавливал фъюзы. Припаивал кварцевый резонатор и 2 конденсатора на 22 пФ. По идее, если фъюзы установил на кварцевый резонатор, то должен работать кварцевый резонатор на 16МГц либо тактирования вообще не должно быть?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 14 2008, 18:12
Сообщение #21


Гуру
******

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



Цитата(Liseev @ Feb 14 2008, 19:28) *
результирующий код во всех трех случаях один, вопрос в наглядности написания.

В первом Вашем варианте придется полностью положиться на способность компилятора соптимизировать, а зачем? Наглядность из-за обилия ненужных символов тоже оставдяет желать лучшего.
В последнем все зависит от разрядности TCNT1L и реализации адресации, а зачем помнить о его разрядности, если сделав явное преобразование типов я получу и гарантированный, и читабельный код и без накладных расходов?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 18:30
Сообщение #22


Местный
***

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



Как же всё просто было. Я увеличил тактовую частоту в 16 раз. А время отпирающего импульса симистора забыл увеличить. Блин.........
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:03
Сообщение #23


Местный
***

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



Добавил в схему кнопку для увеличения яркости. Столкнулся с дребезгом контактов.

Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код:
Цитата
while (1)
{
while (PINC.0==1){}
delay_us(200);
user=user+10;
n=user;
delay_us(200);
}


В результате при нажатии на кнопку яркость становиться произвольной. То есть дребезг присутствует. В чём ошибка?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2008, 07:22
Сообщение #24


Гуру
******

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



Цитата(Владимир_КПИ @ Feb 15 2008, 10:03) *
Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки.

Не лучше, просто самый лобовой вариант.
Цитата
Применил такой код:

Каким генератором случайных текстов пользуетесь, если не секрет?

Код
uint_least8_t press_cnt;
for(;; )
{
    if( !PINC.0 )
    {   if( ++press_cnt > 250 )
         {        user += 10;
                                    press_cnt = 0;
                  }
         else
           delay_us( 1000 );
    }
    else
       press_cnt = 0;
}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:29
Сообщение #25


Местный
***

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



Цитата
Каким генератором случайных текстов пользуетесь, если не секрет?


Плохо знаю язык, поэтому и ошибки.

Должен же и такой "лобовой" вариант работать

Сообщение отредактировал Владимир_КПИ - Feb 15 2008, 07:32
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 15 2008, 07:31
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Владимир_КПИ @ Feb 15 2008, 11:03) *
Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код:

Вы бы код свой комментировали словами, а? sad.gif
Что такое user, что такое n?
Люди готовы помочь, Вы уж постарайтесь облегчить им задачу.
Пока будете слова писать, может причина неработоспособности кода и самому станет понятнее.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:37
Сообщение #27


Местный
***

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



while (1)
{
while (PINC.0==1){} //кнопка подключена одним концом к земле, другим к PINC.0. Линия порта включена на ввод через поддягивающий резистор
delay_us(200); //функция задержки на 200 мкс
user=user+10; //по умолчанию user=50 (% яркости). При нажатии на кнопку она (яркость) должна увеличиться на 10%
delay_us(200); //функция задержки на 200 мкс
}

Сообщение отредактировал Владимир_КПИ - Feb 15 2008, 07:39
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2008, 07:48
Сообщение #28


Гуру
******

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



Цитата(Владимир_КПИ @ Feb 15 2008, 10:29) *
Плохо знаю язык, поэтому и ошибки.

Все хуже sad.gif - попробуйте просто описать, что хотели сделать с задержкам и дребезгом на русском языке. Это уже будет бред.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 15 2008, 07:55
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Владимир_КПИ @ Feb 15 2008, 11:37) *
while (1)
{
while (PINC.0==1){} //кнопка подключена одним концом к земле, другим к PINC.0. Линия порта включена на ввод через поддягивающий резистор
delay_us(200); //функция задержки на 200 мкс
user=user+10; //по умолчанию user=50 (% яркости). При нажатии на кнопку она (яркость) должна увеличиться на 10%
delay_us(200); //функция задержки на 200 мкс
}


1) Типичный дребезг около миллисекунды, а в плохих кнопках достигает 5 мс.
2) Яркость будет увеличиваться, пока нажата кнопка и не произойдет переполнение.
У Вас проблема не со знанием языка, а с ленью продумывания алгоритма. Правильно, зачем думать, проще выложить здесь фигню, не подумав (вот вторая задержка - для чего введена?), и подождать добрую душу.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:56
Сообщение #30


Местный
***

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



В постоянном цикле происходит проверка линия порта на нажатие. Если нажатия нет, то ничего не делать.
Если нажатие есть - произвести задержку на 200 мкс. После этого увеличить значение переменной user на 10.


Последняя задержка не нужна
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 15 2008, 08:17
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Владимир_КПИ @ Feb 15 2008, 11:56) *
В постоянном цикле происходит проверка линия порта на нажатие. Если нажатия нет, то ничего не делать.
Если нажатие есть - произвести задержку на 200 мкс. После этого увеличить значение переменной user на 10.

Попробуйте подумать, что будет дальше, если кнопка нажата более 400 мкс.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 08:22
Сообщение #32


Местный
***

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



Цитата
Попробуйте подумать, что будет дальше, если кнопка нажата более 400 мкс.


Произойдёт повторное нажатие
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 15 2008, 08:30
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Владимир_КПИ @ Feb 15 2008, 12:22) *
Произойдёт повторное нажатие

Отлично. Как видите, можно программировать на языке Р (русском).


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 08:34
Сообщение #34


Местный
***

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



И что из этого следует? Нужно увеличить задержку?

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


При нажатии на кнопку - яркость не увеличивается на 10%, а на 50% (то есть до самого конца). Задержку увеличил до 2 мс.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 15 2008, 09:19
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Владимир_КПИ @ Feb 15 2008, 12:34) *
И что из этого следует? Нужно увеличить задержку?

Сделал вот так:
При нажатии на кнопку - яркость не увеличивается на 10%, а на 50% (то есть до самого конца). Задержку увеличил до 2 мс.

То есть думать сами Вы категорически отказываетесь?
Тогда возьмите пример zltigo, так будет проще всем.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 09:25
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #37


Участник
*

Группа: Свой
Сообщений: 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

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

 


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


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