Forum: Mikrocontroller und Digitale Elektronik 1-Taster LED-Steuerung


von M. S. (hy-fye1)


Lesenswert?

Hallo,

ich bin neu hier im Forum und Anfänger in Sachen Mikroprozessor.
Ich würde gerne folgendes in C realisieren:

Ich möchte an einem Attiny13 mit 1 Taster 5 LED´s folgendermaßen 
steuern:

Taster drücken, LED´s als Lauflicht.
Taster nochmals drücken, alle LED´s an.
Taster nochmals drücken, alle LED´s aus.

Könnte mir bitte jemand zeigen, wie der Code hierfür lauten muß?

Vielen Dank.

von Karl H. (kbuchegg)


Lesenswert?

Markus Schäfer schrieb:

> Könnte mir bitte jemand zeigen, wie der Code hierfür lauten muß?

Das ist bereits reichlich kompliziert, weil die saubere und sichere 
Erfassung eines einzelnen Tastendrucks kein Einsteigerthema ist.
Such dir ein anderes erstes Beispiel aus. Möglichst irgendwas, was ohne 
den Themenkomplex "Mach etwas wenn eine Taste einmalig niedergedrückt 
wurde" auskommt.

Im
AVR-Tutorial
bzw
AVR-GCC Tutorial

solltest du dazu einsteigertaugliche Hinweise finden.

von Eumel (Gast)


Lesenswert?

Markus Schäfer schrieb:
> Könnte mir bitte jemand zeigen, wie der Code hierfür lauten muß?

Den wirst du schon selber schreiben müssen.

Wie willst du die LEDs denn anschließen? Der Attiny hat nur 5 für einen 
Anfänger nutzbare Pins.

von Markus (Gast)


Lesenswert?

Hallo,

sorry, ich meinte Attiny2313.

von MaWin (Gast)


Lesenswert?

> Könnte mir bitte jemand zeigen, wie der Code hierfür > lauten muß?

Je nach Anschlussbelegung
1
void main(void)
2
{
3
  uint8_t gedrueckt, runter, zaehler;
4
  DDRA=0x1F;
5
  while(1)
6
  {
7
    gedrueckt=PINA&0x20;
8
    runter=gedrückt&~runter;
9
    if(runter)  mode=(mode+1)%3;
10
    switch(mode)
11
    {
12
    case 0:
13
      PORTA=1<<(zaehler++/51);
14
      break;
15
    case 1:
16
      PORTA=0x1F;
17
      break;
18
    default:
19
      PORTA=0;
20
   }
21
  runter=gedrueckt;
22
  _delay_ms(10);
23
  }
24
}

von Peter D. (peda)


Lesenswert?

Man könnte sich ansehen, wie andere das schonmal gemacht haben:

Beitrag "AVR Sleep Mode / Knight Rider"

von M. S. (hy-fye1)


Lesenswert?

Hallo,

vielen Dank für die Antworten.
@ Peter:

ich habe lange gesucht bevor ich den Beitrag geöffnet habe. Leider aber 
nichts gefunden was meinem Projekt nahe kommt.

Grüße
Markus

von MaWin (Gast)


Lesenswert?

> Leider aber nichts gefunden was meinem Projekt nahe kommt.

Und mein code war dir zu lang ?
1
void main(void)
2
{
3
  uint8_t gedrueckt, runter, zaehler;
4
  DDRB=0x1F;
5
  while(1)
6
  {
7
    gedrueckt=PINB&0x20;
8
    runter=(gedrückt&~runter)*0x20;
9
    mode=(mode+(runter!=0))%3;
10
    PORTB=(mode==0?1<<(zaehler++/51):(mode==1?0x1F:0));
11
    runter=gedrueckt;
12
    _delay_ms(10);
13
  }
14
}

von Karl H. (kbuchegg)


Lesenswert?

Markus S. schrieb:
> Hallo,
>
> vielen Dank für die Antworten.
> @ Peter:
>
> ich habe lange gesucht bevor ich den Beitrag geöffnet habe. Leider aber
> nichts gefunden was meinem Projekt nahe kommt.

Das wirst du so auch nicht finden.

Was du lernen musst:
Dein Projekt in Einzelkomponenten zu zerlegen. Aus welchen Teilen 
besteht es?

Von einigen Komponenten weiß man, wie man sie programmiert. Von anderen 
wiederrum weiß man das nicht. Dann sieht man sich andere Projekte an, in 
denen genau dieser Teilbereich ebenfalls vorkommt. Dieses andere Projekt 
kann über etwas ganz anderes gehen, das spielt so erst mal keine Rolle. 
Wichtig ist diese eine einzelne Komponente, die man benötigt. Die wird 
studiert ... wie funktioniert sie? ... wie wird sie benutzt? ... was 
kann sie genau?

Und wenn man dann von allen Einzelteilen weiß, wie man sie realisiert, 
dann schraubt man aus diesen Einzelteilen das gewünschte Projekt 
zusammen. Bei einfachen Projekten ist es sogar sinnvoll, das nicht über 
Copy&Paste zu machen sondern tatsächlich selbst zu schreiben. Denn dann 
fallen einem nochmal 10 Details auf, die einem vorher entgangen sind.

Das kann dir keiner abnehmen, bzw. es ist auch nicht sinnvoll das zu 
tun. Denn das ist etwas was du lernen musst. Tust du es nie, dann lernst 
du es auch nicht.

Programmieren bedeutet nicht, sich im Web ein möglichst ähnliches 
Projekt zu suchen, dass man dann ein wenig anpasst. Programmieren 
bedeutet (neben vielen anderen Dingen, wie zb das Erlernen der 
Programmiersprache), Techniken zu erlernen, Algorithmen, die dann nach 
Bedarf kombiniert (und aneinander angepasst) werden.

von MaWin (Gast)


Lesenswert?

Natürlich
   runter=(gedrueckt&~runter)&0x20;

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Markus S. schrieb:
> Könnte mir bitte jemand zeigen, wie der Code hierfür lauten muß?

Mhh, was hast du davon, wenn du so einen Code siehst? Danach kannst du 
nicht mehr als vorher... Eine Person, die zur Lösung einer einfachen 
Aufgabe erstmal in einem Forum nach dem Code fragt, sollte sich zunächst 
mit ganz grundsätzlichen Dingen wie "Programmierung" befassen. Lies ein 
Buch.

Karl Heinz Buchegger schrieb:
> Das ist bereits reichlich kompliziert, weil die saubere und sichere
> Erfassung eines einzelnen Tastendrucks kein Einsteigerthema ist.

So kompliziert ist Debouncen jetzt auch nicht, wenn man weiß, dass ein 
Tastendruck mitunter mehrere Flanken auslösen kann. Natürlich sind 
Programmierkenntnisse hier sehr hilfreich ;)

von Peter D. (peda)


Lesenswert?

Kan asta schrieb:
> So kompliziert ist Debouncen jetzt auch nicht

Die Praxis zeigt aber das Gegenteil.
Jeder kennt bestimmt reichlich Geräte mit schlecht funktionierender 
Entprellung. Es scheint daher selbst für professionelle Programmierer 
sehr kompliziert zu sein.

Der Programmierer sitzt in seinem Elfenbeintürmchen und geht von idealer 
Hardware aus, anstatt von realer Hardware.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Ja, Peter, wir kennen alle deine Debounce-Lib.
Solange Programmierer nur mit Software jonglieren, hast du sicher Recht.
Wer Hard- und Software kennt, kann evtl. auch selbst debouncen ;)

von Peter D. (peda)


Lesenswert?

Kan asta schrieb:
> Ja, Peter, wir kennen alle deine Debounce-Lib.

Leider aber nicht die Leute, mit deren Geräten ich mich täglich 
rumärgern muß (Fahrstühle, Kaffeemaschinen, Wetterstationen, 
Frequenzgeneratoren usw.).
Ich hab sogar den Eindruck, daß sich das verschlimmert, je neuer die 
Geräte sind. Das Wissen ums gute Programmieren scheint mehr und mehr 
verloren zu gehen.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Du drückst zu viele Knöpfe, Peter.

von Peter B. (pbuenger)


Lesenswert?

> Ich hab sogar den Eindruck, daß sich das verschlimmert, je neuer die
> Geräte sind. Das Wissen ums gute Programmieren scheint mehr und mehr
> verloren zu gehen.

Ja, das ist auch mir aufgefallen. Unser Saeco-Kaffeeautomat hat ein nur 
paar Tasten, die üblichen Knackfrösche. Drückt man normal drauf, hört 
man das "knick-knack", die Firmware erkennt den Tastendruck aber 
höchstens zu 50%. Vom Praktikanten programmiert?

Oder am neuen Octavia: Am Lenkrad gibt es zwei Drehwalzen, mit denen 
kann man durch das Menü des Bordcomputers blättern. Dummerweise haben 
die mechanischen Rastschritte nichts zu tun mit den Drehgeberschritten. 
Mal springen sie zwei Schritte weiter oder auch gar keinen. Und sowas 
bauen die zigtausenfach in VWs, Audis, Skodas und Seats ein.

Peter

von MaWin (Gast)


Lesenswert?

> Drückt man normal drauf, hört
> man das "knick-knack", die Firmware erkennt den Tastendruck aber
> höchstens zu 50%. Vom Praktikanten programmiert?

Eher ein Kontaktproblem wegen Korrosion.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

In meinem Auto drückt sich ein Knopf manchmal von selbst. Diese 
Software...

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.