www.mikrocontroller.net

Forum: Compiler & IDEs UART Übertragungsproblem


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe mit Hilfe vom Tutorial folgenden C-Code erstellt:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>


#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 8000000UL    // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
#endif
 
#define BAUD 9600UL          // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif

  
void init(void)
{  
  UCSR0B  |= (1<<TXEN0);                // UART TX einschalten
    UCSR0C   |= (1<<UCSZ01)|(1<<UCSZ00);    // Asynchron 8N1 
 
    UBRR0H = UBRR_VAL >> 8;
    UBRR0L = UBRR_VAL & 0xFF;
}


int uart_putc(unsigned char c)
{
      while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
      {
      }                             
 
      UDR0 = c;                      /* sende Zeichen */
      return 0;
}
 
 
/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char *s)
{
      while (*s)
      {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
      uart_putc(*s);
      s++;
      }
}

void senden (uint16_t send_help)
{
    char s[7];
    uint16_t i = send_help;
   
       //uart_init();
 
       itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
       uart_puts( s );
 
       // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:
       //uart_puts( itoa( i, s, 10 ) );
}



int main(void)
{

init();
while(1)
{
  senden('A');
}

}


Ich hatte diesen Code in einem anderen Programm mit eingebaut. Am Anfang
hat alles wunderbar funktioniert, doch jetzt bekomme ich nur noch 
komische Zeichen ausgegeben. Um dem Fehler auf den Grund zu gehen hab 
ich eben nur diesen Code auf den Controller (mega88) aufgespielt, aber 
auch hier kommen nur komische Zeichen an bzw. in HyperTerminal kommt 
sogar gar nichts an. Die Empfangsprogramme sind auf 9600Baud eingestellt 
mit 8 Datenbit und 1 Stoppbit.
Hab ich oben irgendeinen Fehler mittlerweile mit eingebaut?

Hoffe ihr könnt mir helfen.

Gruß
Daniel

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber richtig strange ist, dass wenn ich den Takt auf 1MHz und 4800Baud 
runternehm, dann wird einwandfrei übertragen.

Autor: Norgan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interner RC Oszillator? Sein nix gut für genaues RS232 Timing. Müssen 
kalibriert werden. Auf internen Takt-Teiler müssen Du achten auch.
Besser gehen externer Baudraten-Quarz mit zwei Kondensatoren. Kost fast 
nix. Kriegst du < 1 Euro. Machen viel mehr Spaß.

Extra aufpassen müssen bei Fuse setzen.

Steht alles in Tutorial. Guggst du.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Norgan:
Auf so eine dumme Antwort kann ich auch verzichten!!!
Und außerdem geht es auch mit dem internen Takt!!!
Habe den Fehler gefunden.

Autor: Norgan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Krass Alder, bist da suapa Hacker mit voll die Ansprüche hier.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> Aber richtig strange ist, dass wenn ich den Takt auf 1MHz und 4800Baud
> runternehm, dann wird einwandfrei übertragen.

Was soll das heissen wenn Du den Takt "runternimmst". Mal etwas genauer 
und vor allem welchen Quarz verwendest Du? Interner Oszillator ist 
generell nicht geeignet fuer die USART, wurde ja schon gesagt.

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.