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
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.
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 ?
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
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 ?
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... ?!
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
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)
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.
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 ?
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?
-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
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
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.
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"
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.
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.
Thomas H. schrieb:> sollte es so funktionieren ?
Formulier mal umgangssprachlich, was du hier
> if (( PIND & PD1 ) && ( PIND & PD3 ))
programmiert hast.
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.
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?
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.
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);
}
}
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" ?
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?
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...
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.
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.
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...