Hallo Forum, Wie bereits im Betreff beschrieben habe ich ein Problem beim schalten der LEDS auf dem Atmel Board. Kurz vorweg, das AVR-GCC Tutorial habe ich bereits durchgelesen, zwar noch nicht komplett, aber eben bis zu der Stelle, an der ich dachte ich versuchen mal "learning by doing". Das Tutorial ist sehr gut aufgebaut, und eigentlich dachte ich auch ich hätte es verstanden. Nun irgendwie scheitert es aber bei der Umsetzung, und jetzt nach dem 3. Tag ohne sichtbare Erfolge hat wende ich mich doch mal an euch. Es handelt sich hierbei einfach nur um ein reines Übungsprogramm, mit dem ich die Sachen einfach noch einmal praktisch anwenden wollte. Wie oben im C-Code vermerkt wollte ich mit dem Taster T1 der an PD2 ( ATMEGA 32) hängt die LED1 am PORTD PD5 ein und aus schalten. Also erstes tasten LED an, weiteres tasten LED aus. Mein Problem ist, das sich dich LED sofort an ist, und sich nicht ausschalten lässt. Programmiert wird auf der VM unter WIN XP mit AVR-Studio 4 und Pony-Prog. Da es mein erster Beitrag ist, kurz zu mir was: Name sollte ja klar sein :-), 22 Jahre alt (jung?!), und komme aus dem Raum Nürnberg. Ich mache zur Zeit meinen Techniker, ab dem nächsten Semester mit der Fachrichtung Datenverarbeitung und wollte eben etwas vorarbeiten. Bin für jeden Tipp dankbar. Schönen Abend noch, Dominik
Dominik Bauer schrieb: > Mein Problem ist, das sich dich LED sofort an ist, und sich nicht > ausschalten lässt. Dann musst du noch mal deine Verkabelung durchschauen oder überprüfen ob du auch das richtige Hex-File in den µC brennst. Dein Programm hier in einen Mega16 (ist kompatibel zu einem Mega32) gebrannt macht genau das, was du programmierst hast. Die LED wird beim niederdrücken geschaltet und beim Loslassen wieder zurückgeschaltet.
Hallo, Danke schon mal für die Hilfe. Verkabelung passt, habe heute beide LEDS angesteuert und dauerhaft angeschaltet, daher sollte soweit alles ok sein. Vielleicht habe ich mich etwas zu doof ausgedrückt :-) Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt wird. Das ganze wollte ich mit Hilfe der Variable iT1 machen, darum setze und lösche ich diese in den if-Bedingungen. Mfg. Dominik
Dominik Bauer schrieb: > Vielleicht habe ich mich etwas zu doof ausgedrückt :-) > Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht > die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt > wird. Das ist aber etwas ganz anderes als du im Eröffnungsposting gesagt hast > Mein Problem ist, das sich dich LED sofort an ist, > und sich nicht ausschalten lässt. denn diese Fehlerbeschreibgun trifft definitiv bei mir nicht zu. Solange ich die Taste drücke ist die LED auch aus (bzw an. je nachdem wie rum m an die LED ansteuert) Wenn du etwas anderes willst, dann musst du das auch anders programmieren. ZB dadurch, dass du beim Loslassen der Taste einfach mit der LED nichts tust anstelle von den Ausgang toggeln.
Das Problem wird sein, dass dieser Kommentar hier
1 | if ((PIND & (1<<PIND2)) && (iT1==0)) //Schalten von PD5 auf 1 wenn T1=0 und PIND2 high |
im Grunde ein nichtssagender Kommentar ist (ganz abgesehen davon dass er falsch ist). In diesem Kommentar sagst du nichts, was nicht auch im Code steht. Schalten .... wenn t1=0 und PIND2 auf high. Ja, gut. Das sehe ich aber auch im Code! Das ist nix neues. Da steht eindeutig if ( Pin_ist_high && t1_ist_0 ) das ist genau dasselbe was auch der Kommentar sagt, nur halt in C Schreibweise. Aber: Was genau bedeutet es denn wenn t1 auf 0 ist? Das hast du nicht geschrieben. Und wenn du dir klar machst, was das eigentlich bedeutet, dann ist auch die Lösung schon nahe bzw. klar warum im gegenteiligen Fall (im anderen if) eben mit der LED nichts zu tun ist. Dieses t1 hat eine Bedeutung! Und darüber musst du dir im klaren sein, was die ist (und die Variable entsprechend ihrer Bedeutung benennen)
Hm, ok, anscheinend doch noch nicht so verstanden. Also mit der Abfrage if ((PIND & (1<<PIND2)) überprüfe ich ob am PIND2 eine 1 anliegt, also der Taster der dort angeschlossen wird gedrückt wird, stimmt das noch so weit? und mit der zusätzliche UND Verknüpfung mit iT1 wollte ich bezwecken das eben nur wenn eine 1 anliegt der Ausgange gesetzt wird. Daher setzte ich die Variable auch in der unteren if Abfragung wieder auf 0. Wenn T1 auf 0 ist, heißt das auch am Eingang des Atmega eine 0 anliegt. das wollte ich eben mit der Abfrage if (((PIND & (1<<PIND2))==0x00) überprüfen. Und da die Variable iT1 beim Einschalten eben auf 1 gesetzt wird, verknüpfe ich diese hier noch mit einem UND. EDIT: Achso, ja klar, wenn t1 auf 0 ist soll ja eigentlich gar nix passiern. sondern eben erst wenn er das nächste mal wieder eine 1 bekommt soll getoggelt werden. Wie gesagt, kann sein das ich hier total falsch liege, ist mein erstes Übungsprogramm. Vielen Dank
Dominik Bauer schrieb: > Hm, ok, anscheinend doch noch nicht so verstanden. > > Also mit der Abfrage > if ((PIND & (1<<PIND2)) > überprüfe ich ob am PIND2 eine 1 anliegt, also der Taster der dort Du denkst schon in viel zu vielen Details Dein Programm sieht so aus if( Taste ist gedrückt && Taste war vorher nicht gedrückt ) { // Jemand muss die Taste niedergedrückt haben Led Umschalten Merken, dass die Taste jetzt gedrückt ist, damit beim nächsten Mal abfragen dieser Zweig nicht wieder betreten wird, weil es ja keine Veränderung im Zustand der Taste gab, wenn die Taste auch weiterhin gedrückt bleibt } if( Taste is nicht gedrückt && Taste war vorher gedrückt ) { // DIe Taste ist wieder losgelassen worden Merken dass die Taste jetzt nicht gedrückt ist, damit beim nächsten Niederdrücken der Taste der Tastendruck durch Vergleich das aktuell vorliegenden Tastenzustands mit dem vorhergehenden Zustand der Vorgang des Niederdrückens selbder festgestellt werden kann } Du willst durch regelmässiges Nachsehen am Eingang feststellen, ob in der Zwischenzeit seit dem letzten Nachsehen die Taste ihren Zustand (gedrückt / nichtgedrückt) verändert(!) hat! Das ist die Bedeutung von t1: Darüber Buch zu führen, wie der Tastenzustand war als du das letzte mal nachgesehen hast. Nur dann wenn dieser Zustand nicht mehr mit dem aktuellen Zustand übereinstimmt, dann machst du möglicherweise eine Aktion. Je nachdem ob du feststellst, dass dir deine Werte das Niederdrücken oder das Loslassen der Taste anzeigen und ja nachdem ob dafür eine Aktion vorgesehen ist. Aber um eines kommst du nicht rum: Jede Taste die niedergedrückt wird, muss auch irgendwann wieder losgelassen werden. WEnn du daher in beiden Fällen eine Aktino machst, wobei das eine das Gegenteil vom anderen bewirkt, dann landest du automatisch am Ende nach einem Tastendruck wieder im Urzustand, weil ja ein Tastendruck zwangsweise aus Niederdrücken und Loslassen besteht. Wenn du ins Badezimmer reinschaust und das Licht ist aus, kannst du nichts weiter sagen als das das Licht aus ist. SIehst du aber eine halbe Stunde später nach und dann brennt plötzlich das Licht, dann muss irgendwer in der Zwischenzeit das Licht eingeschaltet haben. Beim nächsten Nachsehen brennt das Licht immer noch, ergo hat sich in der Zwischenzeit nichts getan. Bis dann beim 4.ten mal Nachsehen, das Licht wieder aus ist. Also muss es in der Zwischenzeit jemand ausgeschaltet haben. Du willst nur bei jedem mal, wenn das Badezimmerlicht eingeschaltet wurde, eine Lampe im Wohnzimmer umschalten. Wenn das Badezimmerlicht ausgeschaltet wurde, lässt du das Wohnzimmerlicht in Ruhe. Folge: Jedesmal wenn jemand im Badezimmer das Licht einschaltet, welchselt im Wohnzimmer das Licht seinen Zustand.
Karl Heinz Buchegger schrieb: > Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht >> die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt >> wird. Und da kommt dann sicher noch die Problematik "Entprellen" hinzu. citb
Ok, das habe ich jetzt verstanden.--> Also Abfragen ob die Taste nicht gedrückt ist, und davor gedrückt wurde (über die Variable) . Nur wie frage ich ab ob die Taste nicht gedrückt ist. if ((PIND & (0<<PIND2)) ?? Mfg, Dominik
citb schrieb: > Karl Heinz Buchegger schrieb: >> Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht >>> die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt >>> wird. > > Und da kommt dann sicher noch die Problematik "Entprellen" hinzu. > > citb Langt es nicht wenn der Taster Hardware-technisch Entprellt ist, und die Internen Pull-Ups aktiviert worden sind?
Dominik Bauer schrieb: > Langt es nicht wenn der Taster Hardware-technisch Entprellt ist, und die > Internen Pull-Ups aktiviert worden sind? Eher nicht, da treten je nach Schaltung boese Nebebeffekte auf. Einfach mal die Forensuche bemuehen, es gab gerade letztens einen Thread dazu. citb
citb schrieb: > Dominik Bauer schrieb: >> Langt es nicht wenn der Taster Hardware-technisch Entprellt ist, und die >> Internen Pull-Ups aktiviert worden sind? > > Eher nicht, da treten je nach Schaltung boese Nebebeffekte auf. > Einfach mal die Forensuche bemuehen, es gab gerade letztens einen Thread > dazu. > > > citb Danke, werd ich machen :-) Jetzt aber erst mal die Feierabend Sonne genießen. Mfg Dominik
Dominik Bauer schrieb: > Ok, das habe ich jetzt verstanden.--> Also Abfragen ob die Taste nicht > gedrückt ist, und davor gedrückt wurde (über die Variable) > . > > Nur wie frage ich ab ob die Taste nicht gedrückt ist. > if ((PIND & (0<<PIND2)) ?? No. Eine 0 kannst du schieben bis du schwarz wirst, das bleibt immer 0. if( ! (PIND & (1<<PIND2) ) so wie du das auch sagst: Es ist nicht der Fall, dass die Taste gedrückt ist :-)
Ok, ich habe das jetzt mal versucht umzusetzen. Code schaut nun folgendermaßen aus:
1 | |
2 | |
3 | if ((PIND & (1<<PIND2)) && (iT1==0)) |
4 | //Taster gedrückt und davor nicht gedrückt
|
5 | {
|
6 | PORTD = PORTD ^ 0b00100000; //schalten |
7 | |
8 | iT1=1; |
9 | }
|
10 | |
11 | |
12 | if (!(PIND & (1<<PIND2)) && (iT1==1)) |
13 | //Taster NICHT gedrückt und davor gedrückt
|
14 | {
|
15 | iT1=0; |
16 | |
17 | }
|
Vielleicht mal meine (falsche?!) Denkweiße dazu: erste Abfrage: Wenn Taster gedrückt und er davor nich gedrückt war, setzt er den PORTD auf 0b00100000 und die Variable auf 1 Jemand lässt den Taster los, Somit ist die erste if-Bedingung nicht mehr erfüllt und er prüft die 2. Also Taster NICHT gedrückt, und da T1 auf 1 steht war sie davor gedrückt --> demnach setzt er die Variable wieder auf 0. Somit kann das ganze von vorne beginneng, und da es XOR verknüpft wird, wird eben beim nächsten Tasten das ganze auf 0 gesetzt. Wo ist mein Denkfehler? Programm macht folgendes: LED1 ist dauerhaft an. Demnach kann ja was mit der ersten abfrage ob ein Taster gedrückt ist oder nicht, nicht stimmen ? Oder der Taster schaltet nicht richtig auf meim Board. Habe aber gerade kein Messgerät zur Hand um das zu überprüfen. Danke schon mal für die "Nachhilfe" Dominik
Dominik Bauer schrieb: > Wo ist mein Denkfehler? Nirgends > Oder der Taster schaltet > nicht richtig auf meim Board. Oder er hängt an einem anderen Pin oder .... Der Taster prellt wie Sau (dann würdest du es allerdings zumindest ab und zu flackern sehen) .... Vielleicht ist aber auch die LED an einem ganz anderen Pin .... oder .... Und jetz weißt du auch, warum in den Tuorien immer mit noch einfacheren Programmen angefangen wird. Denn, damit man mit einem Taster eine LED bei Tastendruck gezielt ein/aus schalten kann, müssen vorher schone eine Menge anderer Dinge geklappt haben. > Habe aber gerade kein Messgerät zur Hand > um das zu überprüfen. Das wäre gut, wenn du das tun würdest. Noch besser wäre es, erst mal mit einem einfacheren Programm einfach nur zu überprüfen ob du zb die LED ansteuern kannst.
Hallo, Ich denke ich hab den Fehler gefunden. Wenn ich mit dem Messgerät direkt am PD2 messe, und den Taster nicht drücke, liegen bereits 2,7V an. Beim drücken des Tasters liegen dann 5V an. Ich nehme an das die 2.7V im Ruhezustand bereits zu einem high Signal führen. Anscheindend is das ein Fehler auf meim Board, da dieses Phänomen an allen drei Tastereingängen vorliegt. Vielen Dank für die Hilfe! Dominik
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.