Taster einlesen und abfragen - Probleme?!

OP #5255470
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
OP #5255501
#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 #5255504
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?
Gast #5255508
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
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
> 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).
OP #5255516
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
Gast #5255517
> 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
> 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
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
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
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

Eine eigene Frage? Dieser Thread ist über 8 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.