Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem USART beim Mega8


von Chris (Gast)


Lesenswert?

Hallo,

folgendes Problem:

Ich will mit meinem Mega8 irgendwas an die RS232 Schnittstelle vom Comp 
senden.

Ich wollte einen Quarz nutzen - hab die Fusebits auch so eingestellt.

Leider blieb die Kommunikation tot.

Heute hab ich herausgefunden, dass ich zumindest Murx empfange, wenn ich 
den Empfänger auf 300 Baud stelle.

Nach einer weile Rumprobieren, habe ich es mit dem Internen Takt von 8 
Mhz versucht.

Stelle ich nun den Empfänger wieder auf 300 Baud, empfängt er die 
richtigen Daten!

Wie kann das sein?!
Hier mein Code:
1
int main(void)
2
{
3
4
// USART initialisieren
5
USART_Init(MYUBRR);
6
7
while (1)
8
{
9
  USART_String("Hallo!");
10
}
11
12
13
14
return 0;
15
16
void USART_Init( unsigned int ubrr)
17
{
18
/*Set baud rate */
19
UBRRH = (unsigned char)(ubrr>>8);
20
UBRRL = (unsigned char)ubrr;
21
/*Enable receiver and transmitter */
22
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
23
/* Set frame format: 8data, 1stop bit, no parity */
24
UCSRC = (3<<UCSZ0);
25
26
}
27
28
29
void USART_Transmit( unsigned char data )
30
{
31
/* Wait for empty transmit buffer */
32
while ( !( UCSRA & (1<<UDRE)) )
33
;
34
/* Put data into buffer, sends the data */
35
UDR = data;
36
37
}
38
39
void USART_String (char *s)
40
{
41
    while (*s)
42
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
43
        USART_Transmit(*s);
44
        s++;
45
    }
46
}
47
}
Ich nutze das MKII von AVR mit AVR-Studio. Ich habe so ein bischen das 
Gefühl, dass da ein Prescaler drinn ist, aber man kommt an die Fusebits 
nicht direkt drann - man kann nur aus nem Drop-Down Menu auswählen. Gibt 
es eine Software die über das MKII direkt an die Fusebits kommt?

Oder an was könnte es sonst noch liegen?

Gruß
Chris

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Stelle ich nun den Empfänger wieder auf 300 Baud, empfängt er die
> richtigen Daten!
> Wie kann das sein?!
Du sendest pausenlos den "Hallo!" String. Mach mal nach dem Senden des 
Strings ein kurze Pause (mindestens 1 Zeichen --> mindestens 30ms), 
damit sich der Empfänger zwischendurch mal aufsynchronisieren kann.

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

wo ist denn MYUBBR definiert? Und was fürn Takt hast du und wie sieht 
das Fusebite-Fenster aus (nach nem read am besten).

Über das AVRStudio kommst du direkt an die Fuses, einmal weil du per 
Dropdown alle Fusekombinationen einstellen kannst, andererseits weil du 
unten die direkt eingeben kannst ;). Ein Prescaler sollte da (beim 
Mega8) allerdings nicht dabei sein.

Viele Grüße, Lasse

von Johannes M. (johnny-m)


Lesenswert?

Vergiss den internen Takt! Der ist für asynchrone Übertragung ungeignet! 
Bleib bei einem (geeigneten) Quarz.

> UCSRC = (3<<UCSZ0);
Bitte schau Dir im Datenblatt mal die Funktion des Bits URSEL in UCSRC 
an. Ohne dieses Bit landet der Wert in UBRRH!

von Chris (Gast)


Lesenswert?

Hi,

also ich beantworte mal von oben nach unten...

@Lothar: Pause einfügen brachte keine Veränderung

@Lasse:
1
#define FOSC 3579545// Clock Speed steht momentan auf 8000000 wegen int. Takt.
2
#define BAUD 9600
3
#define MYUBRR FOSC/16/BAUD-1

@Johannes:
Der interne Takt ist aber der einzige der richtig funktioniert!
Wenn auch mit offenbar falschem Takt.

Als ich allerdings das zu Bit URSEL las, hatte ich Hoffnungen - aber 
leider hat es gar keine Veränderung gebracht.

Nach wie vor das Selbe Problem - mit internen Takt auf 8Mhz läuft alles 
- mit Quarz läuft nix.

Ich schau mal ob ich in der Hochschule mal an ein Oszi ran darf um mal 
zu sehen wie der Takt wirklich ist.

von Johannes M. (johnny-m)


Lesenswert?

Chris wrote:
> #define FOSC 3579545// Clock Speed steht momentan auf 8000000 wegen int.
#define FOSC 3579545UL...

von Chris (Gast)


Lesenswert?

Hab es zwar direkt gemacht wie im Datenblatt, aber hab es mit dem UL 
trotzdem ausprobiert. Geht nicht.

Hab auch den Wert mal manuell mit dem Taschenrechner ausgerechnet und 
hingeschrieben - selbes Phänomen.

@Lasse:
Wo ist da im AVR-Studio direkt was zum eingeben? Bei mir ist nur das 
Dorpdown menü und unten steht "High" "Low" - das scheint sich aber nicht 
auf die Fuses zu beziehen, da es sich nicht verändert.

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

doch, genau da wo High und Low steht (und bei manchen Controllern auch 
Extended) sind die Fuses. Die sollten sich auch ändern ;)

Gruß, Lasse

von Chris (Gast)


Lesenswert?

Also sorry - die Werte ändern sich und ich habs gepeilt.
Die Fuses sind alle richtig und der Takt ändert sich auch!

Der USART ist nur viel zu langsam! Ich muss immer wesentlich weniger 
Baud beim Empfänger einstellen, als eigentlich nötig.

Wenn ich den Quarz aktiviere, muss ich auf ca. 100 Baud zurück um 
wenigstens Murx zu empfangen.

Scheint zufall zu sein, dass mit 8 MHZ int. Osz. und 300 Baud beim 
empfänger die richtigen Werte ankommen.

Allerdings habe ich das Problem auch bei anderen AVRs - z.B. beim 
Mega88.

Das Problem scheint auch auf 2 verschiedenen Schaltungen das Selbe zu 
sein. Denke also es MUSS an der Programmierung liegen!

Aber ich weiß nicht was ich noch machen soll.

Gruß
Chris

von Jean P. (fubu1000)


Lesenswert?

Das wurde schon von Johannnes gesagt, aber ich wette auch das du das 
URSEL bit nit setzt und damit dein UBBRH überschreibst.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Chris wrote:

> Der USART ist nur viel zu langsam! Ich muss immer wesentlich weniger
> Baud beim Empfänger einstellen, als eigentlich nötig.
>
> Wenn ich den Quarz aktiviere, muss ich auf ca. 100 Baud zurück um
> wenigstens Murx zu empfangen.

Du konstruierst da einen Zusammenhang der nicht existiert.
Nur weil bei 100 Baud zufällig irgendwelcher Datenmüll rauskommt, heist 
das nicht, dass deine USART zu langsam läuft.

> Scheint zufall zu sein, dass mit 8 MHZ int. Osz. und 300 Baud beim
> empfänger die richtigen Werte ankommen.

Wenn du mit 9600 Baud sendest und dein Empfänger kann bei 300 Baud 
richtig empfangen, dann stimmt bei die die Taktfrequenz nicht.

Also noch mal alle Fuses durchsehen.

Eventuell auch mal ein Testprogramm schreiben, welches mit _delay_ms 
(und richtiger Einstellung von F_CPU) eine LED im Sekundentakt 
ein/ausschaltet. Laufen lassen und nachsehen ob die Sekunden ungefähr 
hinkommen. Wenn da noch irgendwelche Teiler auf der Taktversorgung sind 
(DIV8), dann sieht man das! 8 Sekunden kann auch ein Blinder von 1 
Sekunde unterscheiden.

von Paul Baumann (Gast)


Lesenswert?

>8 Sekunden kann auch ein Blinder von 1 Sekunde unterscheiden.
Der Blinde macht dann in der Not einen Piezo-Schallwandler dran...;-)

MfG Paul

von Chris (Gast)


Lesenswert?

Also:

LED blinkt im Sekundentakt - USART geht immernoch nicht.

Ich denk da hilft nur noch ein Oszi - und selbst dann wüsst ich nicht 
wie man das Problem beheben könnte.

Kann am MAX232 noch was falsch sein? Dass der Die Daten zu langsam 
überträgt oder so?

Gruß
Chris

von Falk B. (falk)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.