- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: RS232 senden mit AtMega128

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240

    RS232 senden mit AtMega128

    Anzeige

    E-Bike
    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:

    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;							
    }
    Vielleicht hat mir ja einer noch einen guten Tipp mit dem ich die Schnittstelle schnell zum laufen bekomme.
    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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Bekommst du da keine Fehler beim compilieren, mit dem müsstest du den Fehler aber selbst auch finden.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    Nein hab da keinen Fehler bekommen (0 errors 0warnings). Welcher Satz sollte mir denn angezeigt werden?

    MFG

    Bean

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    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!!

    雅思特史特芬
    开发及研究

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Wenn du die zwei Fehler ausbesserst funktioniert der Code, aber zuerst sollte dein Compiler richtig funktionieren.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    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):
    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;							
    }
    Und bekomme nachdem ich auf Build gegangen bin folgende Meldungen:
    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...
    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...

    Vielen Dank schon mal!!

    Grüße!!

    Bean

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    #define MYUBRR F_CPU/16/BAUD-1
    Das ist irgendwie falsch
    #define MYUBRR (F_CPU/(BAUD*16L))-1
    So sieht es besser aus...
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    Also hab nun noch ein paar Sachen verändert:

    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;							
    }
    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...

    Aber trotzdem Danke für die Hilfeversuche!!

    Grüße!!

    Bean

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Naja,
    Dir ist hoffentlich aber klar, daß Du:
    1.
    Code:
     while (!(UCSR1A & (1<<UDR1E)))
    vor jedem Zeichen machen musst

    2.
    Code:
    _delay_ms(100);
    nicht unbedingt 100 ms sein muß

    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

    Code:
    #define BAUDSELECT (F_CPU/(BAUD*16L))-1
    
    void init_uart(void){
        UBRR0L = BAUDSELECT;
        UCSR0B = (1<<RXEN0)|(1<<TXEN0);
        UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
      }
    senden tue ich mit solcher Funktion
    Code:
    void sendmessage(Message *message){
      uint8_t a;
      for (a=0;a<message->laenge;a++){
          while(!(UCSR0A&(1<<UDRE0)));
          UDR0 = message->text[a];
        }
    Vielleicht hilft es Dir weiter.

    Gruß Sebastian

    P.S.
    Code:
    while (!(UCSR1A & (1<<UDR1E)))      //warten bis Senden möglich
       {
       }
    Hier stinkt was, UDR1E gibt es nicht, es heißt UDRE1, sicher, daß es keine Fehler gibt ?
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Mit was kompilierst du denn, bei deinem muss irgend was oberfaul sein. Meiner hat aufgeschrien beim ubrr und UDR1E.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests