Hallo, ich habe 2 Anfängerfragen zu digitalen Eingängen bzw. Tastern. Wäre nett, wenn mir jemand weiterhelfen könnte. 1) Wenn ich ein Taster drücke und er gibt entsprechend dem unten aufgeführten Ausschnitt BUTTON 2 zurück, handelt es dabei um einen Active Low Kontakt? Bei geöffnetem Schalten wird mittels Pull-Up der Pegel auf log. 1 gezogen, bei geschlossenem auf log. 0. DDRF = 0x00; PORTF |= ( 1 << PF0 ) | ( 1 << PF1 ); for(;;) { button2 = ( ( PINF & ( 1 << PF0 ) ) ); button1 = ( ( PINF & ( 1 << PF1 ) ) ); if( button2 == 0 ) { uart_sends( "BUTTON 2" ); } } 2) Wenn ich den Taster 1mal drücke erscheint am HyperTerminal mehrmals BUTTON 2. Wie kann ich das am besten bewerkstelligen, dass bei einmaligem Drücken nur einmal gesendet wird. Gruß
Anfänger schrieb: > Wenn ich den Taster 1mal drücke erscheint am HyperTerminal mehrmals > BUTTON 2. In deiner Programmschleife wird bei jedem Durchlauf der Text "Button 2" ausgegeben, sofern die Bedingung erfüllt ist. Die Anzahl der Ausgaben zeigt dir also, wie schnell dein Programm läuft.
Hallo, und wie schaff ich es dann,dass es nur einmal gesendet wir? Zur Frage eins noch: Passt das mit dem Active Low?
Sozusagen ne kleine Statemachine Aber die hilft nichts wenn du den Taster nicht entprellt hast (entprellen kann man Hardwaremäßig mit RC oder Softwareseitig mit nem einfachen Digitale Filter) eventuell kann man auch den Pinchange inteupt dafür verwenden muß du mal ins Datenblatt gucken ob der Controller dafür geeignet ist warscheinlich aber nicht) DDRF = 0x00; PORTF |= ( 1 << PF0 ) | ( 1 << PF1 ); button2was1=0; for(;;) { button2 = ( ( PINF & ( 1 << PF0 ) ) ); button1 = ( ( PINF & ( 1 << PF1 ) ) ); if( button2 == 1 ) { button2was1=1 } if( (button2==0) && (button2was1==1) { uart_sends( "BUTTON 2" ); button2was1=0; } }
ups ne klammer vergeseen (also code ist nicht getestet, sollte aber gehen) DDRF = 0x00; PORTF |= ( 1 << PF0 ) | ( 1 << PF1 ); button2was1=0; for(;;) { button2 = ( ( PINF & ( 1 << PF0 ) ) ); button1 = ( ( PINF & ( 1 << PF1 ) ) ); if( button2 == 1 ) { button2was1=1 } if( (button2==0) && (button2was1==1)) { uart_sends( "BUTTON 2" ); button2was1=0; } }
Hallo, Danke für die Antwort! Also mit BUTTON 2 funktioniert das einwandfrei. Nur bei BUTTON 1 erhalte ich nicht den gewünschten Effekt. Sprich es wird mehrmals BUTTON 1 gesendet. unsigned int button1 = 0; unsigned int button2 = 0; unsigned int push = 0; for(;;) { button2 = ( ( PINF & ( 1 << PF0 ) ) ); button1 = ( ( PINF & ( 1 << PF1 ) ) ); if( button2 == 1 ) { push = 1; } if( button2 == 0 && push == 1 ) { uart0_sendscr("PUSH BUTTON 2"); push = 0; } if( button1 == 1 ) { push = 1; } if( button1 == 0 && push == 1 ) { uart0_sendscr("PUSH BUTTON 1"); push = 0; } } Ist das dann wohl auf die Problematik des Entprellens zurückzuführen?!
Hmmm, es will einfach nicht. Wenn ich nun zwei Hilfsvariablen verwende, klappts bei BUTTON 2, aber bei BUTTON 1 geht gar nichts mehr. Zum Haare raufen.
unsigned int button1 = 0; unsigned int button2 = 0; unsigned int push1 = 0; unsigned int push2 = 0; for(;;) { button2 = ( ( PINF & ( 1 << PF0 ) ) ); button1 = ( ( PINF & ( 1 << PF1 ) ) ); if( button2 == 1 ) { push2 = 1; } if( button2 == 0 && push2 == 1 ) { uart0_sendscr("PUSH BUTTON 2"); push2 = 0; } if( button1 == 1 ) { push1 = 1; } if( button1 == 0 && push1 == 1 ) { uart0_sendscr("PUSH BUTTON 1"); push1 = 0; } }
Ein Tip: Spiel das ganze im Simulator durch, überlege, was bei jedem Schritt passieren soll und vergleiche das mit dem, was tatsächlich passiert. Dann wirst du schnell sehen, wo etwas anders abläuft, als du es dir vorstellst. MfG
Also ich blicks langsam gar nicht mehr. Hab einen völligen Knoten im Kopf. Wenn ich nun !( PINF & ( 1 << PF1 ) ) schreibe klappts plötzlich. Aber warum? Ich setzte doch meine PINs auf high. Sprich ich schalte mein Pull-UP Widersstand, der den Pegel bei geöffnetem Schalter auf logisch 1 zieht. Sprich ich erhalte beim drücken des Schalters eine 0 zurück... Ich raffs nicht mehr button2 = ( ( PINF & ( 1 << PF0 ) ) ); PORTF = 0xFF; /* set PORTF high */ DDRF = 0x00; /* set PORTF for input */ usart0_init( UBRR_VAL); usart1_init( UBRR_VAL ); SPI_MasterInit(); unsigned int button1 ; unsigned int button2 ; unsigned int push1 = 0; unsigned int push2 = 0; for(;;) { button2 = ( ( PINF & ( 1 << PF0 ) ) ); button1 = ( !( PINF & ( 1 << PF1 ) ) ); if( button2 == 1 ) { push2 = 1; } if( button2 == 0 && push2 == 1 ) { uart0_sendscr("PUSH BUTTON 2"); push2 = 0; } if( button1 == 1 ) { push1 = 1; } if( button1 == 0 && push1 == 1 ) { uart0_sendscr("PUSH BUTTON 1"); push1 = 0; }
@ Anfänger (Gast) >Also ich blicks langsam gar nicht mehr. Hab einen völligen Knoten im >Kopf. Wenn ich nun !( PINF & ( 1 << PF1 ) ) schreibe klappts plötzlich. >Aber warum? Ich setzte doch meine PINs auf high. Nix da, deine Kommentare und damit dein Verständnis sind falsch.
1 | DDRF = 0x00; /* set PORTF for input */ |
2 | PORTF = 0xFF; /* set PORTF pull-Ups active */ |
Guggst du hier http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Pullup-Widerstand MFG Falk
mit operator & wird bitweise AND verknüpft und mal nach dem wort "ausmaskieren" googlen PORTF = 0xFF; /* set PORTF high */ DDRF = 0x00; /* set PORTF for input */ usart0_init( UBRR_VAL); usart1_init( UBRR_VAL ); SPI_MasterInit(); unsigned int button1 ; unsigned int button2 ; unsigned int push1 = 0; unsigned int push2 = 0; for(;;) { button2 = ( ( (~PINF) & ( 1 << PF0 ) ) ); button1 = ( ( (~PINF) & ( 1 << PF1 ) ) ); if( button2 == 1 ) { push2 = 1; } if( button2 == 0 && push2 > 0 ) { uart0_sendscr("PUSH BUTTON 2"); push2 = 0; } if( button1 == 1 ) { push1 = 1; } if( button1 == 0 && push1 > 0 ) { uart0_sendscr("PUSH BUTTON 1"); push1 = 0; }
ups natürlich quatsch PORTF = 0xFF; /* set PORTF high */ DDRF = 0x00; /* set PORTF for input */ usart0_init( UBRR_VAL); usart1_init( UBRR_VAL ); SPI_MasterInit(); unsigned int button1 ; unsigned int button2 ; unsigned int push1 = 0; unsigned int push2 = 0; for(;;) { button2 = ( ( (~PINF) & ( 1 << PF0 ) ) ); button1 = ( ( (~PINF) & ( 1 << PF1 ) ) ); if( button2 > 0 ) { push2 = 1; } if( button2 == 0 && push2 == 1 ) { uart0_sendscr("PUSH BUTTON 2"); push2 = 0; } if( button1 > 0 ) { push1 = 1; } if( button1 == 0 && push1 == 1 ) { uart0_sendscr("PUSH BUTTON 1"); push1 = 0; }
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.