Also verstehe ich das so, das der PC bei 1 Tastendrück ein Wert rüberschickt und ich erst nochmal drücken muss damit der µC den ersten Wert löscht?
Druckbare Version
Also verstehe ich das so, das der PC bei 1 Tastendrück ein Wert rüberschickt und ich erst nochmal drücken muss damit der µC den ersten Wert löscht?
Eine Taste am PC-Keyboard ist nunmal keine am uC .. die Logic ist drauf ausgelegt, Zeichen zu schreiben ... ganz vergleichbar einer Schreibmaschine ... wenn ich mich richtig erinnere, genieriert Windows nur zwei Messages: WM_KEYDOWN und WM_KEYUP - eine "KEYISPRESSED" mußt Du Dir selber bauen ...
Dazu kommt die Repeatfunktionalität der Tastatur, bei längerem Tastendruck.
Also nix, was Du direkt zur Fernschlatung nutzen kannst.
Wie oben schon erklärt, brauchst Du zwei Steuerwerte, die ausgewertet werden AN und AUS ... und wenn Du gut bist, implementierst Du noch ein Timeout, wenn das AUS nicht ankommt ... oder keine Steuerinformationen mehr ankommen. Eine Bidirektionale Kommunikation zur Steuerung wäre Vorteilhaft.
Tipp: gewöhne Dir delays ganz schnell wieder ab im uC-Code - insbesondere solange Du nicht mehr Erfahrung hast!
Überlege lieber, wie Du Timer geschickt einsetzen kannst ...
geschickt heißt z.B. daß Du mit Timern eine Tastenentprellung durchführst, gleichzeit auch erkennen kannst, daß eine Taste kurz oder lang gedrückt wurde ... bei Tastern am uC wohlmerkt.
Viel Erfolg weiterhin.
Das hört sich alles richtig an bei euch, leider bin ich nicht so weit und verstehe einige sachen noch nicht :-(
Aber warum funktioniert nicht sowas mit continue?
Dachte, solange die Taste nicht gedrückt wird, muss die Led aus sein und wenn ich die drücke müsste die leuten... <-- meine Logik ist voll falsch.
Ist doch schwierieger als ich dachte.
while(1){
switch(rxwert){
if(rxwert!=0x38){
PORTB &= (~ (1<<PB1));
continue;
}
if(rxwert==0x38){
PORTB |= (1<<PB1);
break;
}
}
}
Hab ihr irgendwo links wo ich das genau durchlesen könnte?
Wenn du die Taste die direkt am µC angeschlossen ist drückst, dann ist es richtig. Du Fragst die Taste aber auch kontinuierlich ab.
Über den UART bekommst du aber nur ein "diese Taste wurde gedrückt" aber kein "diese Taste wurde wieder losgelassen". Wenn du das willst musst du dir ein PC-Programm schreiben das genau das macht und es über den UART an den µC weitergibt.
Dein Codeschnippsel scheitert genau daran. Du sagst zwar unten "wenn 0x38 leuchtet Led" aber wie bekommst du das "wenn nicht 0x38". Ohne PC-Programm geht das nur durch drücken einer anderen Taste oder wie in meinem Programm durch drücken der Taste 0. Also der µC braucht das Kommando " Taste nicht mehr gedrückt", wie du das realisierst ist deine Sache.
Schreib doch mal den Code lesbarer!
Ich schließ mich meine Vorredner an, der PC muß beides senden,Code:int main(void)
{
InitAVR();
for(;;)
{
switch(rxwert)
{
if(rxwert == 0x11) // löschcode z.b.
{
PORTB &=~ (1 << PB1);
continue; // nicht unbedingt nötig
}
if(rxwert == 0x38)
{
PORTB |= (1 << PB1);
// break; wieso soll hier die Hauptschleife gelöscht werden
}
}
}
return(0);
}
Taste gedrückt - Taste losgelassen ...
So wie Du es bisher verwendest, weiß der uC nix davon, daß Taste losgelassen wird.
.. ist doch einfach zu verstehen !
Vielen Danke erstmal!
Kann erst morgen weiter testen. Heute leider keien Zeit...
So habe grade dein Code getestet, leider tut sich nicht bei mir...
InitAVR(); diese Zeile hab ich raus gelassen.
Trotzdem tut sich nichts, ist zwar eine forever schleife wie ich gesehen…
Theoretisch müsste das doch gehen mit deinen Code, komisch.
> Schreib doch mal den Code lesbarer!
das hatte ich mit Deinem Code gemacht .. ihn lesbarer gemacht und um einen Aus-Steuerbefehl ergänzt - mehr nicht (doch, kommentiert und das sinnlose break entfernt).
Und natürlich eine for(;;) - so weit ich mich erinnere macht der compiler draus einen jump - ein while(1) beinhaltet eine abfrage und dann einen jump - auch wenn das ein Befehl sein wird .. aber das ist assembler und hier nicht wirklich wichtig.
InitAVR(); << da gehören ALLE Initialisierungen rein. Und wenn Du das in Unterfunktionen aufgliedern willst, dann eben die Aufrufe dieser.
Wenn Du keine Initialisierungen machst, sind alle Ports Eingänge - menno!
Natürlich ändert sich nichts - Du mußt vom PC aus eben eine "mach-an" - Sequenz definieren und schicken UND Du mußt vom PC aus eine "mach aus"-Sequenz definieren und schicken ... Trichter aufn Kopf, reinkippen, verstehen oder hinnehmen!
Wen Du so weiter machst, biete ich Dir noch eine Sprechstunde am Telefon an :-)
Das mit der Sprechstunde am Telefon finde ich gut!
Ich übernehme auch die Kosten :-)
Bin grade paralle in VB Forum um ein Sende Formular zu erstellen.