Forum: Compiler & IDEs UND- Verkenüpfung


von Christian (Gast)


Lesenswert?

Bin Anfänger in Sachen Microcontroller programmieren. Möchte wissen wie
ich eine Und-Verknüpfung erstellen kann. Habe zwei Taster an PD0, PD1
und eine LED PB0. Möchte jetzt ein Programm schreiben, das mir die  LED
zum Leuchten bringt, wenn beide Taster gedrückt sind ansonsten soll es
aus bleiben. Hier mal der Code den ich bis jetzt habe:

#include<avr/io.h>
int main(void)
{
  int a=0;
  outp (0x01,DDRB);//LED
  outp (0x00,DDRD);//TASTER
  for(;;)
  {
    if (bit_is_set(PIND, PIND0)) //T1 gedrückt wird
    {
  if (bit_is_set(PIND, PIND0)) //T2 gedrückt wird
  sbi (PortB, 0);
    }
    cbi (PORTB, 0); //cbi aus
    }
}

Vielleicht erkennt ja jemand meinen Fehler.

von OldBug (Gast)


Lesenswert?

Zwei mal PIND0 statt einmal PIND0 und einmal PIND1 verwendet...

Gruß,
Patrick...

von Matthias (Gast)


Lesenswert?

Hi

#include<avr/io.h>
int main(void)
{
                //int a=0;
  DDRB = 0x01;  //outp (0x01,DDRB);//LED
  DDRD = 0;     //outp (0x00,DDRD);//TASTER
  for(;;)
  {
     if((PIND&0x03)==0x03) PORTB|=1;
     else PORTB&=(unsigned char)~1;
  }
}

Alles mit positiver Logik (Tastendruck gleich 1 und LED an gleich 1)

Matthias

von Sebastian Schildt (Gast)


Lesenswert?

Hi!

Ich weiß jetzt nicht genau, ob die bit_is_set Abfragen so richitg sind,
aber von der Logik her brauchst du die "if" nicht verschachteln. C
kennt das logische und "&&".

Damit sähe der Code so aus:

#include<avr/io.h>
int main(void)
{
  int a=0;
  outp (0x01,DDRB);//LED
  outp (0x00,DDRD);//TASTER
  for(;;)
  {
    if (bit_is_set(PIND, PIND0)  &&  bit_is_set(PIND, PIND1)) {
        sbi (PortB, 0);
    }
    else  {
         cbi (PORTB, 0); //cbi aus
    }
  }

MfG

Sebastian

von Thorsten (Gast)


Lesenswert?

Mit diesem Quellcode funktioniert es immer noch nicht. Das Lämpchen geht
immer noch an, wenn man nur einnen der Taster drückt. Ich weis jetzt
wirklich nicht mehr weiter wie das funktionieren soll.

#include<avr/io.h>
int main(void)
{
  outp (0x01,DDRB);//LED
  outp (0x00,DDRD);//TASTER
  for(;;)
  {
     if (bit_is_set(PIND, PIND1)  && bit_is_set(PIND, PIND0))
     {
  sbi (PORTB, 0);
     }
     else
     {
  cbi (PORTB, 0);
     }
   }
}

von Matthias (Gast)


Lesenswert?

Hi

was tut denn an meinem Code nicht? Sind die Tasten evtl. invertiert
angeschlossen? Dann kannst du bei meinem Code einfach "==0x03" durch
"==0x00" ersetzen.

Matthias

von mthomas (Gast)


Lesenswert?

Wie sind die Taster angeschlossen? Vielleicht "floaten" die Eingaenge.
Externe Pulldowns/-ups vorhanden? Interne Pullups fuer die Tasten-Pins
aktivieren?

von leo9 (Gast)


Lesenswert?

>> Habe zwei Taster an PD0, PD1 und eine LED PB0
Das ist jeweils ein "Beinchen" der Bauteile, wo gehen die anderen
Kontakte hin?

grüsse leo9

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.