Forum: Mikrocontroller und Digitale Elektronik 2 adc-messungen


von mysmartusb light (Gast)


Angehängte Dateien:

Lesenswert?

hallo.
ich versuche mit meinem mega32, 2 adc messungen durchzuführen.

eine einfache sieht etwa so aus:

uint16_t adc_mess(void) {
  uint16_t messwert=0;
  ADMUX |= (0<<REFS1)|(1<<REFS0)|(0<<MUX0);
  ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);

  for (uint8_t i=0; i<5; i++) {
    ADCSRA |= (1<<ADSC);
    while ( !(ADCSRA & (1<<ADIF)) )
    ;
    messwert = (ADC)+messwert;
  }
  return messwert/5;
}

das beispiel funktioniert auch...


warum aber funktioniert dieses code nicht.?

uint16_t adc_mess_1(void) {
  uint16_t messwert_1=0;
  ADMUX &= ~(1<<MUX1);
  ADMUX |= (0<<REFS1)|(1<<REFS0)|(1<<MUX0);
  ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)|(1<<ADSC);

  for (uint8_t i=0; i<5; i++) {
    ADCSRA |= (1<<ADSC);
    while ( !(ADCSRA & (1<<ADIF)) )
    ;
    messwert_1 = (ADC)+messwert_1;
  }
  return messwert_1/5;
}

uint16_t adc_mess_2(void) {
  uint16_t messwert_2=0;
  ADMUX &= ~(1<<MUX0);
  ADMUX |= (0<<REFS1)|(1<<REFS0)|(1<<MUX1);
  ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)|(1<<ADSC);

  for (uint8_t i=0; i<5; i++) {
    ADCSRA |= (1<<ADSC);
    while ( !(ADCSRA & (1<<ADIF)) )
    ;
    messwert_2 = (ADC)+messwert_2;
  }
  return messwert_2/5;
}



------------------------------------------------------------------------ 
---
------------------------------------------------------------------------ 
---
kompletter code
------------------------------------------------------------------------ 
---
------------------------------------------------------------------------ 
---


#define F_CPU 8000000UL
//#define XTAL 8000000UL

#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "lcd-routines.h"

uint16_t adc_mess_1(void) {
  uint16_t messwert_1=0;
  ADMUX &= ~(1<<MUX1);
  ADMUX |= (0<<REFS1)|(1<<REFS0)|(1<<MUX0);
  ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)|(1<<ADSC);

  for (uint8_t i=0; i<5; i++) {
    ADCSRA |= (1<<ADSC);
    while ( !(ADCSRA & (1<<ADIF)) )
    ;
    messwert_1 = (ADC)+messwert_1;
  }
  return messwert_1/5;
}

uint16_t adc_mess_2(void) {
  uint16_t messwert_2=0;
  ADMUX &= ~(1<<MUX0);
  ADMUX |= (0<<REFS1)|(1<<REFS0)|(1<<MUX1);
  ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)|(1<<ADSC);

  for (uint8_t i=0; i<5; i++) {
    ADCSRA |= (1<<ADSC);
    while ( !(ADCSRA & (1<<ADIF)) )
    ;
    messwert_2 = (ADC)+messwert_2;
  }
  return messwert_2/5;
}


int main(void)
{
  DDRA = 0xff;
  uint16_t messung_1 = 0;
  uint16_t messung_2 = 0;
  char puffer_1[16]; //[16]
  char puffer_2[16]; //[16]
  lcd_init();

  while(1) {
    messung_1 = adc_mess_1;
    messung_2 = adc_mess_2;
    itoa(messung_1 , puffer_1, 10);
    itoa(messung_2 , puffer_2, 10);

    lcd_setcursor(0,1);    lcd_string(puffer_1);
    lcd_setcursor(0,2);    lcd_string(puffer_2);
  }

  return 1;
}


ich hoffe es kann mir jmd. helfen.
danke.
mfg.: jo

von mysmartusb light (Gast)


Lesenswert?

solche Kenntnislücken hab ich oft. :D

von mysmartusb light (Gast)


Lesenswert?

leute?
kommt bitte. ist wegen eim englisch projekt.

von Bernhard S. (b_spitzer)


Lesenswert?

Fehler beim Funktionsaufruf:
 while(1) {
    messung_1 = adc_mess_1;
    messung_2 = adc_mess_2;

hier fehlen Klammern:
 while(1) {
    messung_1 = adc_mess_1();
    messung_2 = adc_mess_2();

unn wech
B.

von mysmartusb light (Gast)


Lesenswert?

vielen dank. funktioniert ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.