www.mikrocontroller.net

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


Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf den ersten Blick hängt dein Problem mit der Thematik hier zusammen: 
http://www.fh-wedel.de/~si/vorlesungen/c/ausdrueck...

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Tim Seidel (maxxie)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.