Hallo nochmal,
habe mich schon einmal in einem anderen Thread an euch gewendet. Es geht
darum, das ich zwei uC des Typ 8051 über den P3.0(RxD) und P3.1(TxD) mit
einander verbinde. Dabei sollen die DIP-Werte von uC1 an den LEDs von
uC2 ausgegeben werden sollen. Andersherum sollen die DIP-Werte von uC2
an den LEDs von uC1 ausgegeben werden. Sobald man also den DIP-Wert
verstellt, sollen sich die LEDs am anderen Board auch verstellen. Dazu
habe ich nun ein kleineres Programm geschrieben. Leider finde ich meinen
Fehler nicht, hoffe ihr könnt mir helfen:
1
#include<stdio.h>
2
#include<KISS8051.h>
3
#include<REG52.h>
4
5
charWert,Wert1;//Deklaration
6
7
voidmain()
8
{
9
10
Wert1=1;//Wertzuweiseung
11
12
while(1)//Endlosschleife zum Abfragen
13
{
14
if(DIPs!=Wert1)//Wertüberprüfung
15
{
16
Wert1=DIPs;//Wertübergabe der DIPs
17
printf("%d",&Wert1);//Senden des DIP-Wertes
18
}
19
20
scanf("%d",&Wert);//schauen ob anderes Board gesendet hat
21
22
LEDs=Wert;//Wenn es gesendet hat, den Wert an den LEDs ausgeben
Leon Achterusch schrieb:> scanf("%d", &Wert); //schauen ob anderes Board gesendet hat
Das schaut nich nur, ob, sondern wartet auch, bis das andere gesendet
hat.
Das erinnert mich an dieses Gesetz, das mal ein Senator in den USA
beschlossen hat, nach dem ein Zug, wenn er an einem Bahnübergang einem
anderen Zug auf dem benachbarten Gleis begegnet, nicht weiterfahren
darf, bis der andere vorbeigefahren ist. Da das für beide gilt, warten
die dann bis zum Sankt-Nimmerleins-Tag.
Rolf Magnus schrieb:> Leon Achterusch schrieb:>> scanf("%d", &Wert); //schauen ob anderes Board gesendet hat>> Das schaut nich nur, ob, sondern wartet auch, bis das andere gesendet> hat.> Das erinnert mich an dieses Gesetz, das mal ein Senator in den USA> beschlossen hat, nach dem ein Zug, wenn er an einem Bahnübergang einem> anderen Zug auf dem benachbarten Gleis begegnet, nicht weiterfahren> darf, bis der andere vorbeigefahren ist. Da das für beide gilt, warten> die dann bis zum Sankt-Nimmerleins-Tag.
Achso, der bleibt also bei dem Scanf-befehl sitzen, bis der andere ihm
wirklich was gesendet hat ?! Dachte er schaut dann einmal an P3.1 nach,
ob wirklich was gesendet wurde und geht dann weiter.
Und schuldigung, das hätte ich zu schreiben sollen:
Schließe beide Boards an und alle LEDs leuchten. Passiert also nichts
wenn ich DIPs verstelle :/
Gruß
Leon A.
p.s. Super vielen Dank für die schnellen Antworten. Wirklich richtig
cool!
Leon Achterusch schrieb:> Und schuldigung, das hätte ich zu schreiben sollen:> Schließe beide Boards an und alle LEDs leuchten. Passiert also nichts> wenn ich DIPs verstelle :/
Geh doch schrittweise vor, von Anfang an, und versuche erst mal, auf
einem Board alleine für sich die LEDs nach den DIP-Schaltern zu
schalten. Dann, wenn das funktioniert, die serielle Verbindung zum
zweiten Board, und erst mal nur in eine Richtung.
Gibt es eigentlich ein Startup-File? Was wird denn vor main()
initialisiert?
Leon Achterusch schrieb:> Achso, der bleibt also bei dem Scanf-befehl sitzen, bis der andere ihm> wirklich was gesendet hat ?! Dachte er schaut dann einmal an P3.1 nach,> ob wirklich was gesendet wurde und geht dann weiter.
Wenn sich dein scanf() standardkonform verhält, dann nicht.
Dein Programm wäre aber auch dann nicht korrekt, denn du prüfst ja
nirgends, ob du was empfangen hast oder nicht.
> Leon Achterusch schrieb:> LEDs = Wert; //Wenn es gesendet hat, den Wert an den LEDs> ausgeben
Wo ist der "Wenn es gesendet hat"-Part? Du gibst einfach immer den Wert
an die LEDs aus.
Eine andere Sache, auf die du achten mußt:
Leon Achterusch schrieb:> printf("%d", &Wert1); //Senden des DIP-Wertes
Ich weiß nicht, ob deine C-Bibliothek einen Sendepuffer hat, aber meist
ist printf Zeilengepuffert, d.h. es werden nur dann Daten rausgesendet,
wenn entweder der Puffer voll ist oder eine Zeile abgeschlossen wurde.
Du solltest hier entweder nach dem Zeichen ein Zeilenende senden oder
nach dem printf() ein fflush(stdout) machen, damit du auch sicher sein
kannst, daß der Wert auch gesendet wird.