Forum: Mikrocontroller und Digitale Elektronik ATMega32U4 Entprellen


von Daniel Q. (daniel_q)


Lesenswert?

Hallo Gemeinde,
ich komme gerade nicht so recht weiter.
Ich habe mir folgende Schaltung gekauft.
http://www.ebay.de/itm/161194580527?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
Aus Platzgründen habe ich mich für das kleine Fertige entschieden.
Ich kriege das Teil aber nicht zum Laufen.
PC erkennt es als Arduino Leonardo.
Jetzt ist die Frage mit welchem Programm kann ich den Code brennen?

Hat jemand evtl. den richtigen Code für mich da?
Ich brauche nur eine einfache Entprellung.
Wenn Taster gedrückt soll auch ein Ausgang "an" gehen. Der Rest kann 
Ignoriert werden.

Vielen Dank

-Daniel

von Gerhard G. (g_g)


Lesenswert?

Hallo,

> Daniel Q. schrieb:
> Jetzt ist die Frage mit welchem Programm kann ich den Code brennen?


entweder Arduino IDE

oder mit original Bootloader und http://www.atmel.com/tools/flip.aspx
Um aber den original Bootlader auf den Atmega zu bekommen bräuchtest du 
einen Brenner(z.B. AVRISP mkII).

Gruß G.G.

von Daniel Q. (daniel_q)


Lesenswert?

Hallo und Guten Morgen, den Arduino IDE 1.0.5 r2 habe ich jetzt 
Installiert.
Worin bestehen die Vor- bzw. Nachteile von Arduino und Atmel Bootloader?

Ich habe mich mal etwas Schlau gelesen. Im Forum stehen mehrere 
Varianten zum entprellen.
http://www.mikrocontroller.net/articles/Entprellung#Softwareentprellung
Die Frage ist nur welche für mein Vorhaben am Sinnvollsten ist.

Gruß Daniel

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Daniel Q. schrieb:
> Hat jemand evtl. den richtigen Code für mich da?
Hausaufgaben müssen selber gemacht werden. Sonst lernt man nichts...
> Ich brauche nur eine einfache Entprellung.
> Wenn Taster gedrückt soll auch ein Ausgang "an" gehen.
Wozu soll bei dieser simplen Aufgabe der Taster entprellt werden?
Lies einfach den Taster-Pin ein und gib ihn auf dem LED-Pin wieder aus.

Daniel Q. schrieb:
> Die Frage ist nur welche für mein Vorhaben am Sinnvollsten ist.
Ich würde das an deiner Stelle einfach mal ausprobieren! Das Gute 
daran ist: Man lernt dabei.

> Die Frage ist nur welche für mein Vorhaben am Sinnvollsten ist.
Woher soll irgendwer wissen, was dein "Vorhaben" ist?

von public (Gast)


Lesenswert?

Servus Daniel,

ich denke mir die ganze Zeit: "Jung wat hast du vor?". Wir reden doch 
hier vom entprellen. Also allgemein funktioniert das so:

1. Timer initialisieren
2. Pin intialisieren und auf Event warten
3. Bei Auftreten des gewünschten Events, Timer starten
4. Bei Ablauf des Timers schauen ob der Pin immer noch dem gewünschten 
Zustand entspricht. Je nach Zustand kannst du dann ja darauf reagieren.


Beste Grüße
public

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

public schrieb:
> Also allgemein funktioniert das so:
Hach.
Wenn man für jeden Pin einen Timer verwalten muss, dann wirds aber 
schnell umständlich...

Dank Peter Danneggers genialem "Massive Parallel Counter Code" (;-) 
entprelle ich z.B. ein 32er Orgelpedal mit gerade mal 8 Byte.

: Bearbeitet durch Moderator
von Daniel (Gast)


Lesenswert?

Hallo und vielen Dank für die Anteorten.
Ich habe hier eine MosFet Motor Schaltung und einen stark Prellenden 
Taster.
Die MosFet Schaltung hat ein MosFet als Bremse verbaut. Drückt man den 
Taster dreht sich der Motor. Lässt man den Taster los, bremst das zweite 
Fet den Motor.
Und mit dem Prellenden Taster ist das ein Problem. Da habe ich mir 
gedacht yC dazwischen, Entprellung rein und fertig.

Irgendwann soll das mal erweitert werden, bzw. Ausgebaut. Taster kann 
auch leider nicht getauscht werden.

Gruss Daniel

von wendelsberg (Gast)


Lesenswert?

Daniel schrieb:
> Taster kann
> auch leider nicht getauscht werden.

Putzen.

wendelsberg

von Dietrich L. (dietrichl)


Lesenswert?

Daniel schrieb:
> Und mit dem Prellenden Taster ist das ein Problem. Da habe ich mir
> gedacht yC dazwischen, Entprellung rein und fertig.

Da geht aber auch ein RC-Glied + 74HC14, 74HC132 oder 74HC4093. Oder 
wenn es mit mehr als 5V betrieben werden soll CD4093.

Gruß Dietrich

von Peter D. (peda)


Lesenswert?

Dietrich L. schrieb:
> Da geht aber auch ein RC-Glied

Ja klar, bei 32kB Flash machen 30 gesparte Bytes ja auch enorm viel aus.
Da lohnt sich das Layouten und Löten zusätzlicher Komponenten so 
richtig.

von Karl H. (kbuchegg)


Lesenswert?

Peter Dannegger schrieb:
> Dietrich L. schrieb:
>> Da geht aber auch ein RC-Glied
>
> Ja klar, bei 32kB Flash machen 30 gesparte Bytes ja auch enorm viel aus.
> Da lohnt sich das Layouten und Löten zusätzlicher Komponenten so
> richtig.

Ich kann dir da nicht einmal widersprechen, denn €6.50 sind ein 
Argument, gegen das man nur schwer ankommt. Da spielt es dann auch keine 
Rolle mehr, dass ein 32U4 für diese Aufgabe Perlen vor die Säue 
bedeutet.
Die einzige Variable ist es, wie lange es dauert, bis er das Programm 
fertig und in den µC gebrannt hat. Da könnte unter Umständen Layout und 
Löten eines klassischen Entprellers für ein Einzelstück effizienter 
sein.

Nur damit wir vom selben reden. Wenn er die 30 Bytes 'einspart', dann 
ist sein Flash-Verbrauch bei 0. Der ganze Arduino fällt weg. Seine 
einzige AUfgabe ist es, einen einzigen Taster zu entprellen :-)

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Karl Heinz schrieb:
> Da spielt es dann auch keine
> Rolle mehr, dass ein 32U4 für diese Aufgabe Perlen vor die Säue
> bedeutet.

Woher weißt Du das?
Er will doch noch weitere Sachen hinein programmieren:

Daniel schrieb:
> Irgendwann soll das mal erweitert werden, bzw. Ausgebaut.

von Dietrich L. (dietrichl)


Lesenswert?

Peter Dannegger schrieb:
> Dietrich L. schrieb:
>> Da geht aber auch ein RC-Glied
>
> Ja klar, bei 32kB Flash machen 30 gesparte Bytes ja auch enorm viel aus.
> Da lohnt sich das Layouten und Löten zusätzlicher Komponenten so
> richtig.

Darum geht es nicht. Wenn Daniel nur den Taster entprellen will (mehr 
hat er in seiner Beschreibung nicht gewollt), kann es sich den ganzen 
Arduino + Programmierung sparen und braucht auch keinen Brenner.

Wenn er allerdings den µC für andere Dinge sowieso braucht, hast Du 
natürlich recht. Dann würde ich mein RC-Glied auch nicht empfehlen.

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

Peter Dannegger schrieb:
> Karl Heinz schrieb:
>> Da spielt es dann auch keine
>> Rolle mehr, dass ein 32U4 für diese Aufgabe Perlen vor die Säue
>> bedeutet.
>
> Woher weißt Du das?

Posting von heute (23.1) um 09:17
(Ich kann leider keinen Link setzen, da ich hinter einem WebProxy sitze)

> Er will doch noch weitere Sachen hinein programmieren:

Ja, irgendwann

von Dietrich L. (dietrichl)


Lesenswert?

Peter Dannegger schrieb:
> Daniel schrieb:
>> Irgendwann soll das mal erweitert werden, bzw. Ausgebaut.

OK, dann nehme ich meinen Vorschlag mit dem RC-Glied zurück ;-)

von Quack (Gast)


Lesenswert?


von Quack (Gast)


Lesenswert?

Oder gleich als Library: http://playground.arduino.cc/code/bounce

von Daniel Q. (daniel_q)


Lesenswert?

Hallo und vielen Dank für die ganzen Beiträge und hinweise.
Ich weiß das der 32U4 etwas zu "groß" ist. Ich werde bestimmt nicht 
alles brauchen was der kann. Und auch nicht ausnutzen.
Aber klein und Günstig. Das war das ausschlaggebende.
Ich habe das jetzt alles auf meinem Steckbrett so aufgebaut.
Leider Funktioniert es nicht.
Ich habe jetzt so gemacht wie es dort steht.
1
const int buttonPin = 2;    // the number of the pushbutton pin
2
const int ledPin = 13;      // the number of the LED pin[avrasm]

Ich habe den Code Kompiliert und aufgespielt.
Aber leider kein Ergebnis.

Hier ist auch mal der Schaltplan.

http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Boards/Pro-Micro-v11-5V_B.pdf

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Daniel Q. schrieb:

> Ich habe jetzt so gemacht wie es dort steht.

Wie es wo steht.
Da wurden immerhin 2 Links gepostet

>
>
1
> const int buttonPin = 2;    // the number of the pushbutton pin
2
> const int ledPin = 13;      // the number of the LED pin[avrasm]
3
>
>
> Ich habe den Code Kompiliert und aufgespielt.

Das kann aber nicht alles sein.
Zeig den ganzen Code!

Und zwar nicht wie er irgendwo auf einer Webseite steht, sonder so wie 
du ihn bei dir compilierst und brennst.

Hast du eigentlich schon einen ersten Funktionstest mit deinem Arduino 
gemacht. Ganz simpel eine LED einschalten, ausschalten?

von Karl H. (kbuchegg)


Lesenswert?

Daniel Q. schrieb:

> Hier ist auch mal der Schaltplan.
>
> 
http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Boards/Pro-Micro-v11-5V_B.pdf

Der kann aber nicht stimmen. Denn in dem Schaltplan ist am Pin D13 keine 
LED eingezeichnet.

Bitte poste immer die Situation, so wie sie bei dir vorliegt!

von Daniel Q. (daniel_q)


Lesenswert?

Karl Heinz schrieb:
> Daniel Q. schrieb:

> Da wurden immerhin 2 Links gepostet
Ich bin nach dem Tutorial gegangen.
1
>> const int buttonPin = 2;    // the number of the pushbutton pin
2
>> const int ledPin = 13;      // the number of the LED pin[avrasm]
3
>>
>> Ich habe den Code Kompiliert und aufgespielt.
>
> Das kann aber nicht alles sein.
> Zeig den ganzen Code!
Das war auch nur als Ausschnitt gedacht.
Habe jetzt gesehen, das ich aus versehen den A3 als Ausgang genommen 
hatte. Welchen wert muss ich da denn jetzt eintragen?

> Und zwar nicht wie er irgendwo auf einer Webseite steht, sonder so wie
> du ihn bei dir compilierst und brennst.
Ich habe das alles eingefügt und dann Kompilieren und hochladen 
gedrückt.
http://arduino.cc/en/Tutorial/Debounce?action=sourceblock&num=1

> Hast du eigentlich schon einen ersten Funktionstest mit deinem Arduino
> gemacht. Ganz simpel eine LED einschalten, ausschalten?
Nein.

von Daniel Q. (daniel_q)


Lesenswert?

Hallo, ich habe mich heute mal etwas genauer mit dem Thema auseinander 
gesetzt.
Mein Code.
1
// set pin numbers:
2
const int buttonPin = 14;    // the number of the pushbutton pin
3
const int ledPin = 15;      // the number of the LED pin
4
5
// Variables will change:
6
int ledState = HIGH;         // the current state of the output pin
7
int buttonState;             // the current reading from the input pin
8
int lastButtonState = LOW;   // the previous reading from the input pin
9
10
// the following variables are long's because the time, measured in miliseconds,
11
// will quickly become a bigger number than can be stored in an int.
12
long lastDebounceTime = 0;  // the last time the output pin was toggled
13
long debounceDelay = 50;    // the debounce time; increase if the output flickers
14
15
void setup() {
16
  pinMode(buttonPin, INPUT);
17
  pinMode(ledPin, OUTPUT);
18
19
  // set initial LED state
20
  digitalWrite(ledPin, ledState);
21
}
22
23
void loop() {
24
  // read the state of the switch into a local variable:
25
  int reading = digitalRead(buttonPin);
26
27
  // check to see if you just pressed the button 
28
  // (i.e. the input went from LOW to HIGH),  and you've waited 
29
  // long enough since the last press to ignore any noise:  
30
31
  // If the switch changed, due to noise or pressing:
32
  if (reading != lastButtonState) {
33
    // reset the debouncing timer
34
    lastDebounceTime = millis();
35
  } 
36
  
37
  if ((millis() - lastDebounceTime) > debounceDelay) {
38
    // whatever the reading is at, it's been there for longer
39
    // than the debounce delay, so take it as the actual current state:
40
41
    // if the button state has changed:
42
    if (reading != buttonState) {
43
      buttonState = reading;
44
45
      // only toggle the LED if the new button state is HIGH
46
      if (buttonState == HIGH) {
47
        ledState = !ledState;
48
      }
49
    }
50
  }
51
  
52
  // set the LED:
53
  digitalWrite(ledPin, ledState);
54
55
  // save the reading.  Next time through the loop,
56
  // it'll be the lastButtonState:
57
  lastButtonState = reading;
58
}
Ich habe es so wie in dem Tut ( 
http://www.arduino.cc/en/Tutorial/Debounce) beschrieben erst mal auf ein 
Steckbrett gesteckt.
Soweit funktioniert alles. Allerdings ist mir aufgefallen das ich die 
LED wie mit einem Schalter schalte. Was muss man ändern damit ich sie 
nur Taste?

von wendelsberg (Gast)


Lesenswert?

Daniel Q. schrieb:
> Soweit funktioniert alles. Allerdings ist mir aufgefallen das ich die
> LED wie mit einem Schalter schalte.

Das ist doch perfekt. Schliesslich hast Du am Anfang geschrieben:

Daniel Q. schrieb:
> Wenn Taster gedrückt soll auch ein Ausgang "an" gehen.

wendelsberg

von Daniel Q. (daniel_q)


Lesenswert?

wendelsberg schrieb:
> Daniel Q. schrieb:
> Das ist doch perfekt. Schliesslich hast Du am Anfang geschrieben:
>
> Daniel Q. schrieb:
>> Wenn Taster gedrückt soll auch ein Ausgang "an" gehen.
>
> wendelsberg

Da habe ich mich dann etwas Unglücklich ausgedrückt. Der Ausgang soll 
auch nur so lange "an" sein wie der Taster gedrückt ist.

von wendelsberg (Gast)


Lesenswert?

Daniel Q. schrieb:
> Der Ausgang soll
> auch nur so lange "an" sein wie der Taster gedrückt ist.

Dann ist das meiste ueberfluessig, also:
1
void loop() {
2
  // read the state of the switch into a local variable:
3
  int ButtonState = digitalRead(buttonPin);
4
  // set output
5
  digitalWrite(ledPin, ButtonState);
6
}

von Daniel Q. (daniel_q)


Lesenswert?

Daniel Q. schrieb:
1
 void loop() {
2
   // read the state of the switch into a local variable:
3
   int reading = digitalRead(buttonPin);
4
 
5
   // check to see if you just pressed the button
6
   // (i.e. the input went from LOW to HIGH),  and you've waited
7
   // long enough since the last press to ignore any noise:
8
 
9
   // If the switch changed, due to noise or pressing:
10
   if (reading != lastButtonState) {
11
     // reset the debouncing timer
12
     lastDebounceTime = millis();
13
   }
14
 
15
   if ((millis() - lastDebounceTime) > debounceDelay) {
16
     // whatever the reading is at, it's been there for longer
17
     // than the debounce delay, so take it as the actual current state:
18
 
19
     // if the button state has changed:
20
     if (reading != buttonState) {
21
       buttonState = reading;
22
 
23
       // only toggle the LED if the new button state is HIGH
24
       if (buttonState == HIGH) {
25
         ledState = !ledState;
26
       }
27
     }
28
   }
29
 
30
   // set the LED:
31
   digitalWrite(ledPin, ledState);
32
 
33
   // save the reading.  Next time through the loop,
34
   // it'll be the lastButtonState:
35
   lastButtonState = reading;
36
 }
Das kann dann raus oder?

von Karl H. (kbuchegg)


Lesenswert?

Daniel Q. schrieb:

> Das kann dann raus oder?

Exakt.

Etwas zu machen SOLANGE eine Taste gedrückt wird, ist leicht. Du liest 
den Tastenzustand ein und bist ... fertig. Je nachdem kann es sein, dass 
man noch eine kleine Entprellung braucht, damit die paar Preller im 
Millisekundenraster nicht dafür sorgen, dass das Licht zb 3 mal kurz im 
Millisekundenbereich flackert (was ein Lichtsensor durchaus feststellen 
könnte), oder dass ein Motor nicht mit einem 3 maligem 'Stotterer' 
anläuft (was er nicht tun wird, denn dazu ist er zu träge). Aber 
abgesehen davon ist die grundlegende Strategie: einfach einlesen.

Schwieriger ist es, etwas beim Niederdrücken einer Taste nur ein 
einziges mal zu machen. Denn jetzt wirkt sich das mögliche Prellen aus. 
Für den µC ist Tastenprellen nicht von "mein Benutzer hat die Taste 3 
mal schnell hintereinander gedrückt" grundsätzlich zu unterscheiden. Nur 
das für den µC das eine in Zeitlupe passiert und das andere in 
Superzeitlupe. Und genau da ist dann auch der Entprellansatz: 'Drückt 
der Benutzer die Taste zu schnell, dann war das kein Benutzer, der an 
der Taste rumgefummelt hat, sondern der Taster hat geprellt'.

von Markus -. (mrmccrash)


Lesenswert?

Guten Abend,

> Ich habe mir folgende Schaltung gekauft.
> Ebay-Artikel Nr. 161194580527

ist das nur bei mir oder steht dort ernsthaft 106 Euro pro Stück?!

_.-=: MFG :=-._

von Daniel Q. (daniel_q)


Lesenswert?

Ist das nicht Günstig?

;-)

Wird ein Fehler sein. Ich hab zumindest nur EUR 6,45 bezahlt.
:-D

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.