-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Über RS232 etwas senden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66

    Über RS232 etwas senden

    Anzeige

    Hallo,

    ich habe ein Pollin Evaluationboard 2.01 mit einem ATMEGA 644.

    Mein Problem:

    Ich bekomme es nicht hin mit der RS232 Schnittstelle etwas zu senden.
    Habe einige Beispiele ausprobiert, aber es klappt nichtmal das Init der Schnittstelle.

    Hat jemand ein Beispielprogramm, mit dem ich einen String oder auch nur ein einzelnes Zeichen senden kann?

    Mfg, Andreas

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Hallo,

    mit diesen Zeilen habe ich ein einzelnes Zeichen vom PC an den µC geschickt, den ASCII Code des Zeichens an den LEDs vom PortC ausgegeben und dann wieder auf den PC zurückgeschickt.

    Hardware: RN-Board1.4, Atmega32
    Baudrate 9600, 8N1

    Hoffe, dir geholfen zu haben

    Walter
    Code:
    #include <avr/io.h>
    #define F_CPU        8000000UL
    #include <util/delay.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    
    
    int main(void){
    
    
    	UBRRH = 0;
    	UBRRL = 51;
    
    	UCSRB = (1<<RXEN) | (1<<TXEN);
    
    	UCSRC |= (1<<URSEL) | (3<<UCSZ0);
    
    
    
    	DDRC = 0xff;
    
    	unsigned char a;
    	_delay_ms(2000);
    
    
    
    	while(1){
    	while((UCSRA & (1<<RXC))){
    
    		a = UDR;
    		PORTC = ~a;
    		_delay_ms(3000);
    
    		UDR = a;
    		_delay_ms(3000);
    		}
    		}
    
    	}

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Leider gibt es wie auch schon bei den anderen Programmen unzählige Fehlermeldungen beim Compilieren.

    ../Test.c:23: error: 'UBRRH' undeclared (first use in this function)
    ../Test.c:24: error: 'UBRRL' undeclared (first use in this function)
    ...
    ...

    Das geht dann so weiter. Als könne er damit nix anfangen. Irgendetwas fehlt ihm.


    So sieht mein Kopf aus:

    Code:
    #include <avr/io.h>
    #ifndef F_CPU
    /* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert 
       (z.B. durch Übergabe als Parameter zum Compiler innerhalb 
       des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
       "nachträgliche" Definition hinweist */
    #warning "F_CPU war noch nicht definiert, wird nun mit 16000000 definiert"
    #define F_CPU 16000000UL     /* Quarz mit 16.0000 Mhz */
    #endif
    #include <util/delay.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>

    Fehlt da noch etwas?

    Gruß, Andreas

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Bin selber relativ neu hier.

    Kannst du meinen Bespielcode fehlerfrei übersetzen?

    mfg Walter

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Nein bei mir funktioniert dein Programm nicht, AVR kann es nicht kompilieren.

    Zwei der Fehler habe ich in meinem letzten Post genannt.

    Ich versuche gerade herauszufinden, woher diese Fehler kommen. Bisher hab ich noch nichts gefunden.

    Gruß, Andreas



    EDIT:
    Da kommen noch zahlen zwischen.
    also statt:

    Code:
       UCSRB = ( (1<<RXEN)|(1<<TXEN) );
    muss ich schreiben:
    Code:
       UCSR0B = ( (1<<RXEN0)|(1<<TXEN0) );
    So werden es schon mal weniger Fehler
    Aber alles habe ich noch nicht behoben...

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Ok, der Atmega32 hat auch wie der 644 nur einen USART, will aber den einen nicht als Null addressiert haben.

    Habe mich vor einem Jahr mit der seriellen Datenübertragung zwischen PC und µC beschäftigt und diese Seite hat mir dabei geholfen:

    http://www.tschallener.net/info/inde...ga32-in-c.html

    mfg Walter

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    Hi MechMac!

    Das Problem ist, dass die bei Atmel die Namen einiger Register und Bits geändert haben beim 644 um mehrere UART in einem Controller adressieren zu können.
    Der 644p z.B. hat zwei davon. Daher auch die 0 am Ende oder mittendrin für die 1. Schnittstelle. Im Datenblatt sind die Register der einzelnen UART vollständig benannt.

    Es gibt auch einen "migration guide" vom ATmega32 zum ATmega644.
    Der ist allerdings auch nicht wirklich eindeutig an ein paar Stellen:
    http://www.atmel.com/dyn/resources/p...ts/doc8001.pdf

    edit:
    Die Schnittstelle muss in den asynchronen mode initialisert werden, weiß nicht mehr genau, ob der meg32 das auch so wollte.

    Tabellen für die Baudraten bei diversen Taktfrequenzen, inkl. Fehler:
    http://www.wormfood.net/avrbaudcalc.php

    Code:
    // ****** init debug serial output
    void initDBGser(void) {
    	// --- set UART baud rate to 115200 @ 14,7456 MHz
    	unsigned int baud = 7;
    	UBRR0H = (unsigned char) (baud>>8);
    	UBRR0L = (unsigned char) baud;
    
    	// --- init
    	UCSR0B = (1 << RXEN0) | (1 << TXEN0);
    	UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
    
    	return;
    }
    
    // ****** send byte
    void DBGsertxbyte(uint8_t btmp) {
    	// --- wait for empty tx buffer
    	while ( !(UCSR0A & (1<<UDRE0)) );
    	// --- put data into UDR, starts transmission too
    	UDR0 = btmp;
    
    	return;
    }

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Zitat Zitat von Slein
    ... Atmel die Namen einiger Register und Bits geändert haben beim 644 ... 644p z.B. hat zwei davon ...
    Es gibt mehrere 644-Varianten. Das ist natürlich etwas gefährlich.

    Ich habe mehrere docs zur "644"er Familie:
    2593M–AVR–08/07 für den ATmega644/V (Preliminary) - 1 UART (UART0)
    8011M–AVR–08/09 für ATmega164P/324P/644P - 2 USART’s, USART0 und USART1
    8272A–AVR–01/10 für 164A/164PA/324A/324PA/644A/644PA/1284/1284P - das Neueste - 2 USART’s, USART0 und USART1

    MechMac, Du musst unbedingt das für Deinen aktuell verwendeten Controller passende Datenblatt nehmen, und natürlich auch die entsprechende io.h - sonst gehts schief. Das hast Du ja schon gesehen.
    Ciao sagt der JoeamBerg

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Danke für die Antworten, ich habe es nun hinbekommen.

    Gruß, Andreas

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hallo Andreas,
    Zitat Zitat von MechMac
    ... ich habe es nun hinbekommen ...
    Bitte schreib doch kurz, woran es gelegen hat. Es gibt sicher Mitleser, die daraus lernen könnten.
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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