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
der Atmel senden und empfängt 8bit also 0-255 - was dein Programm damit macht können wir schlecht wissen.
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.
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
hterm kann sowas. Hat einige Macken, aber zumindest das geht :-) gtkterm kanns auch, das hat aber wesentlich mehr Problemstellen.
> 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.
> 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.