Forum: Compiler & IDEs USART Atmega16 komische Zeichen


von Bratensosse (Gast)


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

von Karl H. (kbuchegg)


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.




von Michael U. (Gast)


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

von Bratensosse (Gast)


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

von Christian Beuge (Gast)


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!

von Falk B. (falk)


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-Tutorial:_UART#Senden

MFG
Falk

von Frank J. (frajo)


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:
1
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

von Falk B. (falk)


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-Tutorial:_UART#Senden


MFG
Falk

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.