Verstehe nicht warum Input nicht gemessen wird.

Gast #1475516
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
Gast #1476389
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
Gast #1476398
>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.
Gast #1476405
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).
#1476409
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).
Gast #1476426
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.