Forum: Mikrocontroller und Digitale Elektronik Steuerzeichen Empfangen UART MEGA32


von TanjaF (Gast)


Lesenswert?

Hallo liebe Gemeinde!!!

Ich bin gerade dabei, eine Kommunikation zw. 2 AVR ATMEGA32 aufzubauen.
Das Senden der Daten funktioniert, wenn der 1. MEGA sendet empfängt mein 
Putty die Daten, der 2 MEGA reagiert auf Daten die ich ihm mit Putty 
Sende.

Nur leider bekomme ich keine Anzeige der Steuerzeichen 0..32 (ASCII) 
oder nur komische Reaktionen auf dem Terminal. Was macht der AVR damit 
wenn er die Zeichen empfängt? kann man das emfangene Steuerzeichen über 
den Absoluten wert auswerten?

Also das ich quasi 0..255 mit einem Zeichen übertragen kann??

vielen Dank für eure Hilfe

Liebe Grüße

von Peter II (Gast)


Lesenswert?

der Atmel senden und empfängt 8bit  also 0-255 - was dein Programm damit 
macht können wir schlecht wissen.

von Thomas Forster (Gast)


Lesenswert?

Ein Terminalprogramm ist ja auch deshalb Terminal, weil es Steuerzeichen 
verarbeitet, wie z.B CR und LF.

Du willst die empfangenen Daten einfach nur ansehen, z.B als Hex oder 
Dezimal.
Ein fertiges Programm kenne ich auf Anhieb nicht.
Eine Möglichkeit: Die Daten vom Terminalprogramm mitloggen lassen und 
die Datei dann im Hexeditor ansehen.

von TanjaF (Gast)


Lesenswert?

Peter II schrieb:
> der Atmel senden und empfängt 8bit  also 0-255 - was dein Programm
> damit
> macht können wir schlecht wissen.


den hätte ich wohl auch posten sollen... Tut mir leid

Die Positionsroutinen für den Modellbauservo sind von meinem Prof und 
die darf ich hier nicht veröffentlichen.
1
#define F_CPU 4000000UL
2
#define BAUD 125000UL
3
#include <avr\io.h>
4
#include <avr\interrupt.h>
5
6
7
void init_timer1 (void);
8
void init_UART (void);
9
char uart_recv (void);
10
11
typedef union
12
{
13
   uint32_t      myLong;
14
   uint8_t       myChar[4];
15
} data32bit;
16
data32bit axPos;
17
18
19
int main (void)
20
{
21
  axPos.myChar[0]=uart_recv;
22
  axPos.myChar[1]=uart_recv;
23
  axPos.myChar[2]=uart_recv;
24
  axPos.myChar[3]=uart_recv;
25
  
26
  asm volatile ("SEI");
27
  
28
  while (1)
29
  {
30
    asm volatile ("NOP");
31
  }
32
33
  
34
}
35
36
37
void init_UART (void)
38
{  
39
  unsigned long UBRRVAL=((F_CPU/(16*BAUD))-1);
40
  UBRRH = (char)(UBRRVAL>>8);
41
  UBRRL = (char) UBRRVAL;
42
  
43
  UCSRB = (1<<RXEN)|(1<<TXEN);
44
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS);
45
}
46
47
char uart_recv (void)
48
{
49
    while (!(UCSRA & (1<<RXC)))
50
    {
51
    }
52
      return UDR;
53
}


Aber der Hauptzweck ist es, einen 32BIT Integer zu übertragen. Also mit 
Union zerlegen und wieder zusammensetzen.

Warum ich überhaupt frage ist, ich kann die Steuerzeichen 0...32 nicht 
senden und somit auch nicht genau simulieren ob es funktioniert.

Habe ich das richtig verstanden das es dem AVR egal ist ob er ein 
Steuerzeichen bekommt?? Ergo empfängt er das Zeichen im UDR und das kann 
ich dann auslesen

Danke nochmals

von g457 (Gast)


Lesenswert?

hterm kann sowas. Hat einige Macken, aber zumindest das geht :-) gtkterm 
kanns auch, das hat aber wesentlich mehr Problemstellen.

von Thomas E. (thomase)


Lesenswert?

> Habe ich das richtig verstanden das es dem AVR egal ist ob er ein
> Steuerzeichen bekommt?? Ergo empfängt er das Zeichen im UDR und das kann
> ich dann auslesen
Nicht einmal der grösste Computer, den die Menschheit jemals bauen wird, 
wird irgendeinen blassen Schimmer davon haben, was ein Steuerzeichen 
ist.
Das gilt somit auch für einen AVR. Ein UART empfängt 8 Bit. Wie dieses 
Byte interpretiert wird, ist einzig und allein Sache der Software, die 
dahinter steckt. Mal abgesehen von XON/XOFF vielleicht.

mfg.

von g457 (Gast)


Lesenswert?

> Aber der Hauptzweck ist es, einen 32BIT Integer zu übertragen. Also mit
> Union zerlegen und wieder zusammensetzen.

Noch einfacher (und auch einfacher zu debuggen) ist es wenn Du eine 
Stringrepräsentation überträgst - zumindest wenn es die 
Laufzeitbedingungen zulassen.

von Matthias Li. (Gast)


Lesenswert?

Thomas Eckmann schrieb:

> Das gilt somit auch für einen AVR. Ein UART empfängt 8 Bit. Wie dieses
> Byte interpretiert wird, ist einzig und allein Sache der Software, die
> dahinter steckt. Mal abgesehen von XON/XOFF vielleicht.
>
> mfg.

Ahh, jetzt ist der "Groschen gefallen".

Vielen Vielen Dank an Thomas Eckmann und an alle Anderen die mir 
geholfen haben!!!

Viele grüße

von Peter II (Gast)


Lesenswert?

TanjaF schrieb:
> int main (void)
> {
>   axPos.myChar[0]=uart_recv;
>   axPos.myChar[1]=uart_recv;
>   axPos.myChar[2]=uart_recv;
>   axPos.myChar[3]=uart_recv;

wenn hier einmal etwas verloren geht, dann hast geht nichts mehr.

So einfach kann man nicht binary Daten übertragen, da musst du dir noch 
ein Protokoll einfallen lassen. Für den Anfang ist es einfacher es als 
HEX zu übertragen.

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.