Forum: Mikrocontroller und Digitale Elektronik PORT-Frage: Active Low


von Anfänger (Gast)


Lesenswert?

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ß

von Tip (Gast)


Lesenswert?

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.

von Anfänger (Gast)


Lesenswert?

Hallo,
und wie schaff ich es dann,dass es nur einmal gesendet wir?
Zur Frage eins noch: Passt das mit dem Active Low?

von Uwe (Gast)


Lesenswert?

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;
    }
   }

von Uwe (Gast)


Lesenswert?

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;
    }
   }

von Anfänger (Gast)


Lesenswert?

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?!

von Uwe (Gast)


Lesenswert?

Nö jeder button braucht seine eigene Hilfsvariable also push1 und push2

von Anfänger (Gast)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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;
    }
 }

von Tip (Gast)


Lesenswert?

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

von Anfänger (Gast)


Lesenswert?

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;
    }

von Falk B. (falk)


Lesenswert?

@  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

von Uwe (Gast)


Lesenswert?

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;
    }

von Uwe (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.