PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega32 USART Problem



dEx82
18.07.2009, 14:45
Hallo,

Ich bekomme die Datenübertragung zwischen meinem Mega32 und dem PC einfach nicht auf die Kette.

1. Problem: Mein Mainboard hat keinen COM-Port. Auf dem Mainboard ist aber ein Wannenstecker für die Verbindung einer Erweiterungskarte vorhanden. Diesen Wannenstecker habe ich nun einfach auf meinen MAX232 Adapter gelegt. Ich kann mir aber nicht sicher sein ob RxD und TxD so beschaltet sind, wie ich es hoffe, da ASUS sich in seinem Mainboard Handbuch zur Belegung aussschweigt und im Internet 2 verschiedene Arten der Beschaltung finden. Dort sind jeweils RX & TX gedreht.

2. Problem: Ich bin neu beim Thema uC. Mein Testprogramm für die Datenübertragung ist aus Tutorials zusammen gesucht. Auch da bin ich mir leider nicht sicher ob da alles richtig eingestellt ist. Vor allem bezüglich der BAUD Rate.

Nun wäre es schön wenn jemand ein funktionierendes kleines C Testprogramm hat, das mit einem MEGA32 und externem 16MHz Quarz getestet wurde und funktioniert. Somit kann ich wenigstens eine Störquelle ausschalten und mich der Mainboard Verdrahtung widmen.

Ich habe es schon mit der Peter Fleury UART Lib probiert. Aber das Ding ist so überladen, das ich damit als Anfänger überhaupt nicht zurecht komme. Dazu ist es noch in C geschrieben und ich beherrsche eigentlich nur C++ halbwegs vernünftig.

Ich hoffe das ist für euch keine große Sache mir eben ein passendes Testprogramm zu schreiben. Ihr würdet mir damit einige graue Haare ersparen ;)

Hubert.G
18.07.2009, 14:52
Wenn du am MAX232 richtung µC RX und TX verbindest, dann kannst du am Terminal die Verbindung probieren. Es sollte ein Echo zurückkommen.
Ein Beispielprogramm habe ich nicht, aber stelle mal deines herein, zur Kontrolle.

dEx82
18.07.2009, 15:06
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

#define BAUD 38400UL // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif

void main()
{
UCSRB = (1<<TXEN); // UART TX einschalten
UCSRC = (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;


while (!(UCSRA & (1<<UDRE)))
{

}
UDR = 'X';
}


wie gesagt, das Programm ist zusammen geklaut. Verbinde ich RX TX Richtung uC kommt glaube ich kein Echo. Ich schreibe im Hyperterminal und nach Betätigen der Enter Taste springt der Cursor wieder zurück zum Start und das geschriebene bleibt einfach stehen.

Ich werde jetzt mal RX TX Richtung PC drehen und anschliessend nochmal den Echo Test machen

//EDIT bei gedrehtem RX TX Richtung PC ändert sich nix. Ich kann im Hyperterminal schreiben und bei Enter springt der Cursor einfach zurück.

Hubert.G
18.07.2009, 15:54
Du musst auf der µC des MAX232 die RX/TX die Verbindung machen, wenn dann kein Echo kommt, hat es ein Problem mit der Verbindung zum PC.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

#define BAUD 38400UL // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif
void USART_transmit(unsigned int data){
while (!(UCSRA & (1<<UDRE)))
{
UDR = data;
}
}
int main(void)
{
UCSRB = (1<<TXEN); // UART TX einschalten
UCSRC = (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

unsigned int data = 'X';
for(;;){

USART_transmit(data);

}
}
So sollte es dauernd ein X am PC ausgeben, es ist sicherer falls etwas verschluckt wird.

veit
18.07.2009, 16:08
könntest die brücke auch gleich am wannenstecker am pc machen, dann kannst da schonmal fehler feststellen. vielleicht hast ja port falsch oder die pins ...