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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Manuel H. (maenii)


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


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


Bewertung
0 lesenswert
nicht lesenswert
Sorry Schreibfehler:

"die man von 0 bis 7 nummeriert."

von Stefan S. (chiefeinherjar)


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


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


Bewertung
0 lesenswert
nicht lesenswert
Was hast du konkret geändert? Wie sieht der Code jetzt aus?

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Schaltplan?

von Manuel H. (maenii)


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


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


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

: Bearbeitet durch User
von Manuel H. (maenii)


Angehängte Dateien:

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

von Stefan ⛄ F. (stefanus)


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

: Bearbeitet durch User
von Karl M. (Gast)


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


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


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


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


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


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


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


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


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


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

: Bearbeitet durch User
von Karl M. (Gast)


Bewertung
1 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


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

Entweder ist der Code falsch, oder der Kommentar!

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

: Bearbeitet durch User

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]
  • [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.