Forum: Mikrocontroller und Digitale Elektronik UART sendet nicht


von Rumpelstilzchen 1. (billson)


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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> kann mir jemand vielleicht meinen fehler zeigen?

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

von Rumpelstilzchen 1. (billson)


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

von Christian Erker (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Stefan B. (stefan) Benutzerseite


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.

von Rumpelstilzchen 1. (billson)


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 */

}

von Stefan B. (stefan) Benutzerseite


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.

von Ja mann (Gast)


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 ?

von Karl H. (kbuchegg)


Lesenswert?

Jetzt hab ich sie wiedergefunden:

http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

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

von Rumpelstilzchen 1. (billson)


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

von Rumpelstilzchen 1. (billson)


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

von Jens (Gast)


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

von Karl H. (kbuchegg)


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.

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.