Forum: Mikrocontroller und Digitale Elektronik ad wandler fehlermeldung


von Ingo L. (grobian)


Lesenswert?

Habe ein Problem:
Will ein Programm schreiben was mir den
AD Wandler ausliest..nun bekomme ich fogende Fehlermeldung:

C:\Dokumente und Einstellungen\Administrator\Eigene 
Dateien\default/../PORTAUSGABE_AVR_C.c:24: undefined reference to `sbi'

bei dem u.g. Programm..wo liegt der Fehler


#define TRUE 1
#define FALSE 0
#define F_CPU 800000UL

#include <avr/io.h>
#include <util/delay.h>


int main (void)
{
DDRA = 0xff;
DDRB = 0xff;
ADCSR = 0xc5;

while(1)

{
loop_until_bit_is_clear(ADCSR,ADSC);
PORTB = ADCL;
PORTA = ADCH;
sbi(ADCSR,ADSC);
}
}



C:\Dokumente und Einstellungen\Administrator\Eigene 
Dateien\default/../PORTAUSGABE_AVR_C.c:24: undefined reference to `sbi'

von Philipp R. (relaxxo)


Lesenswert?

"sbi" ist ein Assembler Befehl.

Schreib doch: ADCSR |= (1<<ADSC);

von Ingo L. (grobian)


Lesenswert?

uiiii..das sieht schon besser aus :-)

Anmerkung: habe das Programm aus einem Buch abgetipp..ist da etwa dem 
Autor ein Fehler unterlaufen??
Will das Buch hier nicht nennen...nur auf anfrage

Gruß Ingo

von Benedikt K. (benedikt)


Lesenswert?

Ingo Laabs wrote:
> Anmerkung: habe das Programm aus einem Buch abgetipp..ist da etwa dem
> Autor ein Fehler unterlaufen??

Nein, früher gab es diesen "Befehl" noch, mittlerweile wurde dieser 
entfernt,  um näher an den C Standards zu sein.

von Ingo L. (grobian)


Lesenswert?

und was mache ich mit dem Befehl   sei(); ?...gleich problem wie oben

bevor sich einer wunder...bin noch nicht in C fit..von daher diese 
Anfängerfragen

von Benedikt K. (benedikt)


Lesenswert?

#include <avr/interrupt.h>
Dann sollte sei() funktionieren.

von Ingo L. (grobian)


Lesenswert?

ahhhhhh..an was man nicht alles denken muß DANKE

von Benedikt K. (benedikt)


Lesenswert?

Ich schreibe generell in jedes Programm folgendes:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <util/delay.h>

Das dürfte fast alles was man auf dem µC häufig verwendet abdecken.

von Ingo L. (grobian)


Lesenswert?

verstehe aber folgende Zeile noch nicht so recht

loop_until_bit_is_clear(ADCSR,ADSC);

wo wird die definiert?

von Benedikt K. (benedikt)


Lesenswert?

In avr/sfr_defs.h (wird über #include <avr/io.h> eingebunden).

von Ingo L. (grobian)


Lesenswert?

ahhh..da

#define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit)))

/** \def loop_until_bit_is_set
    \ingroup avr_sfr

    \code #include <avr/io.h>\endcode

    Wait until bit \c bit in IO register \c sfr is set. */


gibt es irgendwo eine Beschreibung der Möglichkeiten
der Funktionen von avr/io?

von Benedikt K. (benedikt)


Lesenswert?


von Ingo L. (grobian)


Lesenswert?

Habe immer noch Probleme mit AD Wandlung
Habe LED´s an Port A und versuche ADC9 an Pin 9 vom Tiny26
zu wandeln..aber geht nicht



#define TRUE 1
#define FALSE 0
#define F_CPU 800000UL



#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <util/delay.h>


int main (void)
{
DDRA = 0xff;   // Port A = Ausgang
DDRB = 0x00;   // Port B = Eingang


ADMUX = 0x09;  //ADC9
ADCSR = 0xc5;

while(1)

{
loop_until_bit_is_clear(ADCSR,ADSC);
PORTA = ADCL;


ADCSR |= (1<<ADSC); //sbi(ADCSR,ADSC);
}
}

von Johannes M. (johnny-m)


Lesenswert?

Es macht erstens nur wenig Sinn, nur das Low-Byte des 
Wandlungsergebnisses (ADCL) zu lesen, und zweitens funktionier das genau 
einmal. Wenn ADCL gelesen wurde, muss grundsätzlich anschließend ADCH 
gelesen werden. Erst nach dem Lesezugriff auf ADCH wird das 
Ergebnisregister wieder für ein neues Ergebnis freigegeben. Wenn nur 
ADCL gelesen wird, kann der ADC kein neues Ergebnis in dem Registerpaar 
ablegen. Wenn Du nur 8 Bit vom Ergebnis haben willst, dann setze das 
Steuerbit ADLAR. Das Wandlungsergebnis wird in dem Fall linksbündig in 
den beiden Ergebnisregistern abgelegt, und es muss nur noch ADCH 
ausgelesen werden.

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.