Pull-Up-Problem: Falscher Code?

Gast #1110897
Hallo!

Ich bin ziemlich unerfahren auf dem Gebiet der MC-Programmierung. 
Momementan wollte ich ganz einfach mit ner Matrixtastatur anfangen. 
Eigentlich kann das ja nicht so schwer sein. Mein (Spaghetti)Code 
funktioniert sogar, aber so toll das auch alles ist, mir scheint es, als 
würden die Eingangspinne ohne Pegel liegen: Zwar nicht, wenn ich mit dem 
Finger an den Kontakt komme, aber immerhin wenn ich ein Kabel in der 
Hand halte und einen Eingangspin berühre, reagiert der ATmega16.
Sicherheitshalber frage ich lieber noch: Das passiert nur, wenn der 
interne Pull-Up aus ist, oder?

Ich missbrauche den Port A meines ATmega16 für diesen Zweck. Dazu habe 
ich das untere Nibble, die unteren 4 Pins, als Ausgänge geschaltet, 
während die restlichen Pins Eingänge sind:
DDRA = 0x0F;
In einer Schleife verwende ich folgendes Konstrukt:
PORTA = 0xFF & ~(1<<mtx_row);
Damit soll erreicht werden, dass bei allen Eingängen der Pull-Up 
aktiviert wird und alle Ausgänge auf High geschaltet werden sollen, bis 
auf den Ausgang mit dem Offset mtx_row.
Ist das falsch?

Vielen Dank!
AVR-Beginner wrote:
> Ich missbrauche den Port A meines ATmega16 für diesen Zweck.

Mißbrauch würde ich das nicht nennen. Diese Verwendung akzeptiert der 
Prozessor jederzeit.

> Dazu habe
> ich das untere Nibble, die unteren 4 Pins, als Ausgänge geschaltet,
> während die restlichen Pins Eingänge sind:
> DDRA = 0x0F;
> In einer Schleife verwende ich folgendes Konstrukt:
> PORTA = 0xFF & ~(1<<mtx_row);
> Damit soll erreicht werden, dass bei allen Eingängen der Pull-Up
> aktiviert wird und alle Ausgänge auf High geschaltet werden sollen, bis
> auf den Ausgang mit dem Offset mtx_row.
> Ist das falsch?

Ich denke mal, das ist richtig so und müßte funktionieren. Die Pullups 
sind recht schwach, ca. 50 kOhm, und somit könnten die Eingänge auf 
Störsignale von außen reagieren (immerhin bist Du eine große Antenne); 
ich würde daher mit den Fingern keine Eingangspins berühren, außer, ich 
habe mich an der System-Masse geerdet.

Ein Gesichtspunkt vielleicht noch: wenn Du alle unteren Ausgangspins 
gleichzeitig als Ausgänge programmierst, könnte es passieren, daß ein 
Benutzer gleichzeitig mehrere Tasten drückt; das könnte zu einem 
Kurzschluß zwischen Ausgangspins führen. Ich würde daher immer nur den 
Ausgangspin wirklich auf Ausgang programmieren, der gerade low wird, 
alle anderen jedoch auf Eingang, aber auch mit Pullup. So kanns keine 
Kurzschlüsse geben.

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.