Entprellen..schon alles versucht..Atmega zu schnell?

Gast #1700816
Lesenswert?

Hallo alle gemeinsam,

ich möchte meinem Atmega32 per Tastendruck oder per Funkschlter (Relais) 
eine var. hochzählen lassen und diese anschliessend auf 
7-Segment-Anzeigen darstellen.
Ein Tiefpass funktioniert super für die Taster. Für die Relaiskontakte 
jedoch nicht..die prellen trotzdem. Softwaremäßige entprellung habe ich 
auch schon probiert..taugt nichts, da ich Multiplexe und die 
Softwarelösung zu "lange" dauert.
Schliesslich habe ich es mit einem Schmitttrigger versucht (4093) nach 
folgender Beschaltung:

http://www.mikrocontroller.net/articles/Schmitt-Trigger

Der 4093 hat zwei Eingänge..einen davon habe ich an VCC gelegt und den 
anderen wie im obrigen Artikel verschaltet. -> Es funktioniert aber 
trotzdem nicht. Erbitte dringende Hilfe..sitze schon zwei Tage an dem 
Problem :(
Gast #1700859
Lesenswert?

..dann prellt das Relais wohl länger als Dein Entpreller entprellt -> 
Ent-/Ladewiderstand (und ggf. die Kapazität) vergrößern.

Oder per Software mit Timer und längerer 'Software-Timeouts' (ohne 
busy-waiting).
Gast #1700876
Lesenswert?

Meine Widerstände betragen 10k und für den Kondi sind es 100n.

Der Schmitttrigger funktioniert sogar bei Taster nicht. Die Widerstände 
habe ich bereits erhöht..ohne Erfolg..welche Hardwarelösung bietet sich 
noch für sowas an?
#1700888
Lesenswert?

Widerstände vergrößern dürfte den Effekt nur verstärken, lass die mal so 
und mach den Kondensator größer.

An der Softwarelösung würd ich aber noch arbeiten, schätze du baust da 
Delays mit ein. Lass das mal und strick dir was mit den Timern zusammen, 
nachdem du sowieso multiplexen tust hast du schätzungsweise eh einen 
Timer der ständig läuft.

Nachtrag: Hast du Wechselschalter?
http://www.mikrocontroller.net/articles/Entprellung
Moderator (Firma: Titel) Persönliche Seite #1700951
Lesenswert?

> Softwaremäßige entprellung habe ich auch schon probiert..taugt nichts,
> da ich Multiplexe und die Softwarelösung zu "lange" dauert.
Die Softwareentprellung nach P. Dannegger funktioniert bombensicher ganz 
ohne jegliche Delays und bei mir in einem Orgelpedal sogar mit 40 
Tastern. Such mal hier im Forum danach und du findest z.B. den 
Beitrag "Tasten entprellen - Bulletproof"

Oder sieh dir das an: Entprellung
#1701097
Lesenswert?

Peter Dannegger schrieb:
> Was dauert daran zu lange?
>
>
> Peter

Peter,
ich denke diese Frage kann "Mann" sich sparen. Wenn er es verstanden 
hätte, würde die Frage So nicht existieren. Evtl würde es helfen den 
Multiplex mit dem Polling zu synchronisieren voraus gesetzt der Mux geht 
wirklich rasend schnell (was ich nicht glauben will).
 Aber wenn er die Grundlagen schon verweigert....
#1701214
Lesenswert?

Patrick Koch schrieb:
> Was du oben meintest ist nicht Schmitt Trigger, du brauchst entweder ein
> Flip-Flop, oder ein Mono-Flop,

Das braucht er alles nicht, ein paar Zeilen sinnvoller Code im 
Timer-Interrupt reichen völlig zu.

> wenn dass mit dem SW entprellen nichts
> ist

Warum soll das nichts sein? Das funktioniert immer und überall und 
kostet kaum Rechenzeit. Man muss es nur richtig machen.
Gast #1701885
Lesenswert?

Hallo alle gemeinsam,

vielen Dank für eure Beiträge.

Ich steuere vier 7-Segmentanzeigen an. Ein Transistor hat eine 
Periodendauer von 140us (7,14kHz). Ich habe es mit der Softwarelösung 
versucht (Turtorial -> Entprellung). Die Delay war zulange..habe diese 
reduziet..und trotzdem wurden die Anzeigen bei jedem Tastendruck 
dunkler. Ich bin kein Programmierprofi um dies mal gesagt zu haben.

Die Miniaturtaster lassen sich wie gesagt super mit einem Tiefpass 
entprellen..jedoch nicht die Realis.

 Würde gerne mal die SW-Lösung von P. Dannegger ausprobieren..wie habe 
ich diese einzusetzten?

Erbitte Hilfe
Gast #1701900
Lesenswert?

Und was hat die Ansteuerung der Anzeigen mit dem Entprellen zu tun?

Wenn Du mit 7,14 khz unterschiedliche daten auf eine Anzeige schreibst 
kann sowieso niemand das so schnell lesen?????

Und kein Relais der Welt hat nach 0,1mS schon aufgehört zu prellen. DAS 
GEHT NICHT!

Ich denke Dein Problem ist das Design Deiner Anwendung. Vieleicht reicht 
es einfach das Lesen der Werte (und damit die Zeit für das Entprellen) 
von der Ausgabe zu entkoppeln (sind das die 7khz?)
#1701906
Lesenswert?

Suche Hilfe schrieb:

> versucht (Turtorial -> Entprellung). Die Delay war zulange..

Da ist das Zauberwort. delay

Vergiss die ganzen vermeintlich einfachen Entrellfunktionen, die auf 
delays basieren. Das ist Müll.

>  Würde gerne mal die SW-Lösung von P. Dannegger ausprobieren..wie habe
> ich diese einzusetzten?

Im Artikel aus dem du sie her hast, ist ein Testprogramm. Dort sieht man 
sehr gut, wie sie verwendet wird.
Gast #1701907
Lesenswert?

> Ein Tiefpass funktioniert super für die Taster. Für die Relaiskontakte
> jedoch nicht..die prellen trotzdem.

Unsinnige Hardware. Natürlich könnte man die auch für Relaislkontakte 
langsam genug machen, aber sie ist überflüssig, wenn du sowieso einen uC 
einsetzt.

> Softwaremäßige entprellung habe ich auch schon probiert..> taugt
> nichts, da ich Multiplexe und die Softwarelösung zu "lange" dauert.

Unsinn. Falsche Programmierweise.

Wenn du sowieso multiplext, kannst du nach jedem Durchlauf gucken, ob 
sich an den Tasteneingängen was geändert hat. Dann bekommst du 
Tastendrücke ohne prellen.

> Schliesslich habe ich es mit einem Schmitttrigger versucht

Oje. Auch das geht theoretisch, ist aber nur eien Anlenkung von "ich 
kann nicht programmieren, also löte ich ein paar Beustile dazu".
#1701918
Lesenswert?

Suche Hilfe schrieb:
> Ich steuere vier 7-Segmentanzeigen an. Ein Transistor hat eine
> Periodendauer von 140us (7,14kHz).

Ich hoffe mal, per Timerinterrupt.

7kHz ist recht heftig, 700Hz sollten dicke reichen.

Aber egal, in den Timerinterrupt packst Du noch nen Zähler 
(8Bit-Variable) rein, der dann etwa alle 10ms Die Entprellroutine 
ausführt. Oder nimm nen 2. Timer.

Und in der Mainloop erfolgt die Abfragefunktion (get_key_press), wann Du 
willst.


Peter
Gast #1701934
Lesenswert?

Wenn dein Relai einen Mittelkontakt hat, dan lege den jeweiligen 
Öffner/Schließer mit einem Widerstand gegen +5V und den Mittelkontakt 
gegen Masse.
Wenn dem so ist und du hast zwei Eingänge frei, kannst du die Leitungen 
auf die beiden Eingänge führen und der zuletzt low gewesene Eingang ist 
das Eingangssignal.
Hast du nur einen Eingang zur Verfügung, nimm ein Flipflop und führe die 
Leiungen darauf. Gibts als TTL aber auch in anderen Ausführungen.
#1701961
Lesenswert?

@Basti
Für zu Hause kannst man das so machen, zumal Du die Bauelemente liegen
hast. Viele Leute hier arbeiten aber für Firmen und da ist das Gejaule
groß, wenn die einen Kondensator und einen Widerstand zuviel in der
Schaltung verbauen.

Die Routine von Peter Danegger funktioniert aber tadellos. Man braucht
eine Weile, um sie zu verstehen, weil er dort Register "hochkant"
benutzt, aber da muß man erst mal drauf kommen.

MfG Paul
#1701977
Lesenswert?

In dem Thread ist nun das immer wiederkehrende Thema kommentiert worden. 
Natürlich ist es teilweise ermüdend es immer wieder neu zu erklären, das 
ist aus meiner Sicht aber kein Grund überheblich und abwertend zu 
antworten.

Natürlich gehr es per Hardware. Die Flip-Flop Methode ist auch 
sicherlich die stabilste, aber es geht halt auch mit Software. Wenn man 
beim Kontaktprellen davon aus geht das jedes Prellen irgendwann mal zu 
Ende ist, dann kann man auch mit einem Mikroprozessor den Kontakt sicher 
"entprellen".

Die Methode die Peter vor langer Zeit mal beschrieben hat ist da sehr 
effizient. Sie belastet den Prozessor kaum. Sie funktioniert mit jedem 
Input und erwartet keinen Interrupt Eingang, man kann damit auch einen 
Analogeingang verwenden, wenn es die Schaltung erfordert oder nichts 
anderes mehr frei ist. Voraussetzung ist ein Timer, der mit konstantem 
Takt läuft. Das ist hier der Fall, weil es eine gemultiplexte Anzeige 
gibt. Die Sofware die innerhalb der Timerroutine läuft muss natürlich 
innerhalb der Timer Zeitspanne beendet sein. Delays innerhalb dieser 
Routine sind tödlich und somit verboten.

In meinem schnell zusammen geschusterten Digramm ist der Interrupt durch 
Markierungen auf dem Zeitstrahl symbolisiert. Bei jedem Interrupt gibt 
die Multiplex Anzeige des Displays eine neue Ziffer aus. Das geht 
unabhängig von allem Anderen immer so weiter. In der Interrupt Routine 
wird auch der Port ein gelesen, verglichen und das Ergebnis in Form 
eines Ereigniszählers gespeichert. Dabei ist es egal ob eine 0 oder eine 
1 gelesen wurde. Entscheidend ist das es der gleiche Wert war wie beim 
vorherigen Einlesen. Wenn der Zähler dann über einen definierten 
Schwellwert klettert wird der gespeicherte Wert vom Eingang als wahr an 
genommen.

Das ist alles. In dem man den Schwellwert erhöht, erhöht man die 
Wartezeit für das Entprellen. Die Basiszeit für die Entprellzeit ist der 
Takt des Timers.

Weil das alles kaum Zeit kostet und nichts mit aktiven Software delays 
zu tun hat, gab es hier in paar Kommentare in der Richtung. Weil man die 
Entprellzeit im Prinzip bis ins unendliche (masßlose Übertreibung) 
ausdehnen kann, wurde auch behauptet das man alles per Software 
entprellen kann. Der Software Aufwand ist wirklich gering. Meiner 
Meinung nach schlägt das jede Hardware Lösung, ob es nun ein Tiefpass, 
ein Flipflop oder ein spezieller "Entprell-Chip" ist. Peter hat das 
Ganze in Assembler sehr effiezient programmiert. Das macht es eventuell 
für den einen oder anderen schwer verständlich, aber man kann das 
natürlich in C, C++ oder Basic aufwändiger machen.

Auch wer es bisher nie in Software gemacht hat und bei dem Hardware 
immer funktioniert hat, Relais sind da eine echte Herausforderung. Ich 
persnlich schlage mich damit nicht mehr herum. Einen Timer habe ich fast 
immer mit laufen, um definierte Zeitabstände für Messungen zu haben oder 
eben Displays zu multiplexen. Der Code für die Entprellung fällt da 
überhaupt nicht ins Gewicht.

@Peter; sei bitte nicht so sehr bissig in Deinen Kommentaren. Nicht 
jeder ist in dem Thema so fit wie Du. Ich verstehe das es anfängt zu 
nerven, aber es gibt Dinge die sterben nie aus ...

Ach noch was ... das kam auch schon öfter ... ein Prozessor kan einfach 
NIE zu schnell sein um etwas zu entprellen! Das zeigt deutlich die 
"Delay Denke" und die führt einfach nicht zu einem zufieden stellenden 
Ergebnis.
Angehängte Dateien:
Gast #1701993
Lesenswert?

Ich bin beruflich mit so Atmegazeugs und Schaltungen tätig. Meine 
Erfahrung:
Der Tod einer jeden Software sind DELAYS. Erfahrungsgemäß kann man zum 
Projektstart nicht genau Einschätzen wie viel Code es geben wird. 
Meistens wächst das Ganze während der Entwicklung noch. Plötzlich ist 
die Entäuschung groß wenn der Controller zu langsam ist. Das A und O ist 
dass die Software immer läuft und nicht ständig in DELAYS rumhängt. Ein 
paar wenige DELAYS sind evtl. unumgänglich aber sonst kann man alles mit 
Timern lösen.

Frohes Tüfteln.
Gast #1702073
Lesenswert?

Hallo Gemeinde,

bin sehr froh über die große Rückmeldung von euch!

Ich benutzte in meinem Code keine Interrupts. Ich lasse die vier 
Transistoren einfach nacheinander Schalten.

Es dauert etwas eure Beiträge zu verdauen, da ich kein vertieftes 
Programmierwissen habe.

Wie bringe ich den die Funktion von P. Dannegger zum laufen? Wie kann 
ich da festlegen, an welchem PIN meine Taster hängen?

Mit dankendem Gruss

:)
#1702084
Lesenswert?

Suche Hilfe schrieb:

> Wie bringe ich den die Funktion von P. Dannegger zum laufen? Wie kann
> ich da festlegen, an welchem PIN meine Taster hängen?

Nochmal:
Schau dir die C Routinen im Artikel "Entprellung" an.
Versteif dich nicht darauf, dass im begleitenden Text alles drinnen 
steht. Oft genug muss man sch einfach nur den Code ansehen, dann wird 
einem vieles klarer. Im gegenständlichen Fall sind alle #define 
interessant. Den Inhalt der ISR brauchst du nicht analysieren, den 
übernimmst du einfach so wie er ist.
Im Beispiel main() ist ein Timer Setup gezeigt inklusvie Anmelden der 
ISR. Im weiteren ist in main() gezeigt, welche Funktionen aufzurufen 
sind.

Normalerweise müsstest du damit klar kommen, wenn du ein wenig mitdenkst

> Wie kann
> ich da festlegen, an welchem PIN meine Taster hängen?

Der Code fängt an mit:
1
#define KEY_DDR         DDRB
2
#define KEY_PORT        PORTB
3
#define KEY_PIN         PINB
4
#define KEY0            0
5
#define KEY1            1
6
#define KEY2            2
7
#define ALL_KEYS        (1<<KEY0 | 1<<KEY1 | 1<<KEY2)
8
 
9
#define REPEAT_MASK     (1<<KEY1 | 1<<KEY2)       // repeat: key1, key2
10
#define REPEAT_START    50                        // after 500ms
11
#define REPEAT_NEXT     20                        // every 200ms

Also: Was wirst du wohl ändern müssen, wenn deine Tasten an einem 
anderen Port / anderem Pin sitzen.
#1702088
Lesenswert?

Hi,

genau das hatte ich vermutet. Du wirst mit einer "linearen 
hintereinander" Programmierung keinen Erfolg haben. Deine Gemultiplexte 
Anzeige wird z.B. unterschiedlich Hell werden, je nach dem was Du tust.
Meiner Erfahrung nach geht es nur wenn Du eine Interrupt Routine 
schreibst, die mit konstantem Takt läuft. Du baust in der "Main" 
Funktion nur eine minimale Schleifem die den Mikroprozessor schlafen 
legt. Alles was Du an Funktionalität hast packst Du in die Interrupt 
Routine. Die Haupschleife tut nichts.
Du musst hier in Zeitscheiben denken, nicht seriell. Aus meiner Grafik 
kannst Du das erkennen. Wenn Du den Code später erweiterst wird auch 
Deine Anzeige nicht dunkler oder heller, so lange Du dafür sorgst das Du 
alle Aufgaben innerhalb eines Timer-Takes erledigen kannst.
Und mache Dir einen Alarmmerker; sobald Du anfängst ein Delay ein zu 
bauen stimmt etwas nicht mit dem Ablauf. Dann denke noch mal drüber nach 
wie es ohne Delay geht. Ich wette es geht immer ohne ...
Gast #1703011
Lesenswert?

Hallo nochmal alle zusammen,

was würde passieren, wenn mein Taster entprellt ist, der "Zählimpuls" 
jedoch länger dauert, als der Ablauf meines gesammten Codes?

@Karl heinz Buchegger

danke für den Hinweis..ich hatte den falschen Code zur Hand, bzw. nicht 
vollständig.


Ich dachte, dass ich mich mit meinem Projekt am Ende befinde, einige 
Hinweise von euch haben jedoch meine Einstellung etwas geändert. 
Vielleicht sollte ich ja meinen Code komplett überarbeiten.
Ich Multiplexe z.B so:
        PORTC = ziffer[z2];
  PORTB |= (1<<PB1);
  _delay_us(500);
  PORTB &=~(1<<PB1);

..und das für alle vier Anzeigen.

Ich probiere jetzt mal die von euch angesprochene 
"Super-Entprell-Software" aus.. :)
#1703026
Lesenswert?

Suche Hilfe schrieb:
> Hallo nochmal alle zusammen,
>
> was würde passieren, wenn mein Taster entprellt ist, der "Zählimpuls"
> jedoch länger dauert, als der Ablauf meines gesammten Codes?


Zeig den Code

Ich habe da eine Vermutung
Du zählst meiner Meinung nach nicht Flanken sondern Pegel. Und das geht 
natürlich klar in die Hose.

Wenn du das richtig machst, stellt sich nämlich die Fragestellung gar 
nicht. Wenn überhaupt, dann hat man höchstens das Problem, dass Pulse zu 
schnell sind als das man sie mit dem µC noch mitbekommt.

> Ich dachte, dass ich mich mit meinem Projekt am Ende befinde, einige
> Hinweise von euch haben jedoch meine Einstellung etwas geändert.

LOL
Abgesehen davon, dass ein Projekt nie wirklich 100% fertig ist, klingen 
deine Fragestellungen eher so, als ob du zwar vielleicht eine Lösung für 
das gerade anstehende Problem hast, die so recht und schlecht 
funktioniert. Aber ein Heftpflaster auf einem Loch im Autoreifen ist 
nicht wirklich ein Ersatz für eine fachmännische Lösung

> Vielleicht sollte ich ja meinen Code komplett überarbeiten.
> Ich Multiplexe z.B so:
>         PORTC = ziffer[z2];
>   PORTB |= (1<<PB1);
>   _delay_us(500);
>   PORTB &=~(1<<PB1);
>
> ..und das für alle vier Anzeigen.

Was du da hast, sieht zwar aus wie mulitplexen, wenn man nicht zu genau 
hinschaut. Aber in Wirklichkeit ist es Murx

(Ich hoffe du verzeihst mir die schonunglose Ausdrucksweise. Aber Murx 
muss man auch Murx nennen dürfen)
Gast #1703056
Lesenswert?

@Karl heinz Buchegger

Ich bin durchaus Kritikfähig..den nur so kann man "Wachsen". Das ist 
mein erstes Projekt in Sachen "Programmieren"

Auf dem Oszi sieht man Wunderbar die Zählimpulse. Ist es nun so, dass 
wenn die Zählimpulse zu lange dauern, der Atmega mehrfach zählt, oder 
ist es NUR vom Prellen abhängig


Hier ein Ausschnitt von meinem Code, welcher das "Multiplexen" und die 
Tastenabfrage beinhaltet :)
------------------------------------------------
MEIN MURX:


inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        // Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(10);

        if ( *port & (1 << pin) )
        {
            // Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(10);

            return 1;
        }
    }
    return 0;
}


void main bla bla


//         MULTIPLEXEN DER ANZEIGEN 1-4


//*********************************************************      PORTC = 
ziffer[z1];
   PORTB |= (1<<PB0);   // Transi1 = 1
  _delay_us(500);  //
  PORTB &=~(1<<PB0);   // Transi1 = 0

//*********************************************************
        PORTC = ziffer[z2];
  PORTB |= (1<<PB1);    // Transi2 = 1
  _delay_us(500);  //  ** ANZEIGE 2
  PORTB &=~(1<<PB1);    //Transi2 = 0

//*********************************************************
  PORTC = ziffer[z3];
  PORTB |= (1<<PB2);    // Transi3 = 1
  _delay_us(500);  //  ** ANZEIGE 3
  PORTB &=~(1<<PB2);    //Transi3 = 0

//*********************************************************      PORTC = 
ziffer[z4];
  PORTB |= (1<<PB3);    // Transi4 = 1
  _delay_us(500);  //  ** ANZEIGE 4
  PORTB &=~(1<<PB3);    //Transi4 = 0
//*********************************************************

  if (debounce(&PIND, PD6))  //Tastenentprellung für PIND6
           {
      z2++;
      t1++;
      }

  if (debounce(&PIND, PD5))  //Tastenentprellung für PIND5
           {
      z4++;
      t2++;
      }

//********************************************************************

Merci
Moderator (Firma: Titel) Persönliche Seite #1703061
Lesenswert?

> Ich dachte, dass ich mich mit meinem Projekt am Ende befinde,
Der Scherz des Tages:
Meine Software ist fertig... ;-)

Der Witz des Tages:
Meine Software ist fehlerfrei... :-/

> Ich dachte, dass ich mich mit meinem Projekt am Ende befinde,
Am Ende kann man auch sein, wenn es nicht mehr weitergeht...  :-o

Poste doch mal den ganzen Code, das hier sieht schon sehr 
verbesserungsfähig aus...
#1703070
Lesenswert?

OK Vergiss diese debounce Funktion sofort wieder.
Die ist, aufgrund der delays, sowieso Müll.

Das ist das eine
Das andere ist, wie ich es vermutet habe:
Du zählst nicht Pulse.

Einen Puls erkennt man daran, dass sich der Pinzustand ändert! Dazu muss 
man sich aber einen vorhergehenden Pinzustand merken und nur dann wenn 
sich der verändert, dann hat man die Flanke eines Pulses entdeckt
1
int main()
2
{
3
  ...
4

5
  uint8_t oldValue, newValue;
6

7
  ...
8

9
  oldValue = 0;
10

11
  while( 1 ) {
12

13
    newValue = ( PIND & (1 << PIND6) );
14

15
    if( newValue != oldValue ) {      // am Pin hat sich was getan
16
      if( newValue )                  // Ist er jetzt auf 1 (dann muss er vor Kurzem noch auf 0 gewesen sein,
17
                                      // sonst wären wir nicht durchs erste if gekommen)
18
                                      // dann haben wir die aufsteigende Flanke eines Pulses gefunden
19

20
        Puls++;                       // den Puls daher zählen
21

22
      oldValue = newValue;            // und den jetzigen Zustand merken, damit beim nächsten Schleifendurchlauf
23
                                      // eine Veränderung des Pins erneut erkannt werden kann
24
    }
25

26
    ....
27
  }

so zählt man Pulse. Indem man feststellt, wann sich der Zustand des 
Eingangs verändert.

Allerdings hat man jetzt ein Problem. Wie du schon weist prellen Taster. 
Dein µC ist jetzt schnell genug (bei dir durch die vielen delays 
wahrscheinlich nicht, aber die kommen ohnehin noch weg), dass der µC 
jeden einzelnen Preller als einen Puls ansehen würde.

Und genau da kommt die Entprellung in der ISR ins Spiel. Die macht 
nämlich beides gleichzeitig: sie entprellt und kümmert sich auch darum, 
dass du jeden Tastendruck nur ein einziges mal gemeldet bekommst.
Gast #1703094
Lesenswert?

@Karl heinz Buchegger

"Puls++;"  ist das dan quasi meine Zählvariable für den Zählerstand?
--> Was du gepostet hast wäre also meine neue Tastenabfrage?


Die Delays zwischen den Schaltzuständen der Transistoren benötige ich 
zur darstellung der Anzeigen (ohne Delay ist das zu schnell und die 
Anzeigen sind nahezu dunkel)
#1703113
Lesenswert?

Suche Hilfe schrieb:
> @Karl heinz Buchegger
>
> "Puls++;"  ist das dan quasi meine Zählvariable für den Zählerstand?
> --> Was du gepostet hast wäre also meine neue Tastenabfrage?

Nein!

Ich wollte dir nur grundsätzlich zeigen, wie man Pulse richtig erkennt.
1
  while( 1 ) {
2
    if( PIND & (1<<PD6) )
3
      Puls++;
4
  }
ist nun mal keine korrekte Pulserkennung. Aber genau darauf, mit ein 
paar delay gewürzt, läuft deine Debounce Lösung hinaus

Deine neue Tastenabfrage findest du im Artikel "Entprellung" und zwar 
bei den "Komfortroutinen in C"

> Die Delays zwischen den Schaltzuständen der Transistoren benötige ich
> zur darstellung der Anzeigen (ohne Delay ist das zu schnell und die
> Anzeigen sind nahezu dunkel)

Mach erst mal die Tastenabfrage richtig, ehe das Multiplexing auf eine 
vernünftige Grundlage gestellt wird und ebenfalls in genau den gleichen 
Interrupt hineinwandert.

(kann das Anzeige Multiplexing jemand anderer von den Regulars 
übernehmen? Ich muss um ca. 3 Uhr weg)
Gast #1703122
Lesenswert?

@Karl heinz Buchegger

danke Dir für deine Hilfe.

Woher hast Du Dir das Wissen angeeignet?

Ich verstehe ja, das dieses Prob für die Fortgeschnittenen lächerlich 
ist und nur unnötige Zeit und Nerven beansprucht...

Danke für die Hinweise..ich versuche mal meinen Weg zu gehen..

MFG

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