UART macht probleme

Gast #432325
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?
Gast #432347
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!
Gast #432390
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 :-(
Gast #432396
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren