Forum: Mikrocontroller und Digitale Elektronik Taster einlesen und abfragen - Probleme?!


von Manuel H. (maenii)


Lesenswert?

Servus Leute!

Nach langer Suche in diesem Forum bin ich leider immer noch nicht auf
die Lösung gekommen, wie ich denn nun meinen Taster richtig einlese!
Da ich ebenso noch Neuling auf diesem Gebiet bin, verstehe ich meist die
Codes, welche von echten "Profis" erstellt wurde, nicht.

VOn AVR GCC wurde ich ebenso wenig schlau!

Eventuell gibt es ja jemanden, der mir meinen Fehler erläutern könnte,
dafür wäre ich sehr dankbar!

Code:

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define SET(x,y) x |= (1 << y)
#define CLEAR(x,y) x &= ~(1 << y)
#define BUT1 9            // BUtton 1 (PB1)


int main(void)
{
    //Eingaenge und Ausgaenge definieren (0 = Eingang , 1 = Ausgang)
    DDRD = 0b11111111;
    DDRB = 0x00;

    //Taster als Eingang
    SET(DDRB,0);

    //Pullup aktivieren
    CLEAR(PORTB, BUT1);

   while (1)
  {
    //Variable i deklarieren
    int i;

    //Wenn Taster gedrückt - "Lichterspiel"
    if (PINC & (1<<BUT1))
    {
      for (i=0 ; i<8 ; i++) {
        SET(PORTD,i);
        _delay_ms(100);
        CLEAR(PORTD,i); }
      }
      else
      {
        PORTD = 0x00;
      }
    }

}

Vielen lieben Dank!

Grüße,

Manuel

von Karl M. (Gast)


Lesenswert?

Hallo Manuel,

so ein Byte hat nur 8 Bit, die man von 9 bis 7 nummeriert.
Das BUT1 = 9 ist also falsch.

Taster werden mit der Peter Dannegger Methode alle ~10ms und erst bei 4 
gleichen Zuständen wird ein Taster Event generiert.
Das kann u.a. sein Taster gedrückt oder auch losgelassen.

https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29

von Karl M. (Gast)


Lesenswert?

Sorry Schreibfehler:

"die man von 0 bis 7 nummeriert."

von Stefan S. (chiefeinherjar)


Lesenswert?

Manuel H. schrieb:
> if (PINC & (1<<BUT1))

BUT1 ist mit PB1 definiert, du nimmst aber PINC. Das wird so nicht 
funktionieren.
EDITH meint:
Ups, verlesen. Lass doch die 9 weg (woher hast du die eigentlich?) und 
schreib
define BUT1 PB1

: Bearbeitet durch User
von Manuel H. (maenii)


Lesenswert?

Hallo!

Alles nun geändert, leider wird der Tasterklick immer noch nicht 
erkannt. Bin leider nun echt mit meinem Latein am Ende!

von Stefan S. (chiefeinherjar)


Lesenswert?

Was hast du konkret geändert? Wie sieht der Code jetzt aus?

von Stefan F. (Gast)


Lesenswert?

Schaltplan?

von Manuel H. (maenii)


Lesenswert?

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define SET(x,y) x |= (1 << y)
#define CLEAR(x,y) x &= ~(1 << y)
#define BUT1 PB1            // BUtton 1 (PB1)


int main(void)
{
    //Eingaenge und Ausgaenge definieren (0 = Eingang , 1 = Ausgang)
    DDRD = 0b11111111;
    DDRB = 0x00;

    //Taster als Eingang
    SET(DDRB,0);

    //Pullup aktivieren
    CLEAR(PORTB, BUT1);

   while (1)
  {
    //Variable i deklarieren
    int i;

    //Wenn Taster gedrückt - "Lichterspiel"
    if (PINB & (1<<BUT1))
    {
      for (i=0 ; i<8 ; i++) {
        SET(PORTD,i);
        _delay_ms(100);
        CLEAR(PORTD,i); }
      }
      else
      {
        PORTD = 0x00;
      }
    }

}

von Dietrich L. (dietrichl)


Lesenswert?

Manuel H. schrieb:
> Alles nun geändert, leider wird der Tasterklick immer noch nicht
> erkannt. Bin leider nun echt mit meinem Latein am Ende!

Dann zeig mal das geänderte Programm, und am besten auch gleich die 
Schaltung:
- wie und wo hast Du hast Du die Taste angeschlossen?
- wie genau erkennst Du den Tastendruck?

von Stefan F. (Gast)


Lesenswert?

Port D ist dein Eingang, du liest aber von PINC.
Port B ist dein Ausgang, du schreibst aber auf PORTD.

Zeige deinen Schaltplan. Was ist wie wo angeschlossen?

von Manuel H. (maenii)


Angehängte Dateien:

Lesenswert?

Hier die Schaltung. Piezo und Display wurden noch nicht angeschlossen - 
zuerst sollten die Basics laufen!

von Stefan F. (Gast)


Lesenswert?

1
for (i=0 ; i<8 ; i++) {
2
    SET(PORTD,i);
3
    _delay_ms(100);
4
    CLEAR(PORTD,i); }
5
}

Dieser Abschnitt sieht aus, als ob da eine Klammer hinter CLEAR zu viel 
sei. Und danach fällt auf, dass darunter ein "else" scheinbar auf "for" 
folgt, was keinen Sinn ergibt. Solche Lesefehler vermeidest du durch 
korrektes Einrücken.

Hinter CLEAR fehlt noch ein Delay. Die LED wird sonst so schnell wieder 
eingeschaltet, dass man davon nichts sehen kann.

von Karl M. (Gast)


Lesenswert?

Hallo Manuel,

Siehe  Stefan Us, was die Portpins angeht, aber
wirklich hast Du am Algorithmus nichts geändert.
Damit wird es auch nicht funktionieren können!

Taster prellen, Taster schalten beim drücken nach Masse und prellen 
(wackeln) dann zwischen Vcc (i.a. +5V) und Masse (0V).

Also baue die Peter Dannegger Funktionalität (Tastenentprellen) ein und 
dann geht alles wie von selbst.

von Karl M. (Gast)


Lesenswert?

Manuel H. schrieb:
> Hier die Schaltung.

Nun das ist der Aufbau, aber kein Schaltplan!
Damit kann man nur sehr wenig anfangen!

von Stefan F. (Gast)


Lesenswert?

> Hier die Schaltung.

Pläne sind wohl nicht mehr nötig. Nur doof, wenn man seinen eigenen 
Aufbau nicht durchblickt.

Dein Taster zieht den Eingang auf Low, du fragst im Quelltext aber ab, 
ob er HIGH ist.

Die LED's hängen auf jeden Fall alle an Port D und leuchten bei HIGH 
Pegel. Korrigiere deinen Quelltext dementsprechend.

Dein Taster hängt an PB0. Korrigiere deinen Quelltext dementsprechend.

Und in Zukunft: Zeichne einen Schaltplan, der die Port-Nummern enthält 
(nicht diese Arduino Nummern, die du nicht gebrauchen kannst).

von Manuel H. (maenii)


Lesenswert?

Hallo!

Erstmals vielen Dank!
Wollte das Ganze zuerst mit den internen PullUP Widerständen, wie in der 
ARDUINO Programmierumgebung lösen, leider vergeblich!

Werde es nun nach der Peter Dannegger Funktionalität versuchen, das 
Programm erfolgreich zu lösen!

Grüße

von Stefan F. (Gast)


Lesenswert?

> Also baue die Peter Dannegger Funktionalität (Tastenentprellen) ein

Lieber nicht, dieses Level hat er noch nicht erreicht. Was nicht böse 
gemeint ist.

Lass den TO erst einmal herausfinden, das ein Taster prellt, dann 
versteht er den Sinn der Entprellung besser. In dieser Schaltung wird er 
es wahrscheinlich noch nicht bemerken. Aber das kommt sicher bald.

von Manuel H. (maenii)


Lesenswert?

Falls ich das Ganze aber negiere (mit einem Ausrufezeichen vor der 
Bedingung), dann leuchten die PINS logischerweise auch ohne 
entsprechendem Tasterdruck...

von Stefan F. (Gast)


Lesenswert?

> Wollte das Ganze zuerst mit den internen PullUP Widerständen,
> wie in der ARDUINO Programmierumgebung lösen

Deine Leitungen sind hier kurz genug, dass das auch geht. Nur musst du 
sie auch einschalten und dann im Programmcode berücksichtigen, welcher 
Logik-Pegel dann den gedrückten Taster repräsentiert.

von Manuel H. (maenii)


Lesenswert?

Was eine Entprellung ist und für was das Ganze gut sie sollte, habe ich 
begriffen, danke. DIe Entprellung wollte ich durch den PULLUP Widerstand 
lösen, sollte doch funktionieren?

von Karl M. (Gast)


Lesenswert?

Hallo Stefan Us,

ja ist möglich,
solange ihm der Umgang mit den Ports, die Benennung der Portpins und 
deren ansprechen Probleme macht, sollte man sich erst diesen  Teil des 
Basiswissens erarbeiten.

Stefan U. schrieb:
> Stefan Us

Stefan U. schrieb:
>> Also baue die Peter Dannegger Funktionalität (Tastenentprellen)
> ein
>
> Lieber nicht, dieses Level hat er noch nicht erreicht. Was nicht böse
> gemeint ist.
>
> Lass den TO erst einmal herausfinden, das ein Taster prellt, dann
> versteht er den Sinn der Entprellung besser. In dieser Schaltung wird er
> es wahrscheinlich noch nicht bemerken. Aber das kommt sicher bald.

von Stefan F. (Gast)


Lesenswert?

Ich glaube, mein Buch wird für Dich hilfreich sein: 
http://stefanfrings.de/mikrocontroller_buch/index.html

Da wird ein ATTiny13 verwendet, aber alles was dort gemacht wird, geht 
ebenso mit deinem Arduino Board.

> Die Entprellung wollte ich durch den PULLUP Widerstand
> lösen, sollte doch funktionieren?

Nein. Du hast weder den Widerstand noch den Begriff "Prellen" 
verstanden. Gib nicht auf, lese mehr zu dem Thema und probiere weiter. 
So lernt man das am schnellsten.

von Karl M. (Gast)


Lesenswert?

Manuel H. schrieb:
> Was eine Entprellung ist und für was das Ganze gut sie sollte, habe ich
> begriffen, danke. DIe Entprellung wollte ich durch den PULLUP Widerstand
> lösen, sollte doch funktionieren?

Nein, das hat nichts mit Entprellen zu tun.

Sondern damit, das Eingänge einen definierten Zustand haben müssen, also 
nicht einfach "offen" sein dürfen.
Man kann natürlich auch einen, z.B. 10k Widerstand nach Vcc und an einen 
Eingang schalten, dann ist es ein externen Pulllup-Widerstand.

von Einer K. (Gast)


Lesenswert?

Manuel H. schrieb:
> //Pullup aktivieren
>     CLEAR(PORTB, BUT1);

Entweder ist der Code falsch, oder der Kommentar!

Denn:
(Pullup aktivieren) != (Pullup deaktivieren)

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.