UART sendet nicht

OP #850391
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!
#850463
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.
Persönliche Seite #850481
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.
OP #850494
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 */

}
Gast #850512
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 ?
OP #850818
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
Gast #851094
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
#851101
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

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