Forum: Mikrocontroller und Digitale Elektronik Verstehe nicht warum Input nicht gemessen wird.


von Shibby (Gast)


Lesenswert?

Hi Leute,
Bin noch ein anfänger und habe ein kleines Problem in meinem 
Testprogramm.
Ich kann einen Taster and PORTD0 anschließen und der Tastendruck wird 
wahrgenommen. Aber wenn ich PORTD0 mit irgendeinem Pin von PORTB 
verbinde (wo alle pins 1 ausgeben) dann wird dies nicht mehr 
registriert. Hier ist mein code:

#include <avr/io.h>

#define true 1
#define false 0
#define bool unsigned char

int main(void)
{
  DDRB = 0xFF;
  DDRL = 0xFF;

  DDRD = 0x00;
  PORTD = 0xFF;

  PORTL = 0x00;
  PORTB = 0xFF;

  bool isDown = false;
  char outputVar = 0;

  while (true)
  {
    if (!(PIND & 1 << PIND0) && !isDown)
    {
      outputVar++;
      isDown = true;
    }
    else if ((PIND & 1 << PIND0) && isDown)
      isDown = false;

    PORTL = outputVar;
  }

  return 0;
}

Zwar prellt der Taster noch, aber das ist mir im Moment egal. Ich möchte 
eigentlich nur verstehen warum das nicht mit einer Verbindung zwischen 
PORTB und PORTD funktioniert wie bei der Verbindung von Taster zu PORTD. 
Was mache ich falsch?

Gruß,
Shibby

von Ich (Gast)


Lesenswert?

Auf den ersten Blick hängt dein Problem mit der Thematik hier zusammen: 
http://www.fh-wedel.de/~si/vorlesungen/c/ausdruecke/operatoren.html

von Shibby (Gast)


Lesenswert?

Danke für die Antwort, aber ich sehe nicht wie die Operatorenabfolge das 
Problem verursacht. Könntest du vielleicht erläutern wo genau du das 
Problem siehst? Oder liegt es vielleicht doch an was anderem?

Gruß,
Shibby

von holger (Gast)


Lesenswert?

>Könntest du vielleicht erläutern wo genau du das
>Problem siehst?

Kleiner Tip:
Lieber mal ein paar Klammern mehr setzen.
Auch wenn man denkt sie wären nicht nötig.

von Shibby (Gast)


Lesenswert?

Ich glaube mir leuchtets ein. So richtig?
if (!(PIND & (1 << PIND0)) && !isDown)

Ich schreibe normalerweise nur Windows apps mit C++ und C# und benutze 
daher nie << (jajaja overloaded << operators für Objekte schon aber auch 
kaum). Ich wusste garnicht dass es ne höhere Precedence als & hat 
(sofern ich jetzt richgig liege).

von Tim S. (maxxie)


Lesenswert?

Shibby schrieb:
> Danke für die Antwort, aber ich sehe nicht wie die Operatorenabfolge das
> Problem verursacht. Könntest du vielleicht erläutern wo genau du das
> Problem siehst? Oder liegt es vielleicht doch an was anderem?
>
> Gruß,
> Shibby

Da das Shifting mit 0 arbeitet funktioniert es zufällig
Für alle anderen Werte baust du mist, weil du erst alles ausser bit0 
herausmaskierst und das Ergebnis dann shiftest. Du willst aber alle 
ausser bitN herausmaskieren.


!(PIND & Bitmaske) ist dann wahr, wenn KEIN high signal anliegt.
Dein Button zieht den Pin nach GND herunter (deswegen sind dort ja auch 
die Pullups eingeschaltet), sonst würdest du gar nichts bemerken (was du 
bei dem Verbinden mit High ja auch feststellst).

von Shibby (Gast)


Lesenswert?

Super! Danke habs geschnallt. Müsste ja funktionieren wenn ich die 
pull-ups deaktiviere und stattdessen auf: if (PIND & (1 << PIND0) && 
!isDown) teste. Dann kann ich auch über das Verbinden der Pins 
inkrementieren.

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.