1-Taster LED-Steuerung

#3138213
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.
#3138220
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.
Gast #3138246
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
}
Gast #3138678
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
}
#3138683
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.
(Firma: Basta) #3138696
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 ;)
#3138735
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.
#3138771
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.
#3138793
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

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