UART @ ATmega640 - Kein Empfang

Gast #1425195
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
//======================================================================
Gast #1426229
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
//======================================================================
Gast #1426298
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

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