Forum: Mikrocontroller und Digitale Elektronik Tasterabfrage in ISR


von Thomas H. (Gast)


Lesenswert?

ich möchte einfach mal ganz schnell Testen ob der Taster funktioniert 
ohne Entprellen...

In meiner ISR sollen meine beiden Eingänge abgefragt werden...
Leider funktioniert immer nur der Oberste...?! Was mache ich falsch?
1
// Interrupt Service Routine fuer Timer1
2
ISR(TIMER1_OVF_vect) 
3
4
{
5
  TCNT1 = 50000;         //Zaehlregister mit Vorladewert V vorladen / Berechnung: siehe unten
6
  //PORTD ^= _BV(PD7);    //LED toggeln
7
  
8
  
9
          if ( PIND & (1<<PD3))
10
          {
11
            PORTD |= (1<<PD7);
12
          }
13
          else
14
          {
15
            PORTD &= ~(1<<PD7);
16
          }
17
18
          if ( PIND & (1<<PD1))
19
          {
20
            PORTD |= (1<<PD7);
21
          }
22
          else
23
          {
24
            PORTD &= ~(1<<PD7);
25
          }
26
27
28
29
30
}

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Logisch.

Egal was sich bei der Abfrage von PD3 für Erkentnisse ergeben und in 
Form einer LED an PD7 visualisiert werden, die ein paar µs später 
erfolgende Abfrage von PD1 macht diese Erkentnisse zunichte, in dem sie 
ihrerseits der LED an PD7 ihr Ergebnis aufdrückt.

Sprich: Für ganz kurze Zeit spiegelt die LED den Status von PD3 wieder. 
Aber wie gesagt: für ganz kurze Zeit. Viel zu kurz für dich als Mensch 
um das wahrnehmen zu können.

: Bearbeitet durch User
von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Logisch.
>
> Egal was sich bei der Abfrage von PD3 für Erkentnisse ergeben und in
> Form einer LED an PD7 visualisiert werden, die ein paar µs später
> erfolgende Abfrage von PD1 macht diese Erkentnisse zunichte, in dem sie
> ihrerseits der LED an PD7 ihr Ergebnis aufdrückt.

das Problem ist...

Wenn ich den Taster an PIND.3 beätige Leuchtet die LED...
Wenn ich den Taster an PIND.1 betätige tut sich gar nichts obwohl sie 
eigentlich auch angehen sollte solange der Taster gedrückt ist oder 
nicht ?

von hufnala (Gast)


Lesenswert?

DDR richtig gesetzt? ich wuerde aber erwarten dass immer der untere 
funktioniert. Der pd7 ist nur fuer ein paar takte in dem zustand den du 
ueber  pd3 erzeugst, anschliessend ueberschreibt der zustand von pd1 das 
vorherige ergebnis,nicht?

//hufnala

von Thomas H. (Gast)


Lesenswert?

hufnala schrieb:
> DDR richtig gesetzt? ich wuerde aber erwarten dass immer der
> untere
> funktioniert. Der pd7 ist nur fuer ein paar takte in dem zustand den du
> ueber  pd3 erzeugst, anschliessend ueberschreibt der zustand von pd1 das
> vorherige ergebnis,nicht?
>
> //hufnala


DDRD |= (1<<PD7) | (1<<PD5);
PORTD |= (1<<PD3) | (1<<PD1);


schon... aber wenn der Timer wieder überläuft und beim überlauf wieder 
in die ISR läuft... und ich aber die andere Taste gedrückt halte, müsste 
es doch rein Theo... funktionieren oder nicht ?

von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Sprich: Für ganz kurze Zeit spiegelt die LED den Status von PD3 wieder.
> Aber wie gesagt: für ganz kurze Zeit. Viel zu kurz für dich als Mensch
> um das wahrnehmen zu können.

Wenn ich den Taster an PD3 drücke... Leuchtet die LED so das ich sie 
sehe... nur der Taster an PD1 tut nichts... wenn ich PD1 jetzt an erste 
Stelle setze funktioniert es... ?!

von hufnala (Gast)


Lesenswert?

Ok, mit dem verodern des ddr bin ich nicht sattelfest, sieht aber 
sinnvoll  aus.

Die antwort auf die frage ist aber nein. Abhaengig vom zustand von pd1 
gehts IMMER durch den einen ODER den anderen if zweig, damit wird pd7 
entsprechend gesetzt.
Wolltest du den zweiten auf pd5 und nicht auf pd7 ausgeben, das ddr 
scheint das vorzubereiten?
HW wackelg, taster defekt? mal getauscht?



//hufnala

von roffel (Gast)


Lesenswert?

if ( PIND & (1<<PD3))
          {
            PORTD |= (1<<PD7);
          }
          else
          {
            PORTD &= ~(1<<PD7);
          }


          _delay_ms(200);   // Mach das mal rein


          if ( PIND & (1<<PD1))
          {
            PORTD |= (1<<PD7);
          }
          else
          {
            PORTD &= ~(1<<PD7);
          }

von Thomas H. (Gast)


Lesenswert?

Ich glaube ihr versteht mich nicht...


Ich habe in meiner Schaltung 2 Taster... Einmal PORTD.1 & PORTD.3

Die möchte ich jetzt ABFRAGEN... Beide hintereinander in meiner ISR...
Der Erste Taster ( Der in der ISR an ERSTER Stelle steht, wird immer 
Korrekt ausgewertet) der zweite (so kommt es mir vor) wird gar nicht 
abgefragt... Sprich ich habe das Gefühl das nach der 1 sten "if" Abfrage 
schluss ist...

Mit beiden Tastern möchte ich einfach nur die selbe LED ansteuern 
(solange der Taster gedrückt ist)

von Walter (Gast)


Lesenswert?

Thomas H. schrieb:
> Ich glaube ihr versteht mich nicht...

nee, du verstehst nicht, lies noch Mal die Antwort von Karlheinz

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:
> Ich glaube ihr versteht mich nicht...

Ich glaube du verstehst da was nicht.

> Der Erste Taster ( Der in der ISR an ERSTER Stelle steht, wird immer
> Korrekt ausgewertet)


.... das kannst du ÜBERHAUPT NICHT FESTSTELLEN !

Du verwechselst da mit Sicherheit ein paar Anschlüsse.
ABer mir dem Code ist es unmöglich, visuell das Drücken des ersten im 
Code vorkommenden Tasters festzustellen. Du bist nicht Superman!


> Mit beiden Tastern möchte ich einfach nur die selbe LED ansteuern
> (solange der Taster gedrückt ist)

Das muss anders gemacht werden. Du brauchst einen Ausdruck, eine 
if-Abfrage, in der du die beiden Tasten miteinander verknüpfst.

: Bearbeitet durch User
von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Das muss anders gemacht werden. Du brauchst einen Ausdruck, eine
> if-Abfrage, in der du die beiden Tasten miteinander verknüpfst.

Wie müsste es denn verknüpft werden, wenn ich die beiden Tasten einzeln 
auswerden möchte ?

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:
> Karl Heinz schrieb:
>> Das muss anders gemacht werden. Du brauchst einen Ausdruck, eine
>> if-Abfrage, in der du die beiden Tasten miteinander verknüpfst.
>
> Wie müsste es denn verknüpft werden, wenn ich die beiden Tasten einzeln
> auswerden möchte ?

* Wie sollen denn die Tasten verknüpft sein?
  Soll die LED leuchten, wenn sowohl Taste 1 als auch Taste 2 gedrückt
  sind. (Also dann, wenn Taste1 UND Taste2 gedrückz ist)

* Oder soll die LED leuchten, wenn eine der beiden Tasten gedrückt ist,
  wen also Taste 1 ODER Taste 2 gedrückt ist (oder beide)

* und wie sind die Tasten angeschlossen? Liefern die eine 1 oder eine
  0, wenn sie gedrückt sind?

* wann leuchtet die LED? Wenn eine 0 oder wenn eine 1 an den LED-Pin
  ausgegeben wird?

: Bearbeitet durch User
von hufnala (Gast)


Lesenswert?

-mal anfangs 2 ausgaenge nehmen um zu sehen ob die hw passt, mir 
erschliesst sich die finale funktion noch nicht etwas mi 2 tastern zu 
machen was mit einem geht
-dann mal mit einem flussdiagramm und boolscher algebra (wertetabelle) 
mal aufzeichnen was man moechte, und das dann programmieren

//hufnala

von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> * Oder soll die LED leuchten, wenn eine der beiden Tasten gedrückt ist,
>   wen also Taste 1 ODER Taste 2 gedrückt ist (oder beide)

Sie sind gegen Maße geschaltet... Sprich ich arbeite mit dem Internen 
PullUp

von Karl H. (kbuchegg)


Lesenswert?

Je nachdem muss man das eben formulieren. Wobei man eventuell die 
Betrachtungsweise umdreht. Also nicht
* die LED soll leuchten, wenn entweder Taste 1 UND Taste 2 gedrückt ist
Sondern statt dessen
* die LED soll nicht leuchten, wenn sowohl Taste 1 ODER Taste 2 nicht 
gedrückt ist.

Logisch gesehen sind beide Versionen gleichwertig, wenn du dir das mal 
genauer überlegst. Aber unter Umständen ist eine der beiden Versionen 
leichter zu programmieren.

von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Je nachdem muss man das eben formulieren. Wobei man eventuell die
> Betrachtungsweise umdreht. Also nicht
> * die LED soll leuchten, wenn entweder Taste 1 UND Taste 2 gedrückt ist
> Sondern statt dessen
> * die LED soll nicht leuchten, wenn sowohl Taste 1 ODER Taste 2 nicht
> gedrückt ist.
>
> Logisch gesehen sind beide Versionen gleichwertig, wenn du dir das mal
> genauer überlegst. Aber unter Umständen ist eine der beiden Versionen
> leichter zu programmieren.

kannst du vill. mal ein Bsp. Posten ?! Ich habe jetzt noch nicht all zu 
viel Erfahrung mit "AVR C"

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:
> Karl Heinz schrieb:
>> * Oder soll die LED leuchten, wenn eine der beiden Tasten gedrückt ist,
>>   wen also Taste 1 ODER Taste 2 gedrückt ist (oder beide)
>
> Sie sind gegen Maße geschaltet... Sprich ich arbeite mit dem Internen
> PullUp

Gut.
1
   if( ( PIND & PD1 ) &&       // wenn Taste 1 nicht gedrückt
2
       ( PIND & PD3 )          // und wenn Taste 2 nicht gedrückt
3
     LED ausschalten
4
5
   else                        // mindestens eine der beiden ist gedrückt
6
     LED einschalten

von Karl H. (kbuchegg)


Lesenswert?

Oder zb auch so
1
     LED ausschalten
2
3
     if( !(PIND & PD1) )         // Taste 1 gedrückt
4
       LED einschalten
5
6
     if( !(PIND & PD3) )         // Taste 2 gedrückt
7
       LED einschalten

von Karl H. (kbuchegg)


Lesenswert?

oder so
1
     if( !(PIND & PD1) )         // Taste 1 gedrückt
2
       LED einschalten
3
4
     else if( !(PIND & PD3) )    // oder Taste 2 gedrückt
5
       LED einschalten
6
7
     else                        // wenn weder Taste1 noch Taste2 gedrückt
8
                                 // ist, dann ist keine von beiden gedrückt
9
       LED ausschalten

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Oder so
1
     if( !(PIND & PD1) ||   // Taste 1 gedrückt
2
         !(PIND & PD3) )    // oder Taste 2 gedrückt
3
       LED einschalten
4
5
     else                   // keine von beiden gedrückt
6
       LED ausschalten

von Karl H. (kbuchegg)


Lesenswert?

Viele Wege führen nach Rom.

Aber der Weg
1
   if( PIND & (1<<PD1) )
2
     LED ausschalten
3
   else
4
     LED einschalten
5
6
   if( PIND & (1<<PD3) )
7
     LED ausschalten
8
   else
9
     LED einschalten

führt NICHT nach Rom. Sondern nach Neapel.

Denn der Zustand der LED wird nur ganz kurz von PD1 bestimmt und sofort 
vom Zustand von PD3 überschrieben, sodass den Rest der 'Zeit' (und das 
ist das was du als langsamer Mensch wahrnehmen kannst), lediglich PD3 
den Zustand der LED wahrnehmbar beeinflusst.

: Bearbeitet durch User
von Thomas H. (Gast)


Lesenswert?

sollte es so funktionieren ?
1
// Interrupt Service Routine fuer Timer1
2
ISR(TIMER1_OVF_vect) 
3
4
{
5
  TCNT1 = 50000;        
6
  //PORTD ^= _BV(PD7);    //LED toggeln
7
  
8
  
9
   if (( PIND & PD1 ) && ( PIND & PD3 ))        
10
   
11
   {
12
        PORTD &= ~(1<<PD7);
13
   }
14
15
else
16
17
   {
18
     PORTD |= (0<<PD7);
19
   }
20
21
22
}

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:

>      PORTD |= (0<<PD7);

wie setzt man denn einen Port Pin?

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:
> sollte es so funktionieren ?

Formulier mal umgangssprachlich, was du hier


>    if (( PIND & PD1 ) && ( PIND & PD3 ))

programmiert hast.

von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Thomas H. schrieb:
>
>>      PORTD |= (0<<PD7);
>
> wie setzt man denn einen Port Pin?

???

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:
> Karl Heinz schrieb:
>> Thomas H. schrieb:
>>
>>>      PORTD |= (0<<PD7);
>>
>> wie setzt man denn einen Port Pin?
>
> ???


Na komm.
Du wirst doch wohl einen Port-Pin (an dem eine LED hängt) gezielt auf 0 
oder 1 schalten können!
Im Eröffnungsposting hast du es ja auch gekonnt.

von Thomas H. (Gast)


Lesenswert?

setzt man den denn so nicht rein "Theoretisch" auch auf "0"?

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> Thomas H. schrieb:
>> sollte es so funktionieren ?
>
> Formulier mal umgangssprachlich, was du hier
>
>
>>    if (( PIND & PD1 ) && ( PIND & PD3 ))
>
> programmiert hast.

Also jetzt nicht:
Wenn die bitweise Und-Verknüfung von PIND und PD1 ...

Lesen kann ich selber auch.

Der Ausdruck PIND & PD1 steht ja für etwas. Nämlich eine bestimmte 
Verknüpfung der Worte "Taste" und "gedrückt".
Wofür steht "PIND & PD1" ?

Was sagt also die komplette Kombination aus?

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:
> setzt man den denn so nicht rein "Theoretisch" auch auf "0"?

Jetzt enttäuscht du mich.

Was ergibt denn 0 << 1 für ein Ergebnis?

Was ist daher dann  PORTD |= 0 << 1;


Tip:
Es halt 0, in Worten NULL, Sinn, wenn du einfach nur die Zeichen 
irgendwo abmalst, aber nicht verstehst was du da warum abmalst.

Tip 2:
Man kann, in Analogie zur Multiplikation, eine Bitmuster aus lauter 0-en 
nach links schieben so oft man will. Das Ergebnis wird immer 0 sein. 
Genau wie in der Mathematik man 0 mit allem möglichen Multiplizieren 
kann: das Ergebnis ist immer 0.

: Bearbeitet durch User
von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Karl Heinz schrieb:
>> Thomas H. schrieb:
>>> sollte es so funktionieren ?
>>
>> Formulier mal umgangssprachlich, was du hier
>>
>>
>>>    if (( PIND & PD1 ) && ( PIND & PD3 ))
>>
>> programmiert hast.
>
> Also jetzt nicht:
> Wenn die bitweise Und-Verknüfung von PIND und PD1 ...
>
> Lesen kann ich selber auch.
>
> Der Ausdruck PIND & PD1 steht ja für etwas. Nämlich eine bestimmte
> Verknüpfung der Worte "Taste" und "gedrückt".
> Wofür steht "PIND & PD1" ?
>
> Was sagt also die komplette Kombination aus?


eine UND (&) Verknüpfung...

  00000010
& 00000010
_________
  00000010


....

so funktioniert das aber auch nicht ? :(


// Interrupt Service Routine fuer Timer1
ISR(TIMER1_OVF_vect)

{
  TCNT1 = 50000;         //Zaehlregister mit Vorladewert V vorladen / 
Berechnung: siehe unten
  //PORTD ^= _BV(PD7);    //LED toggeln


     if( !(PIND & PD1) || !(PIND & PD3) )
    {
   PORTD &= ~(1<<PD7);
  }
   else                   // keine von beiden gedrückt
    {
   PORTD |= (1<<PD7);
  }

}

von hufnala (Gast)


Lesenswert?

Gute Nacht..... :-)

//hufnala

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:

>> Der Ausdruck PIND & PD1 steht ja für etwas. Nämlich eine bestimmte
>> Verknüpfung der Worte "Taste" und "gedrückt".
>> Wofür steht "PIND & PD1" ?
>>
>> Was sagt also die komplette Kombination aus?
>
>
> eine UND (&) Verknüpfung...

Genau DAS wollte ich nicht wissen. Wie gesagt: Ich kann C Code lesen.

Das hier war die Frage:

> Nämlich eine bestimmte
> Verknüpfung der Worte "Taste" und "gedrückt".
> Wofür steht "PIND & PD1" ?

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:

> so funktioniert das aber auch nicht ? :(

so so

Und wie sind die LED angeschlossen?
Muss man eine 0 oder eine 1 ausgeben, damit eine LED leuchtet?

von Thomas H. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Thomas H. schrieb:
>
>> so funktioniert das aber auch nicht ? :(
>
> so so
>
> Und wie sind die LED angeschlossen?
> Muss man eine 0 oder eine 1 ausgeben, damit eine LED leuchtet?

Meine LED ist Active Low...

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> Thomas H. schrieb:
>
>> so funktioniert das aber auch nicht ? :(
>
> so so
>
> Und wie sind die LED angeschlossen?
> Muss man eine 0 oder eine 1 ausgeben, damit eine LED leuchtet?


Hinweis:
Das kann ich nicht wissen, wie das bei dir ist. Denn das hängt davon ab, 
wie die LED angeschlossen ist!
Aber du musst das wissen.

von Karl H. (kbuchegg)


Lesenswert?

Thomas H. schrieb:
> Karl Heinz schrieb:
>> Thomas H. schrieb:
>>
>>> so funktioniert das aber auch nicht ? :(
>>
>> so so
>>
>> Und wie sind die LED angeschlossen?
>> Muss man eine 0 oder eine 1 ausgeben, damit eine LED leuchtet?
>
> Meine LED ist Active Low...

Dann zeig mal dein komplettes Programm.
Schaun wir mal, was sonst noch so alles nicht stimmt.

: Bearbeitet durch User
von Thomas H. (Gast)


Angehängte Dateien:

Lesenswert?

Karl Heinz schrieb:
> Hinweis:
> Das kann ich nicht wissen, wie das bei dir ist. Denn das hängt davon ab,
> wie die LED angeschlossen ist!
> Aber du musst das wissen.

Das stimmt allerdings...

von Karl H. (kbuchegg)


Lesenswert?

Weil ich mich verschrieben habe.

Es muss natürlich

   PIND & ( 1 << PD3 )

etc. etc.
lauten

Mein Fehler.

: Bearbeitet durch User
von Thomas H. (Gast)


Lesenswert?

so ?

     if( PIND & (1<< PD1) ||  PIND & (1<<PD3) )
    {
   PORTD &= ~(1<<PD7);
  }
   else                   // keine von beiden gedrückt
    {
   PORTD |= (1<<PD7);
  }

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.