Forum: Compiler & IDEs UART macht probleme


von Einsteiger (Gast)


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?

von Stephan S. (Gast)


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!

von Einsteiger (Gast)


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 :-(

von Stephan S. (Gast)


Lesenswert?

Dein Makefile wäre auch noch interessant.

von Einsteiger (Gast)


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

von Stephan S. (Gast)


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-Tutorial#Exkurs:_Makefiles

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

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.