Forum: Mikrocontroller und Digitale Elektronik Taster als Schalter


von Tobias (Gast)


Lesenswert?

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

von ,,,, (Gast)


Lesenswert?


von Tobias (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

- 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...

...

von The Daz (Gast)


Lesenswert?

Tobias, wo hakt es denn ? Quadkommas link sollte dir doch schonmal
zeigen, womit du anfangen musst (Beschaltung der ports).

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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.

...

von Klaus Bröntgen (Gast)


Lesenswert?

...ihr machts einem anfänger aber auch nicht leicht....
(schön zu wissen, daß man was kann)

von Hannes L. (hannes)


Lesenswert?

> ...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?

...

von Klaus Bröntgen (Gast)


Lesenswert?

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!

von Klaus Bröntgen (Gast)


Lesenswert?

übrigens: der Link "Hilfe von Assembler/AVR-Studio" funzt nich....


http://www.mikrocontroller.net/studiohelp/Assembler/

von TravelRec. (Gast)


Lesenswert?

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.

von Karl heinz B. (heinzi)


Lesenswert?

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.

von Klaus Bröntgen (Gast)


Lesenswert?

.....geht doch!

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von Tobias (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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

von Klaus Bröntgen (Gast)


Lesenswert?

@ 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

von Hannes L. (hannes)


Lesenswert?

@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?

...

von Klaus Bröntgen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.