Как опросит два аналоговых датчиков

Yer
Offline
Зарегистрирован: 12.02.2016
char val2;

ISR (ADC_vect)
{  
	ACP=ADCW;
	ADCSRA |=(1<<ADSC);
	}		
int main(void)
{      DDRC &=~(1<<PC1);

    ADCSRA |=(1<<ADEN)
	//разрешение использование АЦП
    |(1<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);//4 delim
	ADMUX |=(1<<REFS0)//подключили к 5В
	|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);//arduino A1
	ADCSRA |=(1<<ADSC);

val2=(ACP>>2);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, кусок кода, и чо? Вопрос-то в чём?

Yer
Offline
Зарегистрирован: 12.02.2016

Опрос идет только по MUX0 А1 в ардуино, теперь одновременно опросить второй вход (А2) ардуино 

 

Yer
Offline
Зарегистрирован: 12.02.2016

пробовал вот так но не получается читать два аналоговых сигналов

ISR (ADC_vect)
{  
	ACP=ADCW;
	ADCSRA |=(1<<ADSC);
	if (sel_chanel == 100)
	{val=(ACP>>2)/2;
	 eeprom_update_byte(1,val);	
	sel_chanel=0;	
    }
	sel_chanel++;
	}		
int main(void)
{   DDRC &=~(1<<PC1);
	DDRB |=(1<<PB5);
	PORTB &=~(1<<PB5);
    ADCSRA |=(1<<ADEN)
	//разрешение использование АЦП
    |(1<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);//4 delim
	ADMUX |=(1<<REFS0)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);;//подключили к 5В
	//arduino A1
	ADCSRA |=(1<<ADSC);
    while(1)
    {
         cli();
		 
		 if (sel_chanel < 100)
		 {
			 ADMUX |=(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);
			 ADMUX &=~(1<<MUX2);
		 val2=(ACP>>2)/2;
		 eeprom_update_byte(0,val2);
		 }		  
		  if (sel_chanel == 100)
		  {ADMUX &=~(1<<MUX1);
		   ADMUX |=(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(0<<MUX0);	  
		  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чем Вас не устраивает analogRead и среда Arduino?

Yer
Offline
Зарегистрирован: 12.02.2016

Мне легче писать на си в среде атмел студио

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, раз Вам легче написать прямую работу с АЦП вместо одной строчки analogRead, то пишите.

А мне показалось (по этой теме), что Вы просто не умеете этого делать. Наверное, я ошибся.

Yer
Offline
Зарегистрирован: 12.02.2016

Ну вы тогда по пробуйте написать в атмел студио analogRead

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Yer пишет:

Ну вы тогда по пробуйте написать в атмел студио analogRead

Двумя постами ранее Вы утверждали, что это легче, чем в Arduino IDE.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Yer пишет:
Опрос идет только по MUX0 А1 в ардуино, теперь одновременно опросить второй вход (А2) ардуино
Одновременно невозможно сделать.Только последовательно. Сначала один, а потом второй. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Yer пишет:

Ну вы тогда по пробуйте написать в атмел студио analogRead

Да, где уж мне?!? Я же не говорил, что мне легче в студии писать :))))

Это Вы сказали, что Вам легче писать в студии, ну, а раз легче, то пишите на здоровье :)))))

Yer
Offline
Зарегистрирован: 12.02.2016

Не подскажите как опрашивать последовательно что то у меня не получается

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте вот так на 4 аналога, а вообще здесь была тема и на 2 

volatile int data0;
volatile int data1;
volatile int data2;
volatile int data3;
float V0;
float V1;
float V2;
float V3;
unsigned long time;

void setup() {
  Serial.begin(9600);
  DDRC = B000000; // назначает выводы с 14 по 19 входными
  PORTC = B000000; // устанавливает HIGH на выводах с 14 по 19 (на 19 LOW)
  //OCR0A=0xAF;
  //TIMSK0|=1<<OCIE0A;
  ADMUX = 1 << REFS0; // AVCC with external capacitor at AREF pin
  ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  ADCSRB = (0 << ADTS1) | (0 << ADTS0); // Можно закоментировать
}

void taime() {
  ADCSRA |= (1 << ADSC); // Запускаем преобразование
  static uint8_t analog = 0;
  Serial.println(analog);
  time = micros();
  ADMUX = ADMUX & 0b11111000 | analog;
  switch (analog) {
    case 0:
      data3 = ADC;
      ++analog;
      break;
    case 1:
      data0 = ADC;
      ++analog;
      break;
    case 2:
      data1 = ADC;
      ++analog;
      break;
    case 3:
      data2 = ADC;
      analog = 0;
      break;
  }
  time = (micros() - time);
}

void loop() {
  taime();
  V0 = (float) data0 * 0.0047031; // Переводим в вольты
  V1 = (float) data1 * 0.0047031; // Переводим в вольты
  V2 = (float) data2 * 0.0047031; // Переводим в вольты
  V3 = (float) data3 * 0.0047031; // Переводим в вольты
  // 0.0047031 = Vcc / 1024

  Serial.print("A0 = "); Serial.print(V0, 3); Serial.println(" V ");
  Serial.print("A1 = "); Serial.print(V1, 3); Serial.println(" V ");
  Serial.print("A2 = "); Serial.print(V2, 3); Serial.println(" V ");
  Serial.print("A3 = "); Serial.print(V3, 3); Serial.println(" V ");
  Serial.print("T = "); Serial.print(time); Serial.println(" mks");
  delay (50);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Yer пишет:
Не подскажите как опрашивать последовательно что то у меня не получается

стр 84 в http://nonlinmod.sgu.ru/doc/doc2014_12.pdf   я не проверял.

пс:

/**/
void anInit(void) {
  ADMUX = (1 << REFS0);
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
int anRead(unsigned char Channel) {
  ADMUX = (1 << REFS0) | (1 << ADLAR) | Channel;
  ADCSRA |= (1 << ADSC);
  while (ADCSRA & (1 << ADSC));
  return ADC;
}

int main(void) {
  init();
  //setup()
  Serial.begin(9600);
  anInit();
  while (1) {
    delay(100);
    Serial.println();
    Serial.print(anRead(0));
    Serial.print(" ");
    Serial.print(anRead(1));
  }
  return 0;
}
/*Скетч использует 1952 байт (6%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт.
*/

ППС:http://forum.arduino.ua/viewtopic.php?id=1071

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Yer пишет:
Ну вы тогда по пробуйте написать в атмел студио analogRead

Что там пробовать...