mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ad wandler fehlermeldung


Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Philipp R. (relaxxo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"sbi" ist ein Assembler Befehl.

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

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/interrupt.h>
Dann sollte sei() funktionieren.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhhhhh..an was man nicht alles denken muß DANKE

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
verstehe aber folgende Zeile noch nicht so recht

loop_until_bit_is_clear(ADCSR,ADSC);

wo wird die definiert?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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);
}
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.