Может быть у тебя еще подключено по USB FTDI устройство
Какая операционка? какой версии драйвер?
Может быть у тебя еще подключено по USB FTDI устройство
Какая операционка? какой версии драйвер?
Ось - ХП сп3. Драйвер их шапки темы про компилятор (кста, там бы ссылку не помешало обновить на 0022).
Дело не в компе. Либо я где-то туплю со скетчем, либо я слишком многого хочу от контроллера. У меня две кнопки управляют радиоприемником (станция вверх, станция вниз), т.е. даже тогда, когда компьютер полностью отключен. Кнопка "вниз" - это короткое, т.е. вообще без сопротивления, но даже она спотыкается. Т.е. ошибка замера сопротивления не при чем. Затык именно при синхронном выполнении двух операций: нажатие рулевой кнопки и запись в порт...
Завтра выложу скетч. Глянете опытным взглядом.
зы: только сейчас вспомнил. я же 0018-ым компилятором прошивал ардуину. Может повлиять?
Собственно, завтра проверю.
Дорогие друзья! Помогите решить следующую проблему.
Имеем штатные рулевые кнопки на резистивной матрице, которая подключена к арудуине. Имеем скетч:
define PIN 7 //номер аналогового порта
#define LIMIT 6 //предел погрешности сопротивления
int knopka_trg=0;
byte bytes[2];
int res_dt1;
unsigned long math_time,old_time,real_time;
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
Serial.begin(115200); // настроить скорость com порта
}
void loop()
{
old_time = real_time;
math_time = 0;
res_dt1 = analogRead(PIN); // прочитать данные АЦП
while(math_time < 300 && (analogRead(PIN)>res_dt1-LIMIT && analogRead(PIN) < res_dt1+LIMIT ))
{
real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность паузы
}
if( math_time > 80 ) //если нет дребезга
{
if (res_dt1>965 && res_dt1<975) digitalWrite(6,HIGH );// увеличиваем громкость
else { digitalWrite(6, LOW); }
if (res_dt1>980 && res_dt1<990) digitalWrite(5,HIGH ); // уменьшаем громкость
else { digitalWrite(5, LOW); }
if (res_dt1>1000 && res_dt1<1010) {
knopka_trg=1-knopka_trg;
digitalWrite(2, knopka_trg); // вкл_выкл
}
bytes[0] = res_dt1 & 255; // преобразовать в 2-байта
bytes[1] = (res_dt1 & 768) >> 8;
Serial.write( bytes,2); // отправить прочитаное значение компьютеру
}
}
Всё рабоает.
Появилась необходимость паралельного подключения джойстика СОНИ , он тоже на резистивной матрице. Значения в АЦП ардуино он даёт ес-но другие.
Вопрос - как обеденить два значения АЦП для решения одной задачи ?
Пример:
if (res_dt1>111 && res_dt1<112) digitalWrite(6,HIGH );// увеличиваем громкость
else { digitalWrite(6, LOW); }
Это при нажатии штатки.
А это при нажатии джойстика:
if (res_dt1>221 && res_dt1<222) digitalWrite(6,HIGH );// увеличиваем громкость
else { digitalWrite(6, LOW); }
Как объеденить в скетче, а то у меня не выходит ничего, работает или то, или другое, вместе не хотят![]()
Последний раз редактировалось Rover 176; 17.05.2011 в 16:02.
Проще резистивные кнопки объединить, так как они все равно не пересекаются. Попробуй подключи параллельно
Я так и сделал, но мне нужно, чтобы при разных значениях на ЦАП был один результат.
Т.е.
Подключил резистор 1 кОм- получил на выходе 5 ардуины 1.
if (res_dt1>111 && res_dt1<112) digitalWrite(5,HIGH );//
Подключил резистор 2 кОм- тоже получил на выходе 5 ардуины 1.
if (res_dt1>221 && res_dt1<222) digitalWrite(5,HIGH );//
Как это в скетче обеденить??
Последний раз редактировалось Rover 176; 17.05.2011 в 21:53.
Поколдовал я еще малость. Не помогает. Логика прежняя: отключаешь функции, вызываемые по таймеру, кнопки работают так, как-будто они родные.
Вот скетч:
Как только раскоментирую return:PHP код:#include <DallasTemperature.h>
#include <EEPROM.h>
#define D13_High PORTB |=B00100000
#define D13_LOW PORTB &= B11011111
#define PIN 5 //номер аналогового порта
#define LIMIT 6 //предел погрешности сопротивления
#define CE (12) //LM7001 PIN3
#define CL (11) //LM7001 PIN4
#define DA (10) //LM7001 PIN5
// Задержка на тактах, в микросекундах
#define LM_DELAY (2)
volatile unsigned int tcnt2;
volatile byte pwm_time;
volatile int incomingByte = 0;
volatile byte bytes[] = {100};
DallasTemperature tempSensor;
byte buttons[8];
int res_dt1, res_dt, res_pwr;
int back_cam = 2;
byte cam_status=0;
int remotePin = 4;
int speakerPin = 5;
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
int StList[] = {973, 1074, 1005, 1011, 1026, 1030, 1040, 1044, 1050, 1055, 1062, 989};
byte StID = 0;
volatile long remoteCount = 0;
byte idx=0;
byte temp=0;
int tempSens = 250;
volatile boolean remoteOn=false;
unsigned long math_time,old_time,real_time, stime;
boolean lockwrite = false;
void setup()
{
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
tcnt2 = 237;
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
pinMode(remotePin, OUTPUT);
buttons[0]=255;
buttons[1]=0;
buttons[5]=0;
buttons[6]=0;
buttons[7]=0;
buttons[4]=0;
Serial.begin(115200);
tempSensor.begin(4);
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DA, OUTPUT);
pinMode(back_cam, INPUT); //камера ЗХ
pinMode(speakerPin, OUTPUT); //спикер
digitalWrite(2, HIGH);
// Да будет радио сразу!
delay(500);
byte lA=0;
byte hA=0;
word f;
hA=EEPROM.read(0);
lA=EEPROM.read(1);
// Serial.println(lowByte(f), DEC);
//Serial.println(highByte(f), DEC);
// Serial.println(f, DEC); Serial.println(f, DEC);
f=word(hA, lA);
int fint=f;
//Serial.println(f, DEC);
delay(3000);
if ((lA>0) || (hA>0)) SetRF(fint); else SetRF(973);
}
void cam()
{
temp=digitalRead(back_cam);
if(temp==HIGH && cam_status==0)
{
//clear_buf();
delay(500);
if (digitalRead(back_cam) != HIGH) return;
cam_status=255;
buttons[6]=111;
Serial.write( buttons,8);
delay(10);
buttons[6]=0;
Serial.write( buttons,8);
//Serial.println("on");
}
if(temp==LOW && cam_status==255)
{
//clear_buf();
cam_status=0;
buttons[6]=110;
Serial.write( buttons,8);
delay(10);
buttons[6]=0;
Serial.write( buttons,8);
//Serial.println("off");
}
}
void Notify(byte Note)
{
for (int j=0;j<=8;j++) { // проверяем - это нота?
if (names[j] == Note) { // ага - нота!
for( int i=0; i<50; i++ ) { // проигрываем ноту 50 раз
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tones[j]);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tones[j]);
}
}
}
}
void ReadTemp()
{
switch(tempSensor.isValid())
{
case 1:
//Serial.println("Invalid CRC");
buttons[2]=111; tempSens = 60;
tempSensor.reset(); // сбросить девайс
return;
case 2:
//Serial.println("Invalid device");
buttons[2]=111;
tempSens = 60;
tempSensor.reset(); // сбросить девайс
return;
}
tempSens = tempSensor.getTemperature();
buttons[2]=tempSens;
}
void bc(boolean fwd) // Загадочная функция :) Листает список радиостанций
{
if (fwd)
{
if (StID < 11) {StID++; SetRF(StList[StID]);} else {StID=0; SetRF(StList[0]);}
}
else
{
if (StID > 0)
{
StID--; SetRF(StList[StID]);
}
else
{
if (StID==0)
{
StID=11; SetRF(StList[StID]);
}
}
}
delay(500);
}
void RadioCmd()
{
int inRF;
byte p[3];
int t;
// Длина команды 8 байт, формат:
// rfXXXXX<cr>
t = Serial.available();
if (t >= 9)
{
p[0] = Serial.read();
p[1] = Serial.read();
p[2] = Serial.read();
if ( p[0]=='r' and p[1]=='f' and p[2]=='s')
{
inRF = 1;
for (int x=3; x>=0; x--)
{
inRF += (int(Serial.read())-48) * pow(10, x);
}
Serial.flush();
if (inRF >= 875 and inRF <= 1080) {SetRF(inRF);}
}
if ( p[0]=='r' and p[1]=='f' and p[2]=='n')
{
bc(true);
}
if ( p[0]=='r' and p[1]=='f' and p[2]=='p')
{
bc(false);
}
}
else
{
if (t > 0) {Serial.flush();}
}
delay(100);
}
void voltmetr()
{
res_pwr = analogRead(1)/4;
buttons[1]=res_pwr;
}
void autolight()
{
byte light;
int sens = analogRead(0)/4;
buttons[3] = sens;
}
void joystik()
{
res_dt = analogRead(5); // прочитать данные АЦП
int tmp =0;
if (res_dt > 1000) return;
{
delay(30); // пауза для проверки дребезга
tmp = analogRead(5);
if(((res_dt - LIMIT) <= tmp) && ((res_dt + LIMIT)>=tmp) ) //если нет дребезга
{
buttons[0]=0;
switch (res_dt/4)
{
case 212: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 213: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 214: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 211: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 215: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 245:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 246:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 247:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 244:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 232: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 231: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 233: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 234: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 235: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 181: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 182: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 183: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 184: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 185: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 0: buttons[0]=11; Serial.write(buttons,8); bc(false); Notify('a'); break;
}
delay(50); // Пауза между нажатиями
}
}
}
void loop()
{
joystik(); //return;
RadioCmd();
if ((millis()-stime)>2000) //запуск процедур по таймеру
{
stime = millis();
autolight();
cam();
ReadTemp();
voltmetr();
buttons[0]=0;
Serial.write(buttons,8);
}
}
//****************обработчик прерывания********************
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2;
remoteCount++;
if (remoteCount > 100000)
{
remoteOn = false;
remoteCount = 0;
}
if (tempSens==85) {bytes[0]=100; buttons[4]=50;}
else
{
if (tempSens <= 30) {bytes[0]=30;buttons[4]=10;}
if ((tempSens > 30) && (tempSens <= 40)) {bytes[0]=50; buttons[4]=25;}
if ((tempSens > 40) && (tempSens <= 50)) {bytes[0]=100;buttons[4]=45;}
if ((tempSens > 50) && (tempSens <= 60)) {bytes[0]=150;buttons[4]=60;}
if ((tempSens > 60) && (tempSens <= 70)) {bytes[0]=200;buttons[4]=80;}
if (tempSens > 70) {bytes[0]=250;buttons[4]=100;}
}
pwm_time++;
if(bytes[0] > pwm_time) D13_High; else D13_LOW;
}
//========= Устанавливаем частоту радио
void SetRF(int RF)
{
word f=word(RF);
EEPROM.write(0,highByte(RF)); EEPROM.write(1,lowByte(RF)); RF += 107;
digitalWrite(CE, HIGH);
writeToLM(byte(RF));
writeToLM(byte(RF >> 8));
writeToLM(135);
digitalWrite(CE, LOW);
}
//======== Пишем частоту в LM7001
void writeToLM(byte ByteToSend)
{
int D;
int D1;
delayMicroseconds(LM_DELAY);
for (int x=0; x<=7; x++)
{
// Выставляем DA
D = ByteToSend >> 1;
D1 = D << 1;
if (ByteToSend==D1) // Значит был 0
{
digitalWrite(DA,LOW);
}
else
{
digitalWrite(DA,HIGH);
}
// Формируем строб CL
digitalWrite(CL, HIGH);
delayMicroseconds(LM_DELAY);
digitalWrite(CL,LOW);
delayMicroseconds(LM_DELAY);
ByteToSend = ByteToSend >> 1;
}
delayMicroseconds(LM_DELAY);
}
void SendOK()
{
Serial.println("OK");
}
void SendERR()
{
Serial.println("ER");
}
кнопки оживают. Включаю процедуры по таймеру, все писец - срабатывание кнопок через раз.PHP код:joystik(); //return;
Последний раз редактировалось BlkDem; 18.05.2011 в 11:18.
Я не уверен , но по моему функция millis использует Timer2
У тебя получается инициализация таймера в setup сбрасывается этой функцией
Так оно же работает. Функции по таймеру тоже отрабатывают.
Но все равно попробую отключить прерывание.
Если попробовать избавиться от millis(), то можно ли ее заменить просто счетчиком?
PHP код:counter1++;
if (counter1==2000) //запуск процедур по таймеру
{
//stime = millis();
counter1 = 0;
autolight();
cam();
ReadTemp();
voltmetr();
buttons[0]=0;
Serial.write(buttons,8);
}
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)