mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART @ ATmega640 - Kein Empfang


Autor: phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, habe mittels myAVR Workpad Plus versucht Daten per UART zu senden,
jedoch empfange ich nichts im Windows-HyperTerminal?

Einstellungen hab im im HTerminal wie folgt eingestellt:
Bit/s:9600 - Datenbits:8 - Parität: Keine - Stoppbit:1 - 
Flusssteuerung:Kein

Wäre schön wenn jemand weiter weiß

Danke
//-----------------------------------------------------------------------------
// Title      : UART senden
//-----------------------------------------------------------------------------
// Prozessor  : ATmega640
// Takt       : 16 MHz
// Sprache    : C
//-----------------------------------------------------------------------------
#define F_CPU 16000000
#include <avr\io.h>
//----------------------------------------------------------------------
void uartInit()
{
  UBRR0L  = 23;           //9600Baud siehe Baudratentabelle
  UCSR0B = 0x08;           //Sender enable UCSRB / UCR bei z.B.: 2313
}
//----------------------------------------------------------------------
void uartPutChar(char data)
{
  //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
  while (!(UCSR0A&32));
  //sende
  UDR0=data;
}
//----------------------------------------------------------------------
void print(char buffer[])
{
  for (int i=0;buffer[i]!=0;i++)
    uartPutChar(buffer[i]);
}
//======================================================================
main ()
{
  uartInit();
  while (true) // Mainloop
  {
    print("Hallo myAVR! ");
    
    
  }
}
//======================================================================


Autor: ah (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Baudrateregister ist 16 bit, weshalb werden nicht 16 bit geschrieben 
? Und wenn hyperterm nichts anzeigt, sollte man mal mit den Scope 
nachmessen.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein UBRR von 23 ergibt bei 16MHz nie und nimmer 9600 Baud.

Autor: phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, anstatt 23 muss 103 hin

Autor: phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, leider kommt im HyperTerminal noch nichts an - hab ich noch 
weitere Fehler?
Müssen auf der Karte noch PORTS miteinander verbunden werden?

Vielen Dank

Autor: phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der AVR-Support hat mir geholfen (siehe unten), aber im Terminal 
[Br@y++] kommt nur einmal <0> an, danach nichts mehr

Hallo, 

laut Datenblatt hat der ATmega 640/2560 4 UART einheiten. 
Bei deinem Quellcode ist für den Compiler nicht ersichtlich, welche Einheit genutzt werden soll. 

Versuch es bitte mal damit: 

//----------------------------------------------------------------------------- 
// Title : UART senden 
//----------------------------------------------------------------------------- 
// Prozessor : ATmega640 
// Takt : 16 MHz 
// Sprache : C 
//----------------------------------------------------------------------------- 
#define F_CPU 16000000 
#include <avr\io.h> 
//---------------------------------------------------------------------- 
void uartInit() 
{ 
UBRR0L = 103; //9600Baud siehe Baudratentabelle 
UCSR0B = (UCSR0B | 0x03); //Sender enable UCSRB / UCR bei z.B.: 2313 
} 
//---------------------------------------------------------------------- 
void uartPutChar(char data) 
{ 
//warte bis UDR leer ist UCSR0A / USR bei z.B.: 2313 
while (!(UCSR0A&103)); 
//sende 
UDR0=data; 
} 
//---------------------------------------------------------------------- 
void print(char buffer[]) 
{ 
for (int i=0;buffer[i]!=0;i++) 
uartPutChar(buffer[i]); 
} 
//====================================================================== 
main () 
{ 
uartInit(); 
while (true) // Mainloop 
{ 
print("Hallo myAVR! "); 
} 
} 
//======================================================================

Autor: phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer den Unterschied nicht sieht, aus UBRRL wurde UBRR0L usw.
<< Und wenn hyperterm nichts anzeigt, sollte man mal mit den Scope nachmessen.

An welcher Stelle messe ich das am besten?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das etwa die Antwort vom Support? Ernsthaft?

Alles folgende ist totaler Quatsch:

> Bei deinem Quellcode ist für den Compiler nicht ersichtlich, welche
> Einheit genutzt werden soll.
UCSR0B = (UCSR0B | 0x03);
while (!(UCSR0A&103));

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
phil schrieb:
> Wer den Unterschied nicht sieht, aus UBRRL wurde UBRR0L usw.

Hä? Du hattest die 0 doch schon im ersten Code drin.

Autor: phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry mein Fehler, der Support hat die Variante ohne 0 erhalten - die 
hab ich selbst erst später verändert

Aber der Code müsste so doch gehen?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
phil schrieb:

> Aber der Code müsste so doch gehen?

Nein. Die beiden Zeilen sind Unsinn.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Aber der Code müsste so doch gehen?

Nein. Du solltest die Beiträge auch Lesen

sternst schrieb

>Alles folgende ist totaler Quatsch:

>> Bei deinem Quellcode ist für den Compiler nicht ersichtlich, welche
>> Einheit genutzt werden soll.

>UCSR0B = (UCSR0B | 0x03);

>while (!(UCSR0A&103));

Und er hat Recht. Was soll z.B. das 103 bedeuten?

MfG Spess

Autor: phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch - die Daten kommen an

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.