Schwierigkeiten mit der RS232-Schnittstelle

GeBorg

Neues Mitglied
27. Okt. 2009
3
0
0
Sprachen
Hi,

ich bin noch sehr unerfahren auf dem Feld der Programmierung und bin nun auf ein Problem gestoßen, das ich ohne eure Hilfe wahrscheinlich nicht lösen werden kann!
Ich versuche gerade die RS232-Schnittstelle eines AtMega328p zu programmieren (Mini Orangutan von Pololu.com). Ich habe die Tx, Rx und GND Verbindungen richtig mit einem USB-com-Adapter hergestellt und erhalte auch schon auf dem PC Daten. Allerdings sende ich eine 100 und erhalte eine 019. MHz-Wert, Baudraten, Anzahl der gesendeten Bits, Stopbits etc ist alles richtig eingesetellt, sowohl bei dem Chip als auch bei dem Adapter sowie dem Terminal-Programm von AVR.

Gibt es noch irgendeinen Parameter den ich übersehen habe?

LG.
 
Hallo,

in welcher Programmiersprache proggst Du? Kannst Du den Code mal einstellen?

Grüße,
Ma
 
Hi Markus,

ich programmiere in C (AVR Studio). Der Quelltext ist bislang folgender:

#include <avr/io.h>
#include <util/delay.h>

void long_delay(uint16_t ms)
{
for(; ms>0; ms--) _delay_ms(1);
}

int main (void)
{
// Initialisierung der USART.
UCSR0B |= (1<<TXEN0)|(1<<RXEN0); // UART TX und RX einschalten.
//UBRR0H = 2; // Baudregister high.
UBRR0L = 129; // Baudregister low.

while(1)
{
while (!(UCSR0A & (1<<UDRE0)))
{
}
UDR0 = 100;
long_delay(100);
}
}

Ich habe mal fast alle Kommentare aus dem Text entfernt.

LG GeBorg.
 
Servus.

Ich habe npaar Anmerkungen:

1. Es ist wesentlich einfacher zu lesen, wenn die Register einzeln gesetzt werden. Sprich, so wie Du es beim UCSR0B gemacht hast.

2. Für Quellcode gibt es einen extra Tag.

Zum Code:

Die Initialisierung stimmt so nicht. Man muss sowohl in den H als auch in den L Register schreiben.

Die richtige Initialisierung sieht dann so aus:

Code:
#define F_CPU		14745600UL // MCU Frequenz in Hz
#define BaudRate	9600UL	   // COM-Übertragungsrate

void init_usart (void) {
	uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU / (16*BaudRate)-1);

	UBRRH = (uint8_t)(ubrr >> 8);
	UBRRL = (uint8_t)(ubrr);

	UCSR0B = (1 << RXEN0)|(1 << TXEN0);
	// 8-N-1
	UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
}

So müsste es funktionieren.

Grüsse
Heinrich
 
Nach langem Suchen des Fehlers habe ich ihn nun gefunden:
Die Ein-/ Ausgänge des Atmel-Chips müssen natürlich vorher noch bezüglich des Levels konvertiert werden und können nicht direkt mit den Pins des seriellen Ports verbunden werden!
Aber vielen Dank nochmals für die Tips bezüglich der Programmierung!

LG GeBorg!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)