Hallo Liebe Community,
ich arbeite gerade an einem Projekt für die Schule, mit dem Ziel ein
Kettenfahrzeug, dessen Motoren über ein µC-Board gesteuert werden, mit
einem USB-Joystick über den PC zu steuern.
Das ganze funktioniert auch soweit ganz gut.
Das Fahrzeug lässt sich per Kabel über die serielle Schnittstelle
wunderbar steuern.
Nun möchte ich aber das Kettenfahzeug nicht dauerhaft am Kabel hängen
haben.
Deshalb habe ich mir einen Funk-Sender und einen Empfänger von Aurel
besorgt.
Ich habe zwei µC-Boards, die Exakt gleich aufgebaut sind (Der Schaltpan
ist im Anhang.
Mein Plan ist, Das eine Board mit dem PC zu verbinden und von dort die
Befehle per Funk weiter an das zweite Board(am Fahrzeug) zu Senden.
Um einen geeigneten Code zu finden, habe ich das ganze erstmal mit einer
Kabelverbindung zwischen den Boards und einem simplen Programm, bei dem
vom PC ein Byte mit einem Wert von 0-255 gesendet wird, das auf dem
zweiten Board auf PORTB ausgegeben wird, ausprobiert.
Und da liegt mein Problem:
Im Augenblick versuche ich das Signal, welches vom Pegelwandler auf dem
ersten Board ausgegeben wird, direkt an das zewite Board weiterzuleiten.
Hierfür habe ich PD0(RXD) vom ersten µC mit PD0(RXD) vom zweiten µC
verbunden.
Dies funktioniert nicht.
Wenn ich allerdings zusätzlich noch PD1(TXD) von µC eins mit PD1(TXD)
von µC zwei verbinde, funktioniert alles einwandfrei.
Ich frage mich, warum sowohl RXD als auch TXD verbunden sein müssen,
obwohl eigentlich nur in eine Richtung gesendet wird.
Ich hoffe, ich konnte mein Problem deutlich machen und bitte meine
Ausdrucksweise zu entschuldigen.
Ich bin noch neu in der µC-Programmierung :-).
Hoffentlich könnt ihr mir helfen. Für konstruktive Kritik und Vorschläge
für eine alternative Lösung bin ich immer dankbar.
Hier ist das Programm vom zweiten µC:
1 | #define F_CPU 16000000UL
|
2 | #define BAUD 1200UL
|
3 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
4 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
5 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
6 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
7 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
8 | #endif
|
9 | #include <avr/io.h>
|
10 | #include <avr/interrupt.h>
|
11 |
|
12 | ISR(USART_RXC_vect)
|
13 | {
|
14 | cli();
|
15 | PORTB=UDR;
|
16 | sei();
|
17 | }
|
18 | void init(void)
|
19 | {
|
20 | DDRB=255;
|
21 | UBRRH = UBRR_VAL >> 8;
|
22 | UBRRL = UBRR_VAL & 0xFF;
|
23 | UCSRB |=(1<<RXEN)|(1<<RXCIE);
|
24 | UCSRC |= (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL);
|
25 | sei();
|
26 |
|
27 | }
|
28 |
|
29 |
|
30 | int main(void)
|
31 | {
|
32 | init();
|
33 | while(1)
|
34 | {
|
35 |
|
36 | }
|
37 | return 0;
|
38 | }
|