USART Atmega16 komische Zeichen

Gast #497568
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
#497589
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.



Gast #497592
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
Gast #497607
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
Gast #542560
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!
#542712
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren