www.mikrocontroller.net

Forum: Compiler & IDEs UART macht probleme


Autor: Einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich fange gerade erst an mich mit C zu befassen und wollte nun mal etwas 
mit UART probieren, dazu habe ich im Internet folgenden Quellcode 
gefunden:

/*********************************************************************** 
*****
    UART.c
    ------
    Übungsprojekt zum Empfang von Daten mit dem UART.
    Eine LED an Pin 0 von Port B soll gesteuert werden beim Empfang 
folgender
    Zeichen:
        '1' - LED ein.
        '0' - LED aus.


    Autor:    Christian Schifferle
    Datum:    November 2002
    Software: AVR-GCC
    needed
************************************************************************ 
****/

#include <io.h>  // Wir brauchen Zugriff auf die I/O's des Controllers

#define F_CPU            8000000      /* 8Mhz */
#define UART_BAUD_RATE      9600      /* 9600 baud */

// Berechnung des Inhalts des UBBR-Registers
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

// Datentypdefinitionen
typedef unsigned char  BYTE;
typedef unsigned short  WORD;



int main (void)
/*********************************************************************** 
*****
    Hier ist der Programmeinstiegspunkt.
*/
{
    /* UART Control Register laden. Wir verwenden (noch)
       keine Interrupts. Hier wollen wir nur empfangen, also wird
       nur das Receiver Enable Flag gesetzt. */
    outp ((1 << RXEN), UCR);

    /* Baudrate einstellen */
    outp ((BYTE) UART_BAUD_SELECT, UBRR);


    // Port B als Ausgang konfigurieren
    outp (0xff, DDRB);

    // Hier machen wir einmal etwas anderes zur Realisierung der
    // Endlosschleife. Wir setzen zu Beginn der Schleife ein Label.
    // Am Schleifenende springen wir direkt zu diesem Label.
    // Nicht schön, aber unheimlich schnell.
LOOP:
    // Prüfen, ob ein Zeichen empfangen wurde.

    if (inp (USR) & (1 << RXC)) {     // Bit RXC im USR gesetzt ?
        switch (inp (UDR)) {          // Datenregister auslesen
            case '1': // LED einschalten
                sbi (PORTB, PINB0);
                break;
            case '0': // LED ausschalten
                cbi (PORTB, PINB0);
                break;
            default:  // Bei allen anderen Zeichen nichts tun
                break;
    }
}

goto LOOP;

} /* end of main */


Leider kriege ich wenn ich auf Build klicke folgende Meldungen:

rm -rf uart.o  uart.elf dep/ uart.hex uart.eep
Build succeeded with 0 Warnings...
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2   -DF_CPU=8000000000  -O0 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums 
-Wp,-M,-MP,-MT,uart.o,-MF,dep/uart.o.d  -c  ../uart.c
../uart.c:17:70: io.h: No such file or directory
../uart.c: In function `main':
../uart.c:39: warning: implicit declaration of function `outp'
../uart.c:39: error: `RXEN' undeclared (first use in this function)
../uart.c:39: error: (Each undeclared identifier is reported only once
../uart.c:39: error: for each function it appears in.)
../uart.c:39: error: `UCR' undeclared (first use in this function)
../uart.c:42: error: `UBRR' undeclared (first use in this function)
../uart.c:46: error: `DDRB' undeclared (first use in this function)
../uart.c:55: warning: implicit declaration of function `inp'
../uart.c:55: error: `USR' undeclared (first use in this function)
../uart.c:55: error: `RXC' undeclared (first use in this function)
../uart.c:56: error: `UDR' undeclared (first use in this function)
../uart.c:58: warning: implicit declaration of function `sbi'
../uart.c:58: error: `PORTB' undeclared (first use in this function)
../uart.c:58: error: `PINB0' undeclared (first use in this function)
../uart.c:61: warning: implicit declaration of function `cbi'
make: *** [uart.o] Error 1
Build failed with 12 errors and 4 warnings...


Leider weiß ich nicht woran das liegt...hat evtl. jemand einen Tipp für 
mich?

Autor: Stephan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann gar nicht gehen:

1. #include <io.h> --> #include <avr/io.h>
2. outp und inp gibts nicht mehr. Der Source ist schon ein bisschen 
angestaubt.
3. Die F_CPU-Angabe im Makefile kann auch nicht stimmen.

Hier der korrigierte Source (untestet):

/*********************************************************************** 
*****
    UART.c
    ------
    Übungsprojekt zum Empfang von Daten mit dem UART.
    Eine LED an Pin 0 von Port B soll gesteuert werden beim Empfang
folgender
    Zeichen:
        '1' - LED ein.
        '0' - LED aus.


    Autor:    Christian Schifferle
    Datum:    November 2002
    Software: AVR-GCC
    needed
************************************************************************ 
****/

#include <avr/io.h>  // Wir brauchen Zugriff auf die I/O's des 
Controllers

#define F_CPU            8000000      /* 8Mhz */
#define UART_BAUD_RATE      9600      /* 9600 baud */

// Berechnung des Inhalts des UBBR-Registers
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

// Datentypdefinitionen
typedef unsigned char  BYTE;
typedef unsigned short  WORD;



int main (void)
/*********************************************************************** 
*****
    Hier ist der Programmeinstiegspunkt.
*/
{
    /* UART Control Register laden. Wir verwenden (noch)
       keine Interrupts. Hier wollen wir nur empfangen, also wird
       nur das Receiver Enable Flag gesetzt. */
    //outp ((1 << RXEN), UCR);
    UCR |= 1<<RXEN;

    /* Baudrate einstellen */
    //outp ((BYTE) UART_BAUD_SELECT, UBRR);
    UBRR = UART_BAUD_SELECT;

    // Port B als Ausgang konfigurieren
    //outp (0xff, DDRB);
    DDRB = 0xff;

    //LOOP:

    while(1) {
    // Prüfen, ob ein Zeichen empfangen wurde.

    if (USR & (1 << RXC)) {     // Bit RXC im USR gesetzt ?
        switch (UDR) {          // Datenregister auslesen
            case '1': // LED einschalten
                //sbi (PORTB, PINB0);
                PORTB |= 1<<PINB0;
                break;
            case '0': // LED ausschalten
                //cbi (PORTB, PINB0);
                PORTB & = ~ (1<<PINB0);
                break;
            default:  // Bei allen anderen Zeichen nichts tun
                break;
    }

    }
}

//goto LOOP;
// Goto geht schon mal gar nicht!

Autor: Einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

schonmal danke für die Hilfe, die meisten Fehler sind jetzt weg, leider 
sind da immer noch zwei

Build started 30.10.2006 at 20:56:59
makefile:39: /avrfreaks/avr_make: No such file or directory
make: *** No rule to make target `/avrfreaks/avr_make'.  Stop.
Build failed with 2 errors and 0 warnings...


Mit denen ich nichts anfangen kann :-(

Autor: Stephan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Makefile wäre auch noch interessant.

Autor: Einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
# Makefile für die Übung Empfangen mit dem UART.
# (c) Christian Schifferle Oktober 2002


#Hier muss der verwendete AVR-Controller eingetragen werden
#(at90s8515, at90s8535, attiny22, atmega603 etc.).
    MCU = atmega8

#Hier wird die Zieldatei definiert (ohne Namenserweiterung).
  TRG  = UART

#Hier kommen die Quelldateien hin, wobei auf bereits definierte
#Symbole zugegriffen werden kann.
  SRC  = $(TRG).c

#Wenn zusätzlich Assembler-Codedateien eingebunden werden sollen
#müssen diese hier angegeben werden.
  ASRC    =

#Ebenso kann mit zusätzlichen Bibliotheks- und Objektdateien verfahren
#werden.
  LIB  =

#Und auch zusätzliche Include-Dateien
  INC  =

#Hier definieren wir Einstellungen (Flags) für den Assembler,
  ASFLAGS = -Wa, -gstabs

#den Compiler
  CPFLAGS  = -g  -Os -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst)

#und den Linker
  LDFLAGS = -Wl,-Map=$(TRG).map,--cref


########### Die folgende Zeile sollte nicht geändert werden 
#############
########### Hier werden die Systemdateien integriert 
#############
include $(AVR)/avrfreaks/avr_make

###### Hier werden die Abhängigkeiten definiert 
###################
$(TRG).o : $(TRG).c

Autor: Stephan S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
include $(AVR)/avrfreaks/avr_make

Die Datei geht ab.

Ich würde dir empfehlen, dich erst einmal mit avr-gcc und den Makefiles 
zu beschäftigen:

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Du kannst auch das Beispielmakefile vom WinAVR-GCC verwenden. Mit 
kleinen Anpassungen versteht sich.

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.