Forum: Mikrocontroller und Digitale Elektronik Entprellung einbinden in main


von Kenia (Gast)


Lesenswert?

Hallo,

ich möchte den Vorschlag der Tastenentprellung einbinden.
Ist es so umzusetzen: funktioniert nicht

WO LIEGT DER FEHLER

VIELEN DANK EUCH
1
char taster(void)
2
{
3
  static unsigned char zustand;
4
  char rw = 0;
5
  
6
  if(zustand == 0 && (PINA & (1<<PINA0))) 
7
  {
8
    zustand = 1;
9
    rw = 1;
10
  }
11
  else if (zustand == 1 && (PINA & (1<<PINA0)))
12
  {
13
    zustand = 2;
14
    rw = 0;
15
  }
16
  else if (zustand == 2 && !(PINA & (1<<PINA0)))
17
  {
18
    zustand = 3;
19
    rw = 0;
20
  }
21
  else if (zustand == 3 && !(PINA & (1<<PINA0))  
22
  {
23
    zustand = 0;
24
    rw = 0;
25
  }
26
  
27
  return rw;
28
}
29
30
int main(void)
31
{
32
while(1)
33
  {
34
  DDRA &= ~( 1 << PA0 );        
35
        PORTA |= ( 1 << PA0 );        
36
    
37
    if (taster)
38
    {
39
        PORTD = PORTD ^ ( 1 << PD0 );//OUTPUT
40
    }
41
}

von Peter D. (peda)


Lesenswert?

Kenia schrieb:
> WO LIEGT DER FEHLER

Du hast nichts kommentiert und auch nirgends die Funktion beschrieben.

P.S.:
Ich würd mal sagen, das compiliert nichtmal.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Kenia schrieb:
> Ist es so umzusetzen: funktioniert nicht

Was funktioniert nicht?

>   DDRA &= ~( 1 << PA0 );
>         PORTA |= ( 1 << PA0 );

Das gehört vor die while-Schleife. Es reicht, die Initialisierung nur 
einmal zu machen.

>         PORTD = PORTD ^ ( 1 << PD0 );//OUTPUT

Wo hast Du PD0 von PORTD auf Output gesetzt?

von Karl H. (kbuchegg)


Lesenswert?

Diese Zustandsmaschine kommt mir aber sehr bekannt vor. Ihre 
Hauptaufgabe ist es, einen Tastendruck zu erkennen.

Eine gewünschte entprellende Wirkung basiert darauf, dass es irgendwo 
einen _delay_ms geben muss (meist am Ende der Hauptschleife), den du 
einfach weggelassen hast und damit das zentrale Element der Entprellung 
(nämlich Däumchen drehen während der Taster prellt) vernichtet hast.

von Karl H. (kbuchegg)


Lesenswert?

Und das hier

>     if (taster)

IST KEIN Funktionsaufruf!
Deine 'Tastenerkennungsfunktion' wird daher überhaupt nicht benutzt.

von Fabian O. (xfr)


Lesenswert?

Außerdem benutzt Du weder eine Delay-Funktion noch einen Timer. Wie soll 
da eine Entprellzeit entstehen?

von Kenia (Gast)


Lesenswert?

Stimmt die Funktion muss
mit
If( tatser())... augerufen werden damit was passiert

von Kenia (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Diese Zustandsmaschine kommt mir aber sehr bekannt vor. Ihre
> Hauptaufgabe ist es, einen Tastendruck zu erkennen.
>
> Eine gewünschte entprellende Wirkung basiert darauf, dass es irgendwo
> einen _delay_ms geben muss (meist am Ende der Hauptschleife), den du
> einfach weggelassen hast und damit das zentrale Element der Entprellung
> (nämlich Däumchen drehen während der Taster prellt) vernichtet hast.

Es soll keine Zeit verloren gehen, deswegen soll der Zustand auf diese 
Art abgefragt werden wie von einem Beispielvorschlag von EUCH

von Karl H. (kbuchegg)


Lesenswert?

Kenia schrieb:

> Es soll keine Zeit verloren gehen, deswegen soll der Zustand auf diese
> Art abgefragt werden wie von einem Beispielvorschlag von EUCH

Dann musst du diesen Beispielvorschlag aber auch studieren und dir seine 
Vor und Nachteile ansehen! Insbesondere musst du dann aber auch ALLE 
notwendigen Komponenten des Beispielvorschlags übernehmen. So etwas 
funktioniert nur als Einheit und man kann nicht einfach nur die Teile 
sich rauspicken, die einem gefallen und den Rest lässt man einfach weg, 
selbst wenn er für die Funktion unabdingbar ist.

Oder warum glaubst du gibt es für jedes Problem praktisch fast immer 
mehrere mögliche Lösungen? Weil es eben DIE eierlegende Wollmilchsau 
nicht gibt. Irgendeinen Tod muss man immer sterben. Du kannst dir nur 
aussuchen welchen Tod du sterben willst.

Wenn es darauf ankommt, dass Tastendrücke zuverlässig entprellt und 
erkannt werden, OHNE das dadurch das restliche Programm merkbar 
verzögert wird, dann geht nichts über die Standard PeDa Entprellung. Für 
viele Aufgabenstellungen ist das die perfekte Lösung.

von danielosna (Gast)


Lesenswert?

if (taster())
statt if(taster)

von Bastler (Gast)


Lesenswert?

Ich mache eine Tastenentprellung über ein Flag, welches im Timer nach 
ca.300ms zurückgesetzt wird.
Benötigt auch "keine" Zeit im System.
Delays sind immer unschön...

von Kenia (Gast)


Lesenswert?

Wie sieht hier der code aus

von Bastler (Gast)


Lesenswert?

Ich verwende ein Zeitscheiben Prinzip.

Das erleichter einiges und ist deterministisch.


Pseudocode:

if(Taste is set)
{
  if(!Taste1_Flag)
  {
     Taste1_Flag = 3;
  }
}
...


Task100ms(void)
{
  if(Taste1_Flag)
  {
    Taste1_Flag--;
  }
}

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


Lesenswert?

Bastler schrieb:
> Ich mache eine Tastenentprellung über ein Flag, welches im Timer nach
> ca.300ms zurückgesetzt wird.
Du zählst also 3, 2, 1, 0. Die Tastenentprellung von Peter Dannegger 
packt 8 solcher Zähler in 2 Bytes. Cool, nicht wahr?

von Karl H. (kbuchegg)


Lesenswert?

Lothar Miller schrieb:
> Bastler schrieb:
>> Ich mache eine Tastenentprellung über ein Flag, welches im Timer nach
>> ca.300ms zurückgesetzt wird.
> Du zählst also 3, 2, 1, 0. Die Tastenentprellung von Peter Dannegger
> packt 8 solcher Zähler in 2 Bytes. Cool, nicht wahr?

... und filtert kurze Störspikes auch noch aus.
Was seine Lösung nicht tut. Nach dem 4.ten Spike wird ein Tastendruck 
gemeldet.

von Peter D. (peda)


Lesenswert?

Kenia schrieb:
> wie von einem Beispielvorschlag von EUCH

Wo ist das Problem, dann einen Link darauf zu posten?

Oder erwartest Du, daß jeder Leser alle Artikel auswendig kennen muß?
Kannst Du das etwa?

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.