Taster einlesen und abfragen - Probleme?!

OP #5255470
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
Gast #5255476
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
OP #5255501
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;
      }
    }

}
Gast #5255508
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.
Gast #5255509
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.
Gast #5255512
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).
Gast #5255517
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.
Gast #5255521
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.
Gast #5255523
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.
Gast #5255524
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.
Gast #5255528
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren