www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART sendet nicht


Autor: Rumpelstilzchen 123 (billson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versuche gerade mit dem uart eines atmega 16 ein zeichen an den pc 
zu übertragen. ich verwende hyperterminal, doch ich empfange garnichts. 
kann mir jemand vielleicht meinen fehler zeigen?



#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>



void main()
{

UBRRL=0x51; //0x67 Baudrate 9600 bei 16MHz Oszil freq//bei 8MHz 0x51

//UCSRA =0x40;
//UCSRB =0x48;
//UCSRC =0xff;
UCSRA|=(1<<TXC);
UCSRB|=(1<<TXEN);
UCSRC|=(1<<UMSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);

//sei();

  while (1)
  {

    senden();

  }
}


/*
ISR(USART_UDRE_vect)   //serieller interrupt
{
  gesendet=0;
  zeichen='240';
  UCSRB &= ~(1<<UDRIE);   // UDRE-Interrupt wieder sperren

}*/

void senden()
{

  UDR='a';

  //UCSRB |= (1<<UDRIE);   // UDRE-Interrupt freigeben


  while(UDR!=0)
  {}

}


danke für eure hilfe!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kann mir jemand vielleicht meinen fehler zeigen?

Jess. Das versuchen die Leute, die den UART Teil im AVR-GCC-Tutorial 
geschrieben haben.

Autor: Rumpelstilzchen 123 (billson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab das tutorial durchgemacht, leider hilft es mir auch nicht 
weiter.
vorallem dass ich meinen uart anders initialisieren muss da es ein 
atmega 16 ist, im tutorial glaub ich ein 8

Autor: Christian Erker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Atmega8 und 16 haben IIRC beide den gleich USART, bloss die Adresse ist 
anders.

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

Bewertung
0 lesenswert
nicht lesenswert
Rumpelstilzchen 123 wrote:
> ich hab das tutorial durchgemacht, leider hilft es mir auch nicht
> weiter.
> vorallem dass ich meinen uart anders initialisieren muss da es ein
> atmega 16 ist, im tutorial glaub ich ein 8

Die Unterschiede sind aber marginal, und für den Fall eines Mega16
auch im Tutorial beschrieben.

Die häufigsten Probleme:
* läuft dein µC auch wirklich mit der Taktfrequenz von 16Mhz?
  Das ist mit Abstand die häufigste Fehlerquelle
* Ist dein Kabel korrekt konfektioniert (gekreuzt / nicht gekreuzt)?
* Ist der Pegelwandler korrekt angeschlossen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rumpelstilzchen 123 wrote:
> ich hab das tutorial durchgemacht, leider hilft es mir auch nicht
> weiter.
> vorallem dass ich meinen uart anders initialisieren muss da es ein
> atmega 16 ist, im tutorial glaub ich ein 8

Komisch. Im aktuellen AVR GCC Tutorial sind die Unterschiede zwischen 
Atmega8 und Atmega16 bei den Registernamen und Bitnamen erklärt. 
Vielleicht hast du es überlesen oder eine uralte Version gelesen.

Autor: Rumpelstilzchen 123 (billson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe jetzt das tutorial nocheinmal gemacht, und zwar 1 zu 1 den code 
für den atmega 16kpiert, doch mein hyperterminal zeigt immer noch 
nichts...



#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

#ifndef F_CPU
#define F_CPU 8000000L    // Systemtakt in Hz, das L am Ende ist 
wichtig, NICHT UL verwenden!
#endif

#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, 
NICHT UL verwenden!

// 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-1000) // Fehler in Promille

#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu 
hoch!
#endif


void main()
{

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

    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;


  while (1)
  {

    senden();

  }
}


void senden()
{

    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich 
*/
    {
    }

    UDR = 'x';        /* schreibt das Zeichen x auf die Schnittstelle */

}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> Die häufigsten Probleme:
> * läuft dein µC auch wirklich mit der Taktfrequenz von 16Mhz?
>   Das ist mit Abstand die häufigste Fehlerquelle
> * Ist dein Kabel korrekt konfektioniert (gekreuzt / nicht gekreuzt)?
> * Ist der Pegelwandler korrekt angeschlossen.

Autor: Ja mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht man wenn nicht nicht weiß wo man suchen soll ? Genau, Fehler 
eingrenzen. In dem Fall: Oszi oder Logigtester an TXD des µC. Wenn was 
rauskommt richtung PC suchen, wenn nix rauskommt in der Software suchen.

Gibt es eigentlich einen Zähler, wie oft schon "Mein UART geht nicht" 
kam ?

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

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hab ich sie wiedergefunden:

http://www.mikrocontroller.net/articles/AVR_Checkl...

Da sind eigentlich so ziemlich alle Problemkreise bei einer UART
angesprochen.

Autor: Rumpelstilzchen 123 (billson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, das scheint nicht das problem zu sein, ich habe beim debugen ein 
problem entdeckt, ins schieberegister UDR wird nichts hineingeschrieben.
woran kann das liegen, habe ich vielleicht UCSR falsch deklariert?
mfg

Autor: Rumpelstilzchen 123 (billson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich weiß jetz was nicht geklappt hat, nur nihct warum:
wenn ich schreibe:
void senden()
{

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

wird das schiebereigister nicht beschrieben. doch wenn ich die 
whileschleife und die udr zuweisung vertausche bekomme ich den 
gewünschten wert.

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

}

jetzt stellt sich die frage warum das so ist????
mfg

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich nutze seit Jahren die interruptgesteuerten UART Funktionen aus der 
Application Note 306, Datei UART2.c. Die Funktionen sind leicht für alle 
AVRs anzupassen. Ich habe nie Probleme damit gehabt. Gerade der 
interruptgesteuerte Empfang ist sehr bequem.
Gruß Jens

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

Bewertung
0 lesenswert
nicht lesenswert
Rumpelstilzchen 123 wrote:

> wird das schiebereigister nicht beschrieben. doch wenn ich die
> whileschleife und die udr zuweisung vertausche bekomme ich den
> gewünschten wert.
...
> jetzt stellt sich die frage warum das so ist????

Weil der Simulator auch Fehler hat.
Die erste Version ist die richtige.

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.