Hast Du den Prozessortyp im makefile richtig gesetzt? Ansonsten werden die #defines in io.h nicht richtig abgearbeitet.
Hi,
Ich möchte mit meinem Atmega128 daten zum Pc senden und zwar über die RS232 schnitte.
Jetzt habe ich im Datenblatt nachgelesen wie das geht und diese Source samples in mein Programm eingebaut aber ständig kommt beim compilieren das die usart variablen "first use in this function" sind. kann mir da jemand weiterhelfen? ich habe als include dateien avr/io.h und string.h.
mein code sieht also so aus:
Danke schonmal für eure hilfreichen AntwortenCode:#include <avr/io.h> #include <string.h> void USART_Init (unsigned int baud) { /* Set baud rate */ UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; /* Enable reciever and transmitter */ UCSRB = (1<<RXEN)|(1<<Txen); /* Set frame format: 8data, 2stop bit*/ UCSRC = (1<<USBS)|(3<<UCSZ0=; } void USART_Transmit (unsigned char data) { /* Wait for empty transmit buffer */ while(!(UCSRA & (1<<UDRE))) ; /* Put data into buffer, sends the data '/ UDR = data; } unsigned char USART_Recieve(void) { /* Wait for data to be recieved */ while (!(UCSRA & (1<<RXC))) ; /* Get and return recieved data from buffer */ return UDR; }![]()
MFG DanielSan
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Hast Du den Prozessortyp im makefile richtig gesetzt? Ansonsten werden die #defines in io.h nicht richtig abgearbeitet.
Ich programmiere ihn mit AVR studio. Das Problem tritt ja schon beim compilieren auf, nicht erst wenn ich das prog im prozessor habe.
MFG
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Wenn Du den Prozessortyp (auch im AVR-Studio) nicht richtig setzt, werden die #defines in io.h bei der Auswertung nicht zum richtigen Ergebnis führen:
Dann bekommst Du die Fehlermeldung.Code:#elif defined (__AVR_ATmega128__)
Also in meiner configuration steht das ich den mega128 mit 16Mhz eingestellt habe. Und als fehlermeldungkommt:
rm -rf usart.o usart.elf dep/ usart.hex usart.eep
Build succeeded with 0 Warnings...
avr-gcc -mmcu=atmega128 -Wall -gdwarf-2 -DF_CPU=16000000 -O0 -fsigned-char -Wp,-M,-MP,-MT,usart.o,-MF,dep/usart.o.d -c ../usart.c
../usart.c: In function `__vector_1':
../usart.c:45: error: `GICR' undeclared (first use in this function)
../usart.c:45: error: (Each undeclared identifier is reported only once
../usart.c:45: error: for each function it appears in.)
../usart.c: In function `__vector_16':
../usart.c:102: error: `GIFR' undeclared (first use in this function)
../usart.c:103: error: `GICR' undeclared (first use in this function)
../usart.c: In function `main':
../usart.c:181: error: `UCSRA' undeclared (first use in this function)
../usart.c:182: error: `UCSRB' undeclared (first use in this function)
../usart.c:189: error: `GIFR' undeclared (first use in this function)
../usart.c:190: error: `GICR' undeclared (first use in this function)
make: *** [usart.o] Error 1
Build failed with 9 errors and 0 warnings...
Ich hoffe das hilft dir weiter um mir zu helfen
MFG DanielSan[/img]
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
kann er ja auch nicht finden, weil der Mega 128 die Register nicht besitzt. Wie kommt man darauf:
In der Installation des WinAVR unter
avr\include\avr\iom128.h nachschauen und nach den Namen suchen: Kein Treffer.
Warum ist das so?
Der 128 hat zwei serielle Schnittstellen, damit heissen die seriellen Register: UCSR0A und UCSR0B bzw. UCSR1A und UCSR1B, etc.
GICR und GIFR scheinen Interruptregister zu sein. Auf jeden Fall ist der Code den Du da hast nicht für den Mega128 geschrieben worden. Welche Bedeutung die Register haben musst Du im Datenblatt des Chips nachlesen , für den der Code ursprünglich war und dann durch die entsprechenden Register - sofern vorhanden - des 128 ersetzen.
ok diese programm ist für den mega128 zumindest habe ich diesen code aus dem datenblatt des mega128.
Code:#include <inttypes.h> #include <avr/io.h> #include <avr/signal.h> #include <string.h> void USART_Init (unsigned int baud) { /* Set baud rate */ UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; /* Enable reciever and transmitter */ UCSRB = (1<<RXEN)|(1<<Txen); /* Set frame format: 8data, 2stop bit*/ UCSRC = (1<<USBS)|(3<<UCSZ0=; } void USART_Transmit (unsigned char data) { /* Wait for empty transmit buffer */ while(!(UCSRA & (1<<UDRE))) ; /* Put data into buffer, sends the data '/ UDR = data; } unsigned char USART_Recieve(void) { /* Wait for data to be recieved */ while (!(UCSRA & (1<<RXC))) ; /* Get and return recieved data from buffer */ return UDR; }
und wenn ich das compile kommen folgende fehlermeldungen:
Build started 7.2.2006 at 11:14:26
avr-gcc -mmcu=atmega128 -Wall -gdwarf-2 -DF_CPU=16000000 -O0 -fsigned-char -Wp,-M,-MP,-MT,usart.o,-MF,dep/usart.o.d -c ../usart.c
../usart.c: In function `USART_Init':
../usart.c:11: error: `UBRRH' undeclared (first use in this function)
../usart.c:11: error: (Each undeclared identifier is reported only once
../usart.c:11: error: for each function it appears in.)
../usart.c:12: error: `UBRRL' undeclared (first use in this function)
../usart.c:14: error: `UCSRB' undeclared (first use in this function)
../usart.c:14: error: `Txen' undeclared (first use in this function)
../usart.c:16: error: `UCSRC' undeclared (first use in this function)
../usart.c:16: error: parse error before ';' token
../usart.c:34: error: `UCSRA' undeclared (first use in this function)
../usart.c:37: error: `UDR' undeclared (first use in this function)
../usart.c:37: warning: `return' with a value, in function returning void
make: *** [usart.o] Error 1
Build failed with 10 errors and 1 warnings...
MFG Danielsan
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Die Beispiele im Datenblatt passen nicht immer zum Chip. Ist ein altbekanntes Problem. Die richtigen Namen für die Register findest Du in den entsprechenden Abschnitten des Datenblatts (nicht in den Codebeispielen).
Du wirst also nicht um eine Anpassung des Codes kommen. Im Zweifelsfall immer in den Header-Dateien nachschauen.
Hi,
hab grad mal durch die iom128.h gegrept, gibts nicht wegen der zwei../usart.c:11: error: `UBRRH1' undeclared (first use in this function)
Uarts heißt's da:
UBRR1H oder UBRR0H
das gleiche für UCSRB:
#define UCSR0B _SFR_IO8(0x0A)
#define UCSR1B _SFR_MEM8(0x9A)
jeweils für UART0 und 1
Txen: ist eine Konstante wird also groß geschrieben: TXEN.
Schau dir mal die iom128.h an.
mfg
Thorsten
Open Minds. Open Sources. Open Future
Mh ok das hat mich schon weitergebracht jetzt habe ichs geschafft die fehlermeldungen auf das hier zu reduzieren:
Build started 7.2.2006 at 11:37:42
avr-gcc -mmcu=atmega128 -Wall -gdwarf-2 -DF_CPU=16000000 -O0 -fsigned-char -Wp,-M,-MP,-MT,usart.o,-MF,dep/usart.o.d -c ../usart.c
../usart.c: In function `USART_Transmit':
../usart.c:36: warning: `return' with a value, in function returning void
avr-gcc -mmcu=atmega128 usart.o -o usart.elf
C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/lib/avr5/crtm128.o(.init9+0x0): undefined reference to `main'
make: *** [usart.elf] Error 1
Build failed with 1 errors and 1 warnings...
Also ist ja nur noch hier irgendwas falsch:
C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/lib/avr5/crtm128.o(.init9+0x0): undefined reference to `main'
ich kenne mich leider nicht genug aus um zu verstehen was da falsch ist.
MFG Danielsan
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Lesezeichen