Ich arbeite zur Zeit fürs Studium an einem Projekt das die Programmierung eines AVR Chips beinhaltet. Genauer gesagt neutzen wir den AT90s8515 Habe miir also WinAVR heruntergeladen, installiert und soweit konfiguriert. Wenn ich nun jedoch im "Programmers Notepad" Make all wähle (nach ReadMe einegrichtet) Meldet der Compiler das Gerätetyp für io.h fehlt. Im Makefile steht er jedoch drin: ... # MCU name MCU = at90s8515 ... Wenn ich mir den Quelltext von der io.h ansehe steht da drin .... #elif defined (_AVR_AT90S8515_) # include <avr/io8515.h> .... Muss ich den Chip irgendwie noch im Quelltext des Programms definieren oder habe ich den Typ falsch deklariert? Was kann da falsch sein? Benutze STK500 mit at90s8515. Programmiere mit WinAVR (Version vom 13.09.2003) Bin für jede Antwort dankbar. MfG. S. Oliver
Wird denn der MCU-Macro Deines Makefiles auch wirklich in der Kommandozeile des Compilers ausgewertet? Ggf. <Eigenwerbung> http://www.sax.de/~joerg/Mfile/ </Eigenwerbung> benutzen.
Also im Output Fenster steht: Fehler des Quelltextes sind beabsichtigt arbeite mich gerade durch das winavr tutorial von avrfraks ... avr-gcc -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test1.lst -std=gnu99 -Wl,-Map=test1.map,--cref -lm test1.c -o test1 In file included from test1.c:1: C:/WinAVR/avr/include/avr/io.h:225:6: warning: #warning "device type not defined" test1.c:4: warning: function declaration isn't a prototype test1.c:4: warning: return type of `main' is not `int' test1.c: In function `main': test1.c:7: error: `DDRB' undeclared (first use in this function) test1.c:7: error: (Each undeclared identifier is reported only once test1.c:7: error: for each function it appears in.) test1.c:11: error: `PORTB' undeclared (first use in this function) test1.c:30: warning: `return' with a value, in function returning void make: *** [test1] Error 1 ... Werde gleich mal dein Tool ausprobieren. Die URL muss übrigens .../mfile/ sein und nicht Mfile. Aber ich bin schon drauf gekommen. Aber sowas hält das Hirn zum Denken an *g
> Also im Output Fenster steht: ... Tja, da ist kein -mmcu=at90s8515 dabei. Du hast wohl $(CFLAGS) genommen, Erics Template arbeitet aber mit $(ALL_CFLAGS). Diese beiden Macros unterscheiden sich just um die Angabe von -mmcu=$(MCU). > Die URL muss übrigens .../mfile/ sein und nicht Mfile. Ja, sorry, hatte ich mir lfasch gemerkt.
Erstmal ein goßes Danke. Schient alles zu funktionieren. Aber das Programm was ich in der Uni geschrieben habe funktioniert leider nicht. Was komisch ist weil der Quelltext derselbe ist unt der gcc compiler des linux rechners in der uni nicht meckert. Auch ich sehe kein Fehler. mein Quelltext: ...... #include <io.h> // Zugriff auf die I/O's des Controllers #define F_CPU 3600000 /* 3,6 Mhz */ #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; // Globale Variablen char ch; // Variable zur Speicherung des gelesenen Zeichens int main (void) { /* UART Control Register laden. Wir verwenden (noch) keine Interrupts. Vorerst wollen wir nur mal senden, also wird nur das Transmitter Enable Flag gesetzt. */ outp ((1 << RXEN) | (1 << TXEN), UCR); /* Baudrate einstellen */ outp ((BYTE) UART_BAUD_SELECT, UBRR); outp (0xff,DDRC); // Port B als Ausgang while (1) { // Endlosschleife if (inp (USR) & (1 << RXC)) { // Bit RXC im USR gesetzt ? ch = inp (UDR); // Datenregister auslesen } outp ( ch , UDR); outp (255-ch,PORTC); } } Ich habe von das MFile Tool von dir benutzt um das Makefile zu erstellen. Großartiges Programm. Tut genau das was es soll. Habe also darin einfach den MCU geändert und das Target angepasst. Aber im Output Fenster stehen folgende Fehler: Compiling: senden.c avr-gcc -c -mmcu=atmega128 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=senden.lst -std=gnu99 -Wp,-M,-MP,-MT,senden.o,-MF,.dep/senden.o.d senden.c -o senden.o senden.c: In function `main': senden.c:21: error: `UCR' undeclared (first use in this function) senden.c:21: error: (Each undeclared identifier is reported only once senden.c:21: error: for each function it appears in.) senden.c:24: error: `UBRR' undeclared (first use in this function) senden.c:29: error: `USR' undeclared (first use in this function) senden.c:30: error: `UDR' undeclared (first use in this function) make: *** [senden.o] Error 1 Da ich mir nur vorstellen kann das das Makefile schuld ist. Weil der Quelltext in der Uni funktioniert, wolte ich dich also nochmals um Rat fragen. MfG.S. Oliver
Erstmal diverse Kleinigkeiten: > #include <io.h> #include <avr/io.h> bitte. Alle AVR-spezifischen includes haben wir in das Unterverzeichnis avr verschoben. Im toplevel sollten nur noch die benutzt werden, die durch irgendeinen Standard (C89, C99, Posix, ...) bekannt sind. > typedef unsigned char BYTE; Die übliche Konvention ist, GROSSBUCHSTABEN nur für Präprozessor- Makros zu benutzen. > outp ((1 << RXEN) | (1 << TXEN), UCR); inp()/outp() sind `deprecated'. UCR = (1 << RXEN) | (1 << TXEN); Wenn es nicht portabel sein muß, kannst Du auch den _BV-Makro der avr-libc nehmen: UCR = _BV(RXEN) | _BV(TXEN); Sieht (meiner Meinung nach) ein wenig übersichtlicher aus. > Großartiges Programm. Tut genau das was es soll. Danke. Genau dafür ist es ja auch geschrieben. ;-) Es sollte ausdrücklich keine eierlegende Wollmilchsau werden, sondern halt exakt diese eine Aufgabe erfüllen. > ... -mmcu=atmega128 ... > senden.c:21: error: `UCR' undeclared (first use in this function) Verschiedene AVRs, verschiedene Registernamen. :-( Sieh mal ins Datenblatt, wie diese beim ATmega128 heißen. Das fängt ja schon damit an, daß der M128 zwei USARTs hat und nicht nur eine. Weiterhin hat er pro USART nicht nur ein, sondern zwei control und status registers (UCSRnA/B) sowie ein in low und high geteiltes Baudratenregister (wobei Du den High-Teil für ,,gewöhnliche'' Datenraten ignorieren kannst). Du kannst Dir dann mit einem Konstrukt helfen wie: #if defined(_ATmega128_) ... #define UDR UDR0 ... #endif
Juju. Hat alles geklappt. Danke für die Hinweise mit dem Quelltext. Werde versuchen mich zu bessern und näher an den Konventionen zu arbeiten. Aber ich bin ja jetzt echt froh das das jetzt alles klappt. Endlich kann ich mal mein STK 500 in "Action" sehen. Nochmals Danke für deine Hilfe. MfG.S. Oliver P.S. Werde jetzt noch kurz mit Interruots beschäftigen bevor ich ins Bett geh...
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.