www.mikrocontroller.net

Forum: Compiler & IDEs USART Atmega16 komische Zeichen


Autor: Bratensosse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Bin gerade dabei des GCC Tut etwas durchzuarbeiten. Also habe ich mir 
heute einen Max232 geholt und habe mich mal an die USART Programmierung 
gewagt.

wenn ich nun versuche ein 'x' zu schicken, dann kommt ein ganz anderes 
Zeichen (copyrightzeichen)... Wenn ich versuche ein 'A' zu schicken 
kommt nur ein ü- raus.

Da ich an den Fusebits noch nix rumgestellt habe, läuft der Atmega16 mit 
1MHz. Kann es sein, dass der interne Takt zu ungenau ist? Oder muss 
etwas bestimmtes am Hyperterminal eingestellt werden?

Meine Einstellungen vom HT sind:

BIT / Sekunde: 9600
Datenbits: 8
Parität: Keine
Stopbit: Keines
Flussteuerung: Kein

und hier mein Code:
#include <avr/io.h>
#include <stdint.h>


#ifndef F_CPU
#define F_CPU 1000000           /* Oszillator-Frequenz in Hz */
#endif

#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)

#define UART_BAUD_RATE 9600


int main (void)
{

  //-------------Init--------------------------------

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

        UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 
);
        UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );

  //-------------Programm-----------------------------

  while(!(UCSRA & (1<<UDRE)))
  {}
  UDR = 'A';


  return 0;
}

Vielen Dank schonmal
Gruß
Ich

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

Bewertung
0 lesenswert
nicht lesenswert
Deine HT Einstellungen schauen gut aus.

interner Oszi ist bei zeitkritischen Dingen immer
ein Problem. Besser ist es auf jeden Fall, wenn du
einen Quarz benutzt.

Ändere dein main() mal dahingehend um, dass
der µC ständig ein Zeichen schickt.

  while( 1 ) {
    while(!(UCSRA & (1<<UDRE)))
    {}
    UDR = 'A';
  }

Ich hatte das schon manchmal, dass auf PC Seite die
Synchronisierung mit dem ersten Zeichen nicht richtig
klappte.




Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte schon recht genaue und ziemlich ungenaue AVR mit internem Takt 
im Lieferzustand...

Ein Tipp kam oben schon, dazu kannst Du ja mal als F_CPU 50kHz mehr oder 
weniger probieren.

Gruß aus Berlin
Michael

Autor: Bratensosse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ihr, danke schonmal für euere Antworten,

des in der while(1) schleife hatte ich auch schonmal drinnen, leider 
zickt dann des HT und ich habe eine cpu auslastung von 100% und es 
dauert ewig des HT zu beenden....:-(

ich werde jetzt mal versuchen mit der F_CPU ein bissel zu spielen. 
Anderer seits Hätte ich auf dem board hier auch 2 Quarzoszillatoren. Bin 
da aber etwas vorsichtig was die fuses angeht, stimmt es dass ich 
einfach die CKSEL Haken im ponyprog rausnehme und dann an XTAL1 diesen 
Takt dran hänge?

Oder muss ich dabei noch mehr beachten?

danke schonmal:-)

Gruß
Ich

Autor: Christian Beuge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bratensoße!

Hast Du schon die Lösung Deines Problems gefunden? Ich habe gestern 
(nacht) auch die UART in Betrieb genommen, bekomme jedoch noch nicht das 
zurück, was ich erwarte, aber zumindest wird was gesendet. Ich arbeite 
mit einem ATMega 169, welcher mit Windows XP / AVR Studio programmiert 
wird. Wäre super, wenn Du "die Lösung Deines Problems" posten könntest 
(oder stell es bei mir rein... DANKE!!!)

Gruß Christian

P.S.: Auch wenn Du andere Infos hast, wäre super, wenn Du mir die 
Listings schicken könntest!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Bratensosse

>Da ich an den Fusebits noch nix rumgestellt habe, läuft der Atmega16 mit
>1MHz. Kann es sein, dass der interne Takt zu ungenau ist? Oder muss
>etwas bestimmtes am Hyperterminal eingestellt werden?

1001++

http://www.mikrocontroller.net/articles/AVR-Tutori...

MFG
Falk

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Lies doch mit Deinem Programmiergerät den OSCCAL Wert für die benutzte 
Taktfrequenz aus Deinen Prozessor aus. In der Initialisierung dann 
einfach zuweisen:
OSCCAL = 0x4C;  // Für 0x4c den Wert für Deinen Prozessor einsetzen
Der OSCAL Wert ist für jede intern erzeugte Taktfrequenz und bei jedem 
Prozessor verschieden.

Gruß
Frank

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Frank Jonischkies

>Der OSCAL Wert ist für jede intern erzeugte Taktfrequenz und bei jedem
>Prozessor verschieden.

Und gilt nur für eine eng tolerierte Spannung (5v?) und Temperatur 
(25C?).

Ich wiederhole mich.

http://www.mikrocontroller.net/articles/AVR-Tutori...


MFG
Falk

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.