Hallo, kann mir jemand erklären, wie ich bei einem Atmega per Taster an einem Port LED's an einem anderen Port ein und ausschalten kann. Es würde es mir reichen, wenn ich ein beispiel für z.B. 2 Taster an einem Port und 2 LED's an einem anderen Port hätte. Darauf könnte ich dann aufbauen und weiter einarbeiten. Danke vorab für eure Hilfe Tobias
da habe ich mich wohl nicht sehr deutlich ausgedrückt? Der Taster soll eine Schalterfunktion einnehmen. D.h. beim ersten mal drücken soll eine LED an gehen, beim nächsten Drücken wieder aus. Ich trete auf der Stelle da ich nicht weis, wie ich das Programm schreiben muss um den Zustand zu halten bis ein erneuter Wechsel eines Bits vorliegt.
- Artikelsammlung aufrufen (Link am linken Rand), - Suche nach "entprellung", - verstehen, wozu Entprellung dient, - verstehen, wie Entprellung funktioniert, - "AHA" sagen, - T-Flipflop in Software nachbilden, - fertig... ...
Tobias, wo hakt es denn ? Quadkommas link sollte dir doch schonmal zeigen, womit du anfangen musst (Beschaltung der ports).
Oder: Beiligendes Programm analysieren, da wird das Ein/Ausschalten eines Ausgangs (Laserdiode) auf die von dir gewünschte Art realisiert. Musst aber etwas suchen, da das Programm noch andere Arbeiten zu erledigen hat. ...
...ihr machts einem anfänger aber auch nicht leicht.... (schön zu wissen, daß man was kann)
> ...ihr machts einem anfänger aber auch nicht leicht.... > (schön zu wissen, daß man was kann) Meinst du, dass das jetzt fair ist? Oder sollen wir etwa das, was schon aufgeschrieben existiert, alles nochmal schreiben, weil jemand keine Lust hat, einem Link zu folgen und etwas Text zu lesen, aus dem er sich das Zutreffende selbst heraussuchen muss? ...
das vielleicht nicht. aber ich (ebenfalls recht neu bei avr&co) habe schon ein paarmal bemerkt, daß: 1) man manchmal den wald vor bäumen nicht sieht in so einer wissenssammlung 2) man nur mal einen verbalen anstoß (keinen fertigen code) auf "hausfrauendeutsch" braucht (hier zb. -vermutlich- cbi/sbi o.ä.) 3) es hier diverse poster gibt, die prinzipiell nix zum thema sagen, aber erstmal ihrem stolz luftmachen müssen gegenfrage: findest du ein assembler-suchspiel fair? vielleicht schätze ich ja auch die situation völlig falsch ein, aber ich fand sie mal wieder sehr bezeichnend. will mich aber nicht wegen "anderer leute" sorgen mit euch streiten. nix für ungut!
übrigens: der Link "Hilfe von Assembler/AVR-Studio" funzt nich.... http://www.mikrocontroller.net/studiohelp/Assembler/
Denkanstoß: Du machst Dir einen Pin mit internem PullUp fertig, daran bunzelst Du einen Taster nach Masse. Du fragst den Pin zyklisch ab, wenn er logisch 1 ist, ist der Taster nicht gedrückt, wenn er logisch 0 ist, ist der Taster gedrückt. Wenn Dein Programm nun feststellt, daß der Taster gedrückt ist, laß´ es noch eine Zeit lang warten (so 20 ms), dann guckt es nochmal, ob er immer noch gedrückt ist. Das ist die Entprellung. Wenn die Taste also auch bei der zweiten Abfrage gedrückt war, dann wird ein Statusbit auf 1 gesetzt. Jetzt läßt Du Dein Programm den Pin auf "Loslassen des Tasters" testen. Solange er nicht losgelassen wurde (auch wieder 2x abfragen), wird kein neuer Schaltimpuls angenommen. Wenn dann mal wieder ein neuer, gültiger Tastenimpuls erkannt wurde, kehrst Du den aktuellen Wert des Statusbits um. Im Hauptprogramm testest Du dann das Statusbit, ist es 1, machst Du die LED an, ist es 0, machst Du die LED aus. Nicht vergessen, das Statusbit bei Programmstart (nach RESET) auf 0 zu initialisieren. So, nun schnapp´ Dir mal den Assembler-Guide und einige Codschnipsel von Atmel oder hier aus´m Forum, und geh´ das Ganze nochmal durch.
Vorschlag von mir: Mach Dir die Sache fuers Erste noch einfacher. Schau einfach nur, dass die Led brennt, wenn der Taster gedrueckt ist und umgekehrt. D.h. vergiss zunaechst mal die Schaltfunktion. Durch diese Vereinfachung wird das Program zunaechst mal ziemlich trivial und Du kannst Dich mit dem Ganzen drumherum vertraut machen: Assembler, Flashen des Prozessors, anschalten der Hardware, usw. Das ist ein beliebter Trick in der Programmierung: Fang mal mit einem vereinfachten Problem an. Das was Du dort lernst kann beim echten Problem nur hilfreich sein.
> gegenfrage: findest du ein assembler-suchspiel fair? Ja, finde ich... Denn hätte ich nur den relevanten Codeschnipsel sbrs tfl,tla ;Taste für Laserschalter gedrückt? rjmp savezeit ;nein... in wl,lap ;Laserport einlesen ldi wh,1<<lapi ;Laserpin eor wl,wh ;toggeln out lap,wl ;und wieder ausgeben cbr tfl,1<<tla ;Tastenflag löschen gepostet, dann wäre es schwer, ihn zu verstehen, da die anderen Informationen (z.B. Bezeichner) fehlen. Außerdem ist die relevante Sequenz anhand der Kommentare sehr gut zu identifizieren. Sehr wichtig ist auch das Entprellen der Tasten "im Vorbeigehen", also ohne das Programm anzuhalten oder mittels Warteschleifen auszubremsen (wie auch vorgeschlagen wurde). Wer sich einmal den Programmierstil mit Warteschleifen angewöhnt, der kommt nur schwer davon wieder weg. Weiterhin war es mir mit diesem Beispiel wichtig, zu zeigen, wie man Register mit Namen versieht, Konstanten definiert und ein Programm halbwegs lesbar schreiben kann, also das Drumherum um SBI/CBI. Wenn du meinst, das wäre unfair (also eher eine "Verarsche" als eine Hilfe), dann weiß ich nicht, was du von diesem Forum erwartest. Fakt ist nunmal, dass die Aufgabenstellung (mittels Taster am AVR ausgangsbits toggeln) nicht so einfach zu realisieren ist. Man muss dazu: - Pin abfragen - Entprellen - Einschaltflanke des (entprellten) Tasters erkennen - Ausgangspin toggeln Und da der AVR das nur nebenbei machen soll und ansonsten andere Aufgaben bekommen soll, sollte darauf geachtet werden, dass hierbei das Programm nicht ausgebremst oder angehalten wird. ...
Hallo alle zusammen, ihr habt mich überzeugt! Meine Eisntiegsaufgabe ist wohl doch nicht so simpel. Ich fange jetzt erst mal klein an. Vielleicht komme ich dann selber auf eine Lösung. Tobias
Ich habe das hier aus dem Forum hier. Dürfte auch hilfreich sein. (Muss aber zugeben ich habs noch nicht reallife getestet weil ich gerade noch an was anderem baue....) ; in xl,tap ;Tastenport einlesen (gedrückt=L) ; com xl ;invertieren (gedrückt=H) ; eor xl,tas ;nur Änderungen werden H ; and tz0,xl ;Prellzähler unveränderter Tasten löschen (Bit0) ; and tz1,xl ;Prellzähler unveränderter Tasten löschen (Bit1) ; com tz0 ;L-Bit zählen 0,2,->1, 1,3,->0 ; eor tz1,tz0 ;H-Bit zählen 0,2,->tz1 toggeln ; and xl,tz0 ;Änderungen nur dann erhalten, wenn im Prellzähler ; and xl,tz1 ;beide Bits gesetzt sind (Zählerstand 3) ; eor tas,xl ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus ; and xl,tas ;nur (neu) gedrückte Tastenbits bleiben erhalten ; or tfl,xl ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung) ; ;in "tas" steht jetzt der gültige Tastenzustand, ; ;in "tfl" die Flags der neu gedrückten, noch nicht abgearbeiteten Tasten... ; ret
@ hannes: nun komm mal wieder runter. du wirst doch wohl selbst einsehen, daß ein kommentarlos dahingeworfenes stück code...sagen wir mal: eine nicht ganz so große hilfe wie die posts nach meiner achso gemeinen behauptung ist. sicherlich, es ist schön auskommentiert und auch ein musterbeispiel in sachen "wie mache ichs richtig"; aber ein helfendes oder eine kurze wegbeschreibung wort kann ja nicht schaden. von verarsche habe ich nicht gesprochen, auch nicht zwischen den zeilen! und da es jedesmal so ist: tschuldigung, ich wollte weder dich, noch die anderen, noch das forum als solches denunzieren, degradieren oder was auch immer. wenn mir das alles hier zu blöd wäre, dann wäre ich ja wohl kaum hier. ich respektiere sehr wohl, was du kannst! aber vielleicht ist dir ein wenig der bezug zur situation "bin neu im thema, wie fange ich um gottes willen was an???" abhanden gekommen. wenn nicht, sorry für diese boshafte unterstellung. ich hatte halt nur den eindruck. es geht mir aber sicherlich langsam auf den geist, daß man sich hier ständig für seine eigene meinung entschuldigen muß, da sich jemand auf den schlips getreten fühlt. beim durchstöbern der beiträge hier habe ich noch ganz andere tonfälle und angriffsformen erlebt. meines erachtens nach bin ich da eher harmlos. und jetzt laßt uns hier nicht ständig streiten wie die kinder!!! bis später
@Klaus: > @ hannes: > nun komm mal wieder runter. Ich kann mich nicht erinnern, dass ich mich im Ton vergriffen hätte und/oder jemand persönlich beleidigt hätte. Daher kann man nicht davon ausgehen, dass ich "oben" (auf der Palme?) wäre. Lies doch bitte nochmal die Beiträge von Anfang an. Nicht ich habe mit der unsachlichen Streiterei angefangen, sondern du. Da werde ich wohl das Recht haben, mich zu rechtfertigen. Zugegeben, mein erstes Posting war etwas provokant. Es sollte aber nur klar machen, dass das Problem etwas komplexer ist, als der Fragesteller vermutet hatte. Deshalb habe ich die zu lösende Aufgabe in mehrere kleinere (realisierbare) Aufgaben unterteilt und aufgelistet. Mein zweites Posting war kein "kommentarlos dahingeworfener Code", sondern ein sehr üppig kommentierter (nicht "auskommentiert") ASM-Code, der sehr übersichtlich und daher gut lesbar ist. Ich hätte auch auf die Codesammlung verweisen können, doch die dort vorgestellten Codes sind meist etwas komplexer und daher schwerer zu verstehen. Ich habe es mir auch verkniffen, einfach pauschal auf die Suchfunktion zu verweisen, denn da findet man zwar viele gute Beispiele, aber eben auch einige schlechte Beispiele, wo der Controller eben auf ein Ereignis (Pegeländerung am Eingang) wartet, anstatt es "im Vorbeigehen" auszuwerten und sich wieder anderen Aufgaben zu widmen. Denn warum soll man sich erst einen schlechten Programmierstil angewöhnen, den man sich später nur schwer wieder abgewöhnen kann? Klar, optimal ist mein Programmbeispiel auch nicht, heute würde ich es auch anders schreiben. Aber es ist einfach, übersichtlich und gut kommentiert. Was hast du eigentlich zur Lösung beigetragen? - Oder bist du hier jetzt der Moderator? ...
guten morgen, hannes! ich glaube nicht, mit unsachlichen streitereien angefangen zu haben. ich erlaubte mir nur einen hinweis ob der reserviertheit der ersten ansagen. (mit einem satz!)- was ist daran streiterei? aber laß mal das "der-hat-angefangen"-thema beiseite.... ob der code nun kommentiert oder auskommentiert ist, ist linguistische harrspalterei, wobei wir wohl das selbe meinten. für lesbarkeit und übersicht und korrektheit habe ich dich schon gelobt, falls es dir beim lesen meines posts entgangen sein sollte (es war auch ehrlich gemeint). von "unoptimalität" habe ich nicht gesprochen, kann ich so auch nicht beurteilen. suchfunktionen dienen nur denen was, die genau wissen, wonach sie suchen. soll heißen, man braucht schon das richtige schlagwort, sonst landet man im wissens-nirvana. das du dich bemühst, einem gleich den besseren stil zu vermitteln, ist löblich und gut so.(auch wieder ehrlich) ich habe zur lösung nix beigetragen, war selber auf eine gespannt (nochmal: ich bin auch neu bei avr&co). nein, der moderator bin ich nicht, wills auch nicht werden. habe mir lediglich erlaubt, auch was zu sagen. (einfach nur, um etwas hilfreichere aussagen a la travelrec,heinzi und ulrich zu "provozieren"). wenn alle posts, die mit der lösung des problems nichts zu tun haben, aus diesem forum entfernt würden, wäre es mittlerweile sehr übersichtlich. nochmal: ich finde es quatsch, sich auf der suche nach einer lösung wegen irgendwelcher animosiäten in die haare zu kriegen. schließlich will ich ja auch mal ne frage stellen dürfen, ohne davon ausgehen zu müssen, daß du vielleicht die antwort weißt, sie mir aber aus frust vorenthälst, da du mich für einen fiesen,unwissenden,belehrenden streithahn hälst (attribute sind von mir gewählt und sollen keine unterstellung sein). in diesem sinne: drushba!
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.