Die letzte Frage habe ich übersehen.
Es geht auch
ich kann nur nicht sagen was den kleineren Code erzeugt, aber switch case ist für mich übersichtlicherCode:if(rxwert==0x38){
tu was
}
else if(rxwert==0x32){
tu was anderes
}
else if.........
Druckbare Version
Die letzte Frage habe ich übersehen.
Es geht auch
ich kann nur nicht sagen was den kleineren Code erzeugt, aber switch case ist für mich übersichtlicherCode:if(rxwert==0x38){
tu was
}
else if(rxwert==0x32){
tu was anderes
}
else if.........
switch/case ist mächtig aber geht nur für konstante Wertabfragen, if kann auch variablen vergleichen.Code:typedef unsigned char byte;
byte rx = 'a';
switch(rx)
{
case '0' : tuewas(); break;
case '5' : tuewasanderse(); break;
case '6': // wie bei 'b' - absichtlichkein break;
case 'b': nochwasanderes(); break;
case 0x38:
{
waslosbei8();
mach();
egal();
}
break;
default: nixlos(); // <- da haste Dein "else" sprich
// wenn sonst nix gewählt wurde
}
Danke euch beiden!!!
Habe mal folgendes geschrieben:
Jetzt bleibt die Led dauernt an, wenn ich Ziffer8 1-mal drücke.Code:while(1){
switch(rxwert){
case 0x38 :
PORTD |= (1<<PD5);/* Setzt Pin PB3 auf High */
break;
default:
PORTD &= ~ (1<<PD5);/* Setzt Pin PB3 wieder auf low */
break;
}
}
return(0);
}
Will aber die Led nur solange an sein wie auch der Taster gedrückt wird!
Wenn ich Ziffer8 gedrückt halte, geht die Led in intervall an uns aus.
Dachte, das mit default würde auch gehen. Oder habe ich da einen Denkfehler?
Da hast du einen Denkfehler. Wenn du am PC die 8 drückst, wird diese nur einmal übertragen. Bleibst du aber auf der Taste, dann wird die 8 im, auf dem PC eingestellten Rythmus wiederholt.
Wenn du das so willst wie geschildert, dann brauchst du eine Zeitschleife die sagt, Taste gedrückt, gewisse Zeit warten, Taste wieder gedrückt, weiterwarten, Taste nicht mehr gedrückt, Zeit abgelaufen, rücksetzen.
Das Steuern eines Bot über den PC ist für mich ohne entsprechenden PC-Programm nicht sehr sinnvoll. Speziell wenn man über das Hyper-Terminal steuern muss. Eine IR-Fernbedienung ist da sicher Sinnvoller, aber natürlich auch etwas aufwendiger.
Wie sieht jetzt Deine USART-RX-funktion aus - wird da auch noch auf den Port zugegriffen?
Ist Dir bewusst, daß die Datenübertragung zum uC langsamer als die Abarbeitungsgeschwindigkeit im uC ist?
Ist Dir bewusst, daß wenn Du kein Zeichen sendet, auch kein Zeichen übertragen wird?
Typischerweise, würde ich ein WindoofProgramm dann so schreiben, daß ein Steuerzeichen gesendet wenn "Taste gedrückt" und ein weiteres, wenn Taste wieder losgelassen wird.
Sprich im uC den Port nicht im switch.default löschen, sondern eben durch einen anderen Steuercode.
Je nachdem welche Daten Du noch übertrage willst, gehen Dir die Steuerzeichen irgendwann aus ;-) Also sollte aus den Steuerzeichen einen Befehlssequenz werden, typ. weise inkl. prüfsumme.
Auf uC-Seite würde ich nicht das vorhandensein von Zeichen im Puffer via Timer prüfen. Sondern ein flag setzen, wenn die Empfangssequenz vollständig ist ....
Hi,
danke euch beiden für die Antwort!
Also, mein bot soll alle input´s über den PC bekommen.
Dachte da an einen Visualbasic Programm zu erstellen, wo ich dann Daten über den Hyperterminal zum µC sende. (Später wenn diese Funktion funktioniert, dann die Daten per Funk schicken)
Wenn das so realisierbar ist mit VB und HT?
Oder gibt es eine andere Methode, die einfacher wäre?
Zu Hubert:
…auf dem PC eingestellten Rhythmus wiederholt.
- Was wäre, wenn man den Stoppit auf 0 setzten würde?
…Zeitschleife…
- meinst du die mit _delay_ms(10); ?
…ohne entsprechenden PC-Programm nicht sehr sinnvoll.
- Welches Programm meinst du?
Zu vajk:
…noch auf den Port zugegriffen?
- Nein wird es nicht, meinst das hier oder?
ISR(USART_RXC_vect){
rxwert= UDR;
}
…Befehlssequenz werden, typ. weise inkl. prüfsumme.
- Wie meinst du das?
@SimLock
> Wenn das so realisierbar ist mit VB und HT?
entweder - oder ! Nur eines der Programm kann auf die serielle Schnittstelle zugreifen ...
> …auf dem PC eingestellten Rhythmus wiederholt.
hä?
> - Was wäre, wenn man den Stoppit auf 0 setzten würde?
nonsense
> …Zeitschleife…
> - meinst du die mit _delay_ms(10); ?
ohhh neiiiinnnn ... ganz falscher Weg!
>…ohne entsprechenden PC-Programm nicht sehr sinnvoll.
> - Welches Programm meinst du?
na das was Du in VB schreiben willst .. menno
> …Befehlssequenz werden, typ. weise inkl. prüfsumme.
> - Wie meinst du das?[/quote]
aua²
sorry.
Also ... Du sprechen mit uns, nutzen nicht nur Buchstaben sondern Sätze und Wörter ...
.. Du sprechen mit Robby, Du nutzen nicht nur Einzelzeichen sondern Steuerbefehle die aus mehr "Zeichen" bestehen .. = Befehlssequenzen
... und die eben - besonders, wenn Du das per Funk machen willst - muß auch geprüft werden .. typisch ist hier zumindest einen Prüfsumme / CRC über das was übertragen wird angehängt ...
z.B. <34><234><fr434wdae>[crc] ...
- die 34 ist zb. ein Ausführungsbefehl, auf den eine Antwort erwartet wird
- die 234 der Befehl
- fr.. die Daten, die zum Befehl gehören
z.B: 234 = fahren, fr... = vorwärte 27 cm ....
Besonders wenn Du per funk steuerst, solltest Du auch Rückmeldungen an den PC liefern können, ob ein Befehl auch ausgeführt wird oder wurde, oder auch Abfragen, wie die Motortemperatur ist die Betriebsspannung ...
Dazu reichen nicht 0.255 Bit = 1 Byte !!!!
Kapischi?
> …auf dem PC eingestellten Rhythmus wiederholt.
hä?
Damit meinte ich die Zeichenwiederholung wenn man auf der Taste bleibt.
Aber auf den PC bin ich nicht so zuhause, da bin ich nur Anwender und werde mich daher aus der Diskussion ausklinken.
Hubert
Hi, danke euch beiden!!!
Werde erstmal fleißig weiter lesen uns später zurück kommen mit gezielten fragen. Bring ja nichts, wenn ich dauernt frage :-)
Edit:
Eine Frage hätte ich noch:
...eins verstehe ich nicht so ganz, wenn ich diesem Code benutzt und Daten zum PC schicke, funktioniert es, an PC wird ein W angezeigt + solange ich den Taster drücke leuchtet die Led. Warum kann man das nicht genau so einfach umgekehrt realisieren. Dann müsste es doch auch gehen, nur wenn ich statt Taster drücke, eine PC Taste drücke.
Werde erstmal weiter lesen und in paar Tagen, wenn ich wieder Fragen habe, die Fragen aufteilen und in Forum neue Themen erstellen.Code:while (1)
{
if (!( PIND & (1<<PIND2))) /* mache was wenn PinD2 low ist */
{
PORTB |= (1<<PB1); /* Led auf hig setzten */
x = 'W';
UDR = x;
_delay_ms(20);
PORTB &= ~ (1<<PB1); /* Led auf low setzten */
}
}
return 0;
}
Danke alle die mir bis jetzt geholfen haben!
Die PC-Tastatur ist zu schreiben ausgelegt, jeder Tastendruck ein Zeichen. Wenn du das so willst wie du geschrieben hast, dann musst du dir ein PC-Programm schreiben das den Tastendruck in deinem Sinne auswertet. Du musst dem Kontroller mitteilen: jetzt Taste gedrückt, jetzt Taste nicht mehr gedrückt.
In meinem Programm wird das "Taste nicht mehr gedrückt" durch das drücken der Taste 0 signalisiert.