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?
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!
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 :-(
# 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.