PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART - Atmega8 Problem...



Just_Indes
08.04.2010, 23:14
Servus,
hab ein Problem mit meinem Atmega8 Usart!
Ich möchte mal zu Beginn ganz simple Zeichen per RS232 mithilfe eines MAX232 an meinen PC schicken und mit dem HTerm empfangen.

Verwende dazu diese MAX232-Schaltung:
http://sodoityourself.com/wp-content/uploads/2007/02/circuit_232.jpg

und das ist mein Code:

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

#define F_CPU 12000000L
#define BAUD 9600L

#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1) //clever runde
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) //reale Baudrate

#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) //Fehler in Promille

#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
#error Systematischer Fehler in der Baudrate größer 1% und damit zu hoch!
#endif


int main(void)
{

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


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



while (!(UCSRA & (1<<UDRE))) //warten bis Senden möglich
{
}


UDR = 'x'; //schreibt das Zeichen x auf die Schnittstelle
_delay_ms(100);


return 0;
}


Einstellungen HTerm:
Baud: 9600
Data: 8
Stop: 2
muss ich im HTerm weitere Einstellungen tätigen?

Hab am TX-Pin am µC eine ständige Spannung von 3,26V und sobald ich das Programm starte geht sie kurz auf 0V runter.

Am HTerm kommt nichts an.

Danke für eure Hilfe!
LG

Knipser-14
09.04.2010, 10:06
Hallo

also zu deinem Code:

UCSRC = (3<<UCSZ0);

Ich weiß nicht ob das so geht...

Ich würde es vielleicht so versuchen:

UCSRC = (1<<UCSZ1) | (1<<UCSZ1);

Und warum verwendest du 2 Stoppbits? Einfach nur so, oder bringt das irgendwie Vorteile?

Und hier nochmal mein erster Code, den ich mal irgendwann im Internet gefunden hab. Auf meinem Atmega16 funktioniert er, vielleicht kannst du damit deine Schaltung testen.



#include <avr/io.h>
#include <inttypes.h>

// Sollte schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
#define F_CPU 16000000UL

#define BAUD 9200UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)

// USART initialisieren
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

// Aktivieren von receiver und transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);

// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

int main(void)
{
uint8_t buffer;

// USART initialisieren
uart_init();

while (1)
{
// Warten bis Daten empfangen wurden
while ( !(UCSRA & (1<<RXC)) )
;

// Empfangsregister auslesen
buffer = UDR;

// Warten bis der Sendepuffer frei ist
while ( !( UCSRA & (1<<UDRE)) )
;

// Daten in den Puffer schreiben und damit senden
UDR = buffer;
}
}


mfG

Hubert.G
09.04.2010, 12:05
Hast du schon probiert ob HTerm und die Leitungen funktionieren?
Dazu den Mega8 aus dem Sockel nehmen und zwischen RX und TX eine Brücke stecken.
Wenn du dann am HTerm etwas eingibst solltest du es als Echo zurück bekommen.

Just_Indes
09.04.2010, 13:55
Danke für den Tipp, habs jetzt mal so getestet.
Kam nichts an, wird wohl am Max232, HTerm oder an meinem RS232/USB Converter liegen.
Wie teste ich am Besten um die Möglichkeiten einzuschränken?

Hubert.G
09.04.2010, 14:58
Ich würde beim USB-Konverter anfangen, dort mal RX/TX kurzschließen, wenn es funktioniert, dann Schritt für Schritt Richtung Board.
Hast du am HTerm auch die richtige COM angegeben?

Just_Indes
09.04.2010, 15:06
Danke, scheint am Konverter zu liegen.
COM definitiv richtig gewählt!
Werd mir einen neuen besorgen und mich dann nochmal melden!
Schönes Wochenende!

Just_Indes
15.04.2010, 13:30
Neuer RS232-USB Converter funktioniert,
durch den MAX232 kommt allerdings nichts durch!
Machts nen Sinn, wenn ich die Spannungswerte der MAX-Pins poste?

Hubert.G
15.04.2010, 14:07
Kannst du dem MAX232 aus dem Sockel nehmen?
Wenn ja, dann mal auf den Pin 13,14 eine Brücke und HTerm Echotest.
Spannungen mit angestecktem Kabel zum PC messen.

Just_Indes
15.04.2010, 14:16
ohne MAX232: Brücke(PIN13/14) Pin 13/14: -6,6V gegen Masse

mit MAX232:

PIN1: 5,5 16: 3,7
2: 7,1
3: 2,0 14: -7
4: 3,7 13: 0
5: -3,3 12: 3,7
6: -6,9 11: 3,7
7: -6,9 10: 2,75
8: 0 9: 3,7

Just_Indes
17.04.2010, 20:02
@ Hubert, was sagst du zu den Spannungswerten?

Hubert.G
17.04.2010, 20:12
Arbeitest du nur mit 3,7V?
War die Verbindung zum PC angesteckt beim messen?

Just_Indes
17.04.2010, 20:53
so, verwende jetzt 4,5V die mir der Atmega8 liefert, mehr ist im Moment nicht möglich

ohne MAX232: Brücke(PIN13/14) Pin 13/14: -7,2V

mit MAX232:

PIN1: 6,6 16: 4,5
2: 8,5
3: 2,4 14: -8,3
4: 4,4 13: 0
5: -4,0 12: 4,5
6: -8,3 11: 4,5
7: -8,3 10: 3,3
8: 0 9: 4,5

Ist zum PC verbunden!

Hubert.G
17.04.2010, 21:12
Du hast im Kabel vom PC RX und TX vertauscht.

Just_Indes
17.04.2010, 21:23
Stimmt, danke! ](*,)

Just_Indes
17.04.2010, 21:56
Danke Hubert!!
Funktioniert jetzt soweit, vom Atmega bis HTerm!