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


von phil (Gast)


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
1
//-----------------------------------------------------------------------------
2
// Title      : UART senden
3
//-----------------------------------------------------------------------------
4
// Prozessor  : ATmega640
5
// Takt       : 16 MHz
6
// Sprache    : C
7
//-----------------------------------------------------------------------------
8
#define F_CPU 16000000
9
#include <avr\io.h>
10
//----------------------------------------------------------------------
11
void uartInit()
12
{
13
  UBRR0L  = 23;           //9600Baud siehe Baudratentabelle
14
  UCSR0B = 0x08;           //Sender enable UCSRB / UCR bei z.B.: 2313
15
}
16
//----------------------------------------------------------------------
17
void uartPutChar(char data)
18
{
19
  //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
20
  while (!(UCSR0A&32));
21
  //sende
22
  UDR0=data;
23
}
24
//----------------------------------------------------------------------
25
void print(char buffer[])
26
{
27
  for (int i=0;buffer[i]!=0;i++)
28
    uartPutChar(buffer[i]);
29
}
30
//======================================================================
31
main ()
32
{
33
  uartInit();
34
  while (true) // Mainloop
35
  {
36
    print("Hallo myAVR! ");
37
    
38
    
39
  }
40
}
41
//======================================================================

von ah (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

Ein UBRR von 23 ergibt bei 16MHz nie und nimmer 9600 Baud.

von phil (Gast)


Lesenswert?

stimmt, anstatt 23 muss 103 hin

von phil (Gast)


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

von phil (Gast)


Lesenswert?

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

1
Hallo, 
2
3
laut Datenblatt hat der ATmega 640/2560 4 UART einheiten. 
4
Bei deinem Quellcode ist für den Compiler nicht ersichtlich, welche Einheit genutzt werden soll. 
5
6
Versuch es bitte mal damit: 
7
8
//----------------------------------------------------------------------------- 
9
// Title : UART senden 
10
//----------------------------------------------------------------------------- 
11
// Prozessor : ATmega640 
12
// Takt : 16 MHz 
13
// Sprache : C 
14
//----------------------------------------------------------------------------- 
15
#define F_CPU 16000000 
16
#include <avr\io.h> 
17
//---------------------------------------------------------------------- 
18
void uartInit() 
19
{ 
20
UBRR0L = 103; //9600Baud siehe Baudratentabelle 
21
UCSR0B = (UCSR0B | 0x03); //Sender enable UCSRB / UCR bei z.B.: 2313 
22
} 
23
//---------------------------------------------------------------------- 
24
void uartPutChar(char data) 
25
{ 
26
//warte bis UDR leer ist UCSR0A / USR bei z.B.: 2313 
27
while (!(UCSR0A&103)); 
28
//sende 
29
UDR0=data; 
30
} 
31
//---------------------------------------------------------------------- 
32
void print(char buffer[]) 
33
{ 
34
for (int i=0;buffer[i]!=0;i++) 
35
uartPutChar(buffer[i]); 
36
} 
37
//====================================================================== 
38
main () 
39
{ 
40
uartInit(); 
41
while (true) // Mainloop 
42
{ 
43
print("Hallo myAVR! "); 
44
} 
45
} 
46
//======================================================================

von phil (Gast)


Lesenswert?

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

An welcher Stelle messe ich das am besten?

von Stefan E. (sternst)


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.
1
UCSR0B = (UCSR0B | 0x03);
1
while (!(UCSR0A&103));

von Stefan E. (sternst)


Lesenswert?

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

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

von phil (Gast)


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?

von Stefan E. (sternst)


Lesenswert?

phil schrieb:

> Aber der Code müsste so doch gehen?

Nein. Die beiden Zeilen sind Unsinn.

von spess53 (Gast)


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

von phil (Gast)


Lesenswert?

Danke euch - die Daten kommen an

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.