www.mikrocontroller.net

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


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

int main(void)
{

// USART initialisieren
USART_Init(MYUBRR);

while (1)
{
  USART_String("Hallo!");
}



return 0;

void USART_Init( unsigned int ubrr)
{
/*Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
/* Set frame format: 8data, 1stop bit, no parity */
UCSRC = (3<<UCSZ0);

}


void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;

}

void USART_String (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        USART_Transmit(*s);
        s++;
    }
}
}
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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also ich beantworte mal von oben nach unten...

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

@Lasse:
#define FOSC 3579545// Clock Speed steht momentan auf 8000000 wegen int. Takt.
#define BAUD 9600
#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.

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jean Player (fubu1000)
Datum:

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

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Paul Baumann (Gast)
Datum:

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

MfG Paul

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.