Bekommst du da keine Fehler beim compilieren, mit dem müsstest du den Fehler aber selbst auch finden.
Hallo
Ich habe schon einen Thread im Hardwareforum, denke aber dass es hier besser passt.
Und zwar hab möchte ich meinen Mega128 dazu bringen etwas auf der RS232 auszugeben. Ich hab die Schnittstelle 1 verwendet. Einen Pegelwandler hab ich auch auf meiner Platine. Hab die Schnittstelle auch schon einemal mit einem Mega8 zum laufen bekommen. Nur mit dem Mega 128 will Sie noch nicht richtig.
Kabel verwende ich ein 1 zu 1. Habe volgenden Code verwendet:
Vielleicht hat mir ja einer noch einen guten Tipp mit dem ich die Schnittstelle schnell zum laufen bekomme.Code:#include <avr/io.h> #define F_CPU 12000000L #include <util/delay.h> #define BAUD 9600L #define MYUBRR F_CPU/16/BAUD-1 void USART_Init(unsigned int UBRR) { UBRR1H = (unsigned char)(ubrr>>8); UBRR1L = (unsigned char) ubrr; UCSR1B = (1<<RXEN)|(1<<TXEN); UCSR1C = 0b00000110; } int main(void) { USART_Init (MYUBRR); while (!(UCSR1A & (1<<UDR1E))) //warten bis Senden möglich { } UDR1 = 'H'; //schreibt das Zeichen x auf die Schnittstelle _delay_ms(100); UDR1 = 'A'; _delay_ms(100); UDR1 = 'L'; _delay_ms(100); UDR1 = 'L'; //schreibt das Zeichen x auf die Schnittstelle _delay_ms(100); UDR1 = 'O'; _delay_ms(100); return 0; }
Ach ja, wenn ich mit dem Multimeter (hab leider kein Speicheroszi) an Rxd und Txd messe dann hab ich -7 und -9V. Der Pegelwandler scheint also zu funktionieren. Beim Hyperterminal hab ich soweit denke ich alles richtig eingestellt (in diesem Fall 8N1 und 9600Baud).
Vielen Dank schon mal für eure Hilfe!
Grüße!!
Bean
Bekommst du da keine Fehler beim compilieren, mit dem müsstest du den Fehler aber selbst auch finden.
Nein hab da keinen Fehler bekommen (0 errors 0warnings). Welcher Satz sollte mir denn angezeigt werden?
MFG
Bean
Woher kennt denn dein Kompiler "ubrr"?
Hast du nicht den ganzen Code geschickt?
Wenn du keine Fehler bekommst, könnte es vielleicht sein, dass du gar nicht das richtige File übersetzt?
sast
edit: C und C++ sind case sensitiv!!
雅思特史特芬
开发及研究
Wenn du die zwei Fehler ausbesserst funktioniert der Code, aber zuerst sollte dein Compiler richtig funktionieren.
Hallo
Ich hab das jetzt gleich noch einmal getestet mi de selben Ergebniss. Ich hab folgenden Code (hab bei dem alten noch #include uart.h eingefügt):
Und bekomme nachdem ich auf Build gegangen bin folgende Meldungen:Code:#include <avr/io.h> #define F_CPU 12000000L #include <util/delay.h> #include <uart.h> #define BAUD 9600L #define MYUBRR F_CPU/16/BAUD-1 void USART_Init(unsigned int UBRR) { UBRR1H = (unsigned char)(ubrr>>8); UBRR1L = (unsigned char) ubrr; UCSR1B = (1<<RXEN)|(1<<TXEN); UCSR1C = 0b00000110; } int main(void) { USART_Init (MYUBRR); while (!(UCSR1A & (1<<UDR1E))) //warten bis Senden möglich { } UDR1 = 'H'; //schreibt das Zeichen x auf die Schnittstelle _delay_ms(100); UDR1 = 'A'; _delay_ms(100); UDR1 = 'L'; _delay_ms(100); UDR1 = 'L'; //schreibt das Zeichen x auf die Schnittstelle _delay_ms(100); UDR1 = 'O'; _delay_ms(100); return 0; }
An was liegt das? Wenn ihr sagt dass ich vielleicht nicht den richtigen File Compiliere, wei kann ich das kontrollieren? Was stimmt sonst noch nicht an dem Code? Also auf der seriellen Schnittstelle an meinem PC empfange ich noch nichts...Build started 23.11.2007 at 19:21:20
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex USART.elf USART.eep || exit 0
c:\WinAVR\bin\avr-objcopy.exe: there are no sections to be copied!
AVR Memory Usage
----------------
Device: atmega128
Program: 4316 bytes (3.3% Full)
(.text + .data + .bootloader)
Data: 8 bytes (0.2% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
Vielen Dank schon mal!!
Grüße!!
Bean
Das ist irgendwie falsch#define MYUBRR F_CPU/16/BAUD-1
So sieht es besser aus...#define MYUBRR (F_CPU/(BAUD*16L))-1
Linus TorvaldSoftware is like s e x: its better when its free.
Also hab nun noch ein paar Sachen verändert:
Nach wie vor wird das Programm ohne Fehler Compiliert und auch ohne zu murren vom Pony in den Controller geladen... Aber auf dem Hyper Terminal sehe ich leider noch nichts...Code:#include <avr/io.h> #define F_CPU 12000000L #include <util/delay.h> #include <uart.h> #define BAUD 9600L #define UBRR (F_CPU/(BAUD*16L))-1 void USART_Init(unsigned int UBRR) { UBRR1H = (unsigned char)(UBRR>>8); UBRR1L = (unsigned char) UBRR; UCSR1B = (1<<RXEN)|(1<<TXEN); UCSR1C = 0b00000110; } int main(void) { USART_Init (UBRR); while (!(UCSR1A & (1<<UDR1E))) //warten bis Senden möglich { } UDR1 = 'H'; //schreibt das Zeichen x auf die Schnittstelle _delay_ms(100); UDR1 = 'A'; _delay_ms(100); UDR1 = 'L'; _delay_ms(100); UDR1 = 'L'; //schreibt das Zeichen x auf die Schnittstelle _delay_ms(100); UDR1 = 'O'; _delay_ms(100); return 0; }
Aber trotzdem Danke für die Hilfeversuche!!
Grüße!!
Bean
Naja,
Dir ist hoffentlich aber klar, daß Du:
1.
vor jedem Zeichen machen musstCode:while (!(UCSR1A & (1<<UDR1E)))
2.
nicht unbedingt 100 ms sein mußCode:_delay_ms(100);
3. Keine Endloschleife in Deinem Programm vorhanden ist
Warum übergibst Du UBRR an die Initfunktion ?
Ich füge mal ein paar Schnipsel, die bei mir mit M128 100% Funktionieren, ist zwar für UART0 , sollte aber egal sein
senden tue ich mit solcher FunktionCode:#define BAUDSELECT (F_CPU/(BAUD*16L))-1 void init_uart(void){ UBRR0L = BAUDSELECT; UCSR0B = (1<<RXEN0)|(1<<TXEN0); UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); }
Vielleicht hilft es Dir weiter.Code:void sendmessage(Message *message){ uint8_t a; for (a=0;a<message->laenge;a++){ while(!(UCSR0A&(1<<UDRE0))); UDR0 = message->text[a]; }
Gruß Sebastian
P.S.
Hier stinkt was, UDR1E gibt es nicht, es heißt UDRE1, sicher, daß es keine Fehler gibt ?Code:while (!(UCSR1A & (1<<UDR1E))) //warten bis Senden möglich { }
Linus TorvaldSoftware is like s e x: its better when its free.
Mit was kompilierst du denn, bei deinem muss irgend was oberfaul sein. Meiner hat aufgeschrien beim ubrr und UDR1E.
Lesezeichen