Forum: Mikrocontroller und Digitale Elektronik undefined reference to.


von Peter (Gast)


Lesenswert?

Hallo zusammen,

bin neu bei AVr-Studio 5 und habe ein Problem. Ich möchte eine AD 
Wandlung durchführen.

Hier der Quelltext:

#define F_CPU 1000000


#include <avr/io.h>


void ADC_Init();



int main (void) {

  uint16_t adcval;



   DDRB  = (0 << DDB0);
   DDRD =  (1 << DDB5)| (1 << DDB6) ;

   while(1) {
     adcval = ADC_Read(0);  // Kanal 0
    if (adcval> 500)
    {
      PORTD = (1<<PB5)|(0<<PB6);
    }
    else
    {
      PORTD = (0<<PB5)|(1<<PB6);
    }
   }


   return 0;

uint16_t ADC_Read (uint16_t channel)
{

  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); //Kanal auswählen
  ADCSRA |= (1<<ADSC);            // Wandlung ausführen
  while (ADCSRA & (1<<ADSC) ) {}  // Auf Ergebnis warten
  return ADCW;                    // Wert auslesen und zurückgeben
}



Fehlermeldung lautet "undefined reference to 'ADC_Read'

Den Text hab ich aus dem mikrocontroller ADC-Tutorial.

Vielen Dank schon mal :)

von Peter (Gast)


Lesenswert?

sry, nur die hälfte kopiert :-/


 void ADC_Init(void)
{

  uint16_t result;


  ADMUX = (1<<REFS1) | (1<<REFS0);     // Referenz einstellen, hier 
intern
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren

 //ADC-Wandlung durchführen, zwecks "Einpendeln"

  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
  while (ADCSRA & (1<<ADSC) ) {}        // auf Abschluss der 
Konvertierung warten
  result = ADCW;            //Wandlung auslesen
}

 }

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Du hast 'ne Klammer vergessen. Die, die main() schließt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Und bei Vorwärtsreferenzen macht sich ein Prototyp sehr gut.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Peter schrieb:
> sry, nur die hälfte kopiert :-/

Die Klammer muß zu main(). Die letzte ...

So definierst Du irgendwas innerhalb der Funktion main(), klar
kann das der Compiler nicht auflösen.

von Peter (Gast)


Lesenswert?

Alles klar, hat geklappt

von Lutz (Gast)


Lesenswert?

Peter schrieb:
> if (adcval> 500)
>     {
>       PORTD = (1<<PB5)|(0<<PB6);
>     }
>     else
>     {
>       PORTD = (0<<PB5)|(1<<PB6);
>     }

Bist du sicher, daß das immer das macht, was du vor hast? In diesem 
konkreten Fall schon; du könntest im else-Zweig auch einfach
PORTD = 0;
schreiben. Eine Null schieben macht meistens nicht das, was beabsichtigt 
ist. Spätestens, wenn noch andere Pins an PORTD gleichzeitig für andere 
Sachen benutzt werden, wirst du dich wundern.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ausg.C3.A4nge
http://www.mikrocontroller.net/articles/Bitmanipulation

von datenschützer (Gast)


Lesenswert?

Lutz schrieb:
> du könntest im else-Zweig auch einfach PORTD = 0; schreiben
Einspruch:
 PORTD = (0<<PB5)|(1<<PB6);
                  ^^^^^^^^^

von Lutz (Gast)


Lesenswert?

datenschützer schrieb:
> Einspruch:
>  PORTD = (0<<PB5)|(1<<PB6);
>                   ^^^^^^^^^

Einspruch stattgegeben, da Tomaten auf den Augen!!!

Ist aber auch eine sehr unsauber geschriebene 1; vielleicht schwanger 
und daher schon etwas ausladend und schon etwas in den Bereich 0 
übergehend ...;-)

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.