Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
10.09.2017, 22:21
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
как сюда прикрутить прерывания?
Код:
|
#include ‹IRremote.h›
IRsend irsend;
int RECV_PIN = 3;//1
IRrecv irrecv(RECV_PIN);
decode_results results;
int enableA = 5;
int MotorA1 = 6;
int MotorA2 = 7;
int enableB = 8;
int MotorB1 = 9;
int MotorB2 = 10;
int Dword;
int flag = 0; //8 forw 2back 4 left 6right
int flagst = 0;
void setup() {
Serial.begin (9600);
irrecv.enableIRIn();
pinMode (enableA, OUTPUT);
pinMode (MotorA1, OUTPUT);
pinMode (MotorA2, OUTPUT);
pinMode (enableB, OUTPUT);
pinMode (MotorB1, OUTPUT);
pinMode (MotorB2, OUTPUT);
Forward (1);
stop();
}
void en() {
Serial.print ("En - ");
digitalWrite (enableA, HIGH);
digitalWrite (enableB, HIGH);
}
void stop() {
Serial.println (" - St");
digitalWrite (enableA, LOW);
digitalWrite (enableB, LOW);
digitalWrite (MotorA1, LOW);
digitalWrite (MotorA2, LOW);
digitalWrite (MotorB1, LOW);
digitalWrite (MotorB2, LOW);
}
void Forward (int a) {
Serial.print ("Forward");
flag = 8;
digitalWrite (MotorA1, LOW); //A Forward
digitalWrite (MotorA2, HIGH); //A Forward
digitalWrite (MotorB1, LOW); //B Forward
digitalWrite (MotorB2, HIGH); //B Forward
en();
delay (a);
// stop();
}
void Backward (int a) {
flag = 2;
Serial.print ("backward");
digitalWrite (MotorA1, HIGH); //A Backward
digitalWrite (MotorA2, LOW); //A Backward
digitalWrite (MotorB1, HIGH); //B Backward
digitalWrite (MotorB2, LOW); //B Backward
en();
delay (a);
// stop();
}
void left(int a) {
flag = 4;
Serial.print ("left");
digitalWrite (MotorA1, LOW); //A Forward
digitalWrite (MotorA2, HIGH); //A Forward
digitalWrite (MotorB1, HIGH); //B Backward
digitalWrite (MotorB2, LOW); //B Backward
en();
delay (a);
// stop();
}
void right(int a) {
flag = 6;
Serial.print ("right");
digitalWrite (MotorA1, HIGH); //A Backward
digitalWrite (MotorA2, LOW); //A Backward
digitalWrite (MotorB1, LOW); //B Forward
digitalWrite (MotorB2, HIGH); //B Forward
en();
delay (a);
// stop();
}
void loop() {
Dword = Serial.read();
if (Dword == 'w') {
Forward (100);
}
if (Dword == 's') {
Backward (100);
}
if (Dword == 'a') {
left(100);
}
if (Dword == 'd') {
right(100);
}
if (irrecv.decode(&results)) //this checks to see if a code has been received
{ Serial.println(results.value, HEX);
if (results.value == 0xFFAA55) {
Forward (1); flag = 8;
}
if (results.value == 0xFFE01F) {
Backward (1); flag = 2;
}
if (results.value == 0xFF7A85) {
left(1); flag = 4;
}
if (results.value == 0xFFA05F) {
right(1); flag = 6;
}
if (results.value == 0xFF609F) {
stop();
}
if (results.value == 0xFFFFFFFF) {
if (flag == 8) {
Forward (100);
}
if (flag == 2) {
Backward (1);
}
if (flag == 4) {
left(1);
}
if (flag == 6) {
right(1);
}
}
//else {stop();}
irrecv.resume(); //receive the next value
}
delay(100);
} |
это робот, принимает сигнал с 5 кнопок ИК пульта и вращает колесами.
всё работает, но я хочу сделать так - что бы робот ехал только тогда - когда кнопка нажата
первый код кнопки - FFE01F а если она зажата - повторяется FFFFFFFF
сейчас я жму кнопку - и колеса вращаются пока я не нажму стоп.
TSOP подключен к 3 выводу, на котором есть прерывание int1_vect но я не нашел инфорнмацию как им пользоваться.
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
10.09.2017, 22:27
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
Бугога. Ты походу в низком уровне ваще не шаришь?
|
|
|
|
10.09.2017, 22:31
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
Сообщение от индюк
|
Бугога. Ты походу в низком уровне ваще не шаришь?
|
нет) я только под винду раньше писал, вот пытаюсь разобраться...
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
11.09.2017, 07:06
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
"Сюда" лучше ничего не прикручивать. Но если вдруг решите заняться изучением С, мы постараемся помочь.
|
|
|
|
11.09.2017, 11:45
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
Попробуйте почитать про работу с прерываниями у Ардуино вообще:
http://robocraft.ru/blog/arduino/45.html
Но в целом - я присоединяюсь к Easyrider83 с рекомендацией переходить на более Си.
|
|
|
|
11.09.2017, 12:30
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
Там всю работу в прерывании надо переделать на флаги, а в основной программе по ним и управлять двигателями. Только обработку таймера добавить для интервала между посылками с пульта.
Собственно даже не углубляясь сильно - переделать совсем не сложно (но только если один раз).
А вот совет о чтении и усвоении соответствующей литературы при необходимости не один раз сие делать - это таки самое первое…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
11.09.2017, 12:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 16.05.2015
Адрес: Болгария
Сообщений: 1,460
Сказал спасибо: 286
Сказали Спасибо 1,125 раз(а) в 540 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
Вроде нечто такое должно быть. Может и угадал
Со скобками {} и ; Вам разбиратся
Код:
|
if (irrecv.decode(&results)) //this checks to see if a code has been received
{ Serial.println(results.value, HEX);
}
---------------------------------------------------------
if (results.value == 0xFFFFFFFF) {
Stop();
else {
if (results.value == 0xFFAA55) {
Forward (1);
}
if (results.value == 0xFFE01F) {
Backward (1);
}
if (results.value == 0xFF7A85) {
Left(1);
}
if (results.value == 0xFFA05F) {
Right(1);
}
}
irrecv.resume(); //receive the next value
---------------------------------------------------------
}
delay(100);
} |
|
|
|
|
12.09.2017, 11:54
|
|
Временная регистрация
Регистрация: 17.12.2008
Адрес: Спб
Сообщений: 96
Сказал спасибо: 19
Сказали Спасибо 25 раз(а) в 20 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
перво наперво надо определиться в каком случае должно(ы) возникать прерывание(я)
это могут быть таймеры, внешние сигналы, сигналы от периферии ...
потом разобрать программу на 3 части (хотя-бы в словесно-структурном виде):
1) инициализация всего (то, что должно отработать 1 раз при включении)
2) обработка прерываний (то, что должно выполняться при событиях)
3) основная программа (то, что работает, пока не возникло прерывание, очень часто тут может вообще ничего не быть)
далее из п.2 вытечет обработчик(и) прерывания(ний)
ну а там разобраться с компилятором на тему того, как их (обработчики) навесить и включить.
|
|
|
|
13.09.2017, 10:30
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,410
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Re: как сюда прикрутить прерывания?
Задействуйте таймер, что бы интервал прерывания чуть превышал время между командами повтора.
Командой повтора или движения - сбрасываете таймер.
По прерыванию от таймера - делайте СТОП.
Обычно, интервал между повторами составляет 100мс.
|
|
|
Сказали "Спасибо" -vitalik-
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:49.
|
|