Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » помогите с переделкой программы

Страниц (3): [1] 2 3 »
 

1. mrbin - 19 Января, 2014 - 18:11:30 - перейти к сообщению
не могу зделать так,что бы при нажатии кнопки диод горел при отпускании тух,знающие люди подскажите,вот код.


#include <io.h>
#include <delay.h>
#include <interrupt.h>

// Временные пределы
#define Tmin 40 // длинный промежуток
#define Tmax 68
#define TminK 22 // короткий промежуток
#define TmaxK 34

unsigned char sct_bit = 0; // Счетчик битов RC5
unsigned char RC5_buffer [14]; // Буфер RC5
unsigned char centre = 0; // Флаг центра
unsigned char not_korr = 0; // Флаг попадания в промежутки
unsigned char Timer = 0; // число в счетчике таймера
unsigned char command = 0; // переменная для команды
char s = 0;

// Функция очистки буфера
void rc5_cl_buf(void)
{
unsigned char i = 0;
for (i=0; i<14; i++)
{
RC5_buffer[i] = 0;
}
}

// функция остановки таймера
void rc5_ti_stop(void)
{
GICR = 0x00;
TCCR0 = 0x00;
TCNT0 = 0;
sct_bit = 0;
}

// Обработчик прерывния по переполнению Т0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
rc5_ti_stop(); //останавливаем таймер
rc5_cl_buf(); //очищаем буфер
GICR |= (1 << INT0); //разрешаем прерывания по входу INT0
GIFR |= (1 << INTF0); //сбрасываем флаг прерывания (если произошло)
}

// Обработчик внешнего прерывания INT0
interrupt [EXT_INT0] void ext_int0_isr(void)
{
Timer = TCNT0; // запоминаем значение счетчика
TCNT0 = 0; // обнуляем счетчик
not_korr = 1;

if(sct_bit==0)
{
TCCR0 |= (1 << CS02); // запускаем таймер (31.250 KHz)
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2)); //записываем в эл.массива
sct_bit++; // +1 к счётчику принятых битов
centre = 1;
}
else
{
// Проверка короткого промежутка
if ((Timer > TminK)&&(Timer < TmaxK))
{
if (centre)
{
centre = 0;
not_korr = 0;
}
else
{
centre = 1;
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2));
sct_bit++;
not_korr = 0;
}
}
// проверка длинного промежутка
if ((Timer > Tmin)&&(Timer < Tmax))
{
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2));
sct_bit++;
not_korr = 0;
}

if (not_korr == 1)
{ // если не попали ни в один из промежутков то
rc5_ti_stop(); // останавливаем таймер
rc5_cl_buf(); // очищаем буфер
}

if (sct_bit == 14)
{ // если бит последний то
rc5_ti_stop(); // останавливаем таймер

// Формируем код команды
command = (RC5_buffer [8] << 5)|(RC5_buffer [9] << 4)|
(RC5_buffer [10] << 3 )|(RC5_buffer [11] << 2)|
(RC5_buffer [12] << 1)|RC5_buffer [13];

if (command == 01 )
{
s++;
if(s > 1)
s = 0;
delay_ms(100);
if(s== 1)
PORTC |= (1 << PORTC0); // Включаем светодиод
if(s== 0)
PORTC &= ~(1 << PORTC0); // Выключаем светодио
}
if (command == 02 )
{
s++;
if(s > 1)
s = 0;
delay_ms(100);
if(s== 1)
PORTC |= (1 << PORTC1); // Включаем светодиод
if(s== 0)
PORTC &= ~(1 << PORTC1); // Выключаем светодиод
}




}
GICR |= (1 << INT0); // разрешаем прерывания по входу INT0
GIFR |= (1 << INTF0); // сбрасываем флаг прерывания по входу INT0
}

}
void main(void)
{
DDRC = 0xFF; // выход
PORTC = 0x00;
DDRD &= ~(1 << PORTD2); // вход ИК
PORTD = 0x00;

TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0

GICR |= (1 << INT0); // разрешаем прерывания по входу INT0
MCUCR |= (1 << ISC00); // прерывание по любому фронту
GIFR |= (1 << INTF0); // сбрасываем флаг прерывания


#asm("sei"Подмигивающий; // глобально разрешаем прерывания

while(1)

{

}



}
2. Роботов - 19 Января, 2014 - 18:30:07 - перейти к сообщению
mrbin пишет:
не могу зделать так,что бы при нажатии кнопки диод горел при отпускании тух,знающие люди подскажите,вот код.

А зачем здесь микроконтроллер? Включите светодиод через кнопку, и делов-то Голливудская улыбка
3. mrbin - 19 Января, 2014 - 19:55:20 - перейти к сообщению
я просил знающих людей
4. Predator - 19 Января, 2014 - 20:15:39 - перейти к сообщению
тут кнопка на инфракрасном пульте....
я бы сделал так:
принимать все пакеты с пульта, взводить флаг.
по прерыванию от таймера смотреть флаги и включать -выключать светодиоды.

период таймера раза в 3-4 периода повторения пакетов (лучше с задержкой зажжется, чем из-за одного битого пакета невовремя потухнет).
5. mrbin - 19 Января, 2014 - 20:28:53 - перейти к сообщению
Как прописать подскажите,я в этом плохо понимаю,а программа нужна.
6. morokoriss - 19 Января, 2014 - 20:55:28 - перейти к сообщению
"я просил знающих людей" А тут глупых то и нет. Вы сами хоть строчку того кода понимаете? Или содрали готовенькое по быстрому и не работает? Уверены что ошибок в схеме не допустили и что пульт у Вас именно RC5?
(Добавление)
И код что-то сложен для такой простой задачи. Можно просто ТСОП опрашивать и неважно чем его засветят, не нужно расшифровывать команды пульта.
7. Роботов - 19 Января, 2014 - 21:07:55 - перейти к сообщению
Видать курсовая горит Голливудская улыбка
8. mrbin - 19 Января, 2014 - 21:11:52 - перейти к сообщению
да код содрал маленько переделал,под включение и выключение,что ошибок нет уверен,устройство работает на 5,и в форум я зашел не обсуждать где код взял,а попросил помощи,чуть выше писал что не шарю в этом,а ты смотрю умничеешь а толку нет,с такими насмешками я тебя не просил сюда заходить,если ты на самом деле умный так помоги человеку,а если такой же как и я то и нечего насмехатся.
(Добавление)
мне не одна команда нужна а несколько,что просто тсоп опрашивать можно это я и без тебя знаю
9. morokoriss - 19 Января, 2014 - 21:48:28 - перейти к сообщению
А вот ты если так будешь разговаривать, то никто тебе не поможет. Если горит надо раньше думать было. Что ты в асму упёрся? Задание такое? Если не знаешь, то шансов нет! Сдери рабочий код, коих миллион. Даже тут подобные темы обсуждались. И впредь, прежде чем тему создать, проси сюда заходить конкретных лиц тогда. Все понял? Студент. И никто тут над тобой не насмехается, задачу конкретно ставить надо.
(Добавление)
Если не критично на чем писать, то вот, довольно понятно всё изложено, под любой пульт можно обучить. http://robocraft.ru/blog/799.html
(Добавление)
Раз так разговариваешь, значит много умный. Возьми этот алгоритм и переложи на асм. Делов то. Но за тебя, код никто писать не будет!
(Добавление)
Я и большинство форумчан, писали дипломы и курсовые тогда, когда не было свободного доступа к интернету, содрать неоткуда было. Справлялись же! Сейчас я отошёл от дел, семья и работа, некогда. Но если приспичит, возьму да и сам разберусь что к чему. Тем более когда я учился о МК только слышали и изучали бейсик только. Но если мне надо, то и в асме разберусь, хотя к чему?
10. Роботов - 19 Января, 2014 - 22:39:25 - перейти к сообщению
morokoriss пишет:
Но если приспичит, возьму да и сам разберусь что к чему.

+100500
11. mrbin - 20 Января, 2014 - 12:12:16 - перейти к сообщению
я не просил писать за меня код,и разговариваю так с тем кто со мной так разговаривает,я зашел помощи попросить а в ответ насмешки,почему и говорю знающего,этот код был зделан для определения команд с пду,я его переделал,здела устройство управления нагрузками,и всего лишь прошу помочь,как прописать ту команду что бы диод загорался только при нажатии на кнопку,при отпускании тух,я не програмист а так маленько увлекаюсь этим,и плохо понимаю в програмировании,по этому и просил людей помоч ,там вроде ни чего сложного для знающего человека,изменить команду и все,а я не могу догнать как это зделать.
12. Predator - 20 Января, 2014 - 19:31:21 - перейти к сообщению
очень рекомендую разобраться самостоятельно, если будут вопросы к конкретным участкам, и я и Роботов с удовольствием разьясним.
немного попозже я распишу, что делает этот код (по пунктам), ну и оставлю вам "допилить" до того, что надо.
13. mrbin - 20 Января, 2014 - 19:58:17 - перейти к сообщению
спасибо вам!
14. Петр Киселев - 16 Февраля, 2014 - 12:12:17 - перейти к сообщению
Ребята, помогите, пожалуйста с переделкой кода для Ардуино!
Вот код:


int IN1 = 2;
int IN2 = 3;
int IN3 = 4;
int IN4 = 5;
void setup()
{
pinMode(IN1, INPUT);
pinMode(IN2, INPUT);
pinMode(IN3, INPUT);
pinMode(IN4, INPUT);
}
void loop()

{

digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW
digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW
digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW
delay(5000); // Это условие выполняется 5 секунды, после чего идет следующее условие ниже.

digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW
digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH
digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW
delay(3000); // Это условие выполняется 3 секунды, после чего идет следующее условие ниже.

digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW
digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW
digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW
delay(2000); // Это условие выполняется 2 секунды, после чего идет следующее условие ниже.

digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW
digitalWrite(IN2,HIGH); // Двигатель А назад ДА - HIGH
digitalWrite(IN3,LOW); // Двигатель Б вперед ДА - LOW
digitalWrite(IN4,HIGH); // Двигатель Б назад ДА - HIGH
delay(3000); // Это условие выполняется 3 секунды, после чего идет следующее условие ниже.

digitalWrite(IN1,LOW); // Двигатель А в перед НЕТ - LOW
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ – LOW
digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW
digitalWrite(IN4,HIGH); // Двигатель Б назад ДА - HIGH
delay(4000); // Это условие выполняется 4 секунды, после чего идет следующее условие ниже.
}

Он далее повторяется, а мне надо, чтобы в дальнейшем было исключено 5-ти секундное молчание.
Как это сделать?
15. mihail - 16 Февраля, 2014 - 13:45:17 - перейти к сообщению
Измените setup так
void setup()
{
pinMode(IN1, INPUT);
pinMode(IN2, INPUT);
pinMode(IN3, INPUT);
pinMode(IN4, INPUT);

digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
delay(5000);
}

Из loop уберите
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW
digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW
digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW
delay(5000); // Это условие выполняется 5 секунды, после чего идет следующее условие ниже.

Если я правильно понял задачу, то все будет работать так как Вы хотите.

PS Вообще то ножки управляющие драйвером двигателя должны конфигурироваться как OUTPUT.