Forum: Mikrocontroller und Digitale Elektronik Taster als Schalter


von Sascha P. (pagemaster77)


Lesenswert?

Hallo Gemeinde

Ich hab vor ein paar wochen mit dem Thema Microcontroller begonnen....
Naja kleine LED am Board Blinken lassen....
Kleines Lauflicht erstellt.

Nun versuch ich mich an den Taster auf dem Board.

Wenn ich den Taster drücke bzw gedrückt halte geht nur eine LED an.
Wenn ich den Taster loslasse läuft ein Lauflicht durch 8 LED.

Das ganze hab ich mit IF gelöst:

if ( PIND & (1<<PIND0) ) {   ....   }

else ....

1.Hab ich das Problem das in der art programmierung er nicht umschaltet 
wenn ich den Taster im Lauflicht drücke, sondern erst wenn er das 
Lauflicht bzw die IF bedingung verlassen hat und neu prüft ob die 
bedingung am Taster erfüllt ist.

2.Würde ich gern mit einem Taster hin und her schalten.
Bedeutet wenn Taster gedrückt dann .....
Wenn taster erneut gedrückt dann ....
Ich  hab gelesen das dies mit XOR gelöst wird.
er Prüft den zustand und ändert ihn nur wenn .....


Da ich allgemein gerade gedanklich nicht weiter komme als anfänger, und 
das tutorial schon 3 mal gelesen habe, hoffte ich ihr könntet mir ein 
paar codeschnipsel mit erklärung posten.

Sorry das ich mich etwas blöd anstelle , aber als anfänger ist manchmal 
etwas viel input aufeinmal.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sascha Peters schrieb:
> Das ganze hab ich mit IF gelöst:
> if ( PIND & (1<<PIND0) ) {   ....   }
> else ....
> 1.Hab ich das Problem ...
Das Problem liegt nicht in diesem Programmausschnitt!

> ihr könntet mir ein paar codeschnipsel mit erklärung posten.
Du hast offenbar die Richtung verwechselt...
Du solltest deinen Code (als Anhang mit Endung *.c) posten. Sonst müsste 
jeder wieder seine Glaskugel rausholen und rumraten...

> Microcontroller
Welcher denn?

Lies mal deine Frage und überleg, ob du eine sinnvolle Antwort geben 
könntest, wenn du nur das wüsstest, was da steht.
Oder kurz: Netiquette

von Sascha P. (pagemaster77)


Angehängte Dateien:

Lesenswert?

Entschuldigung ....
ist noch etwas neu für mich..
Ich hab nen ATMEGA 16 mit board:

http://www.gotronik.pl/zestawyuruchomieniowe/mod_avr_atmega16v2.html

von Philip Z. (zudy)


Lesenswert?

Hallo Sascha!

Ich wuerde das Programm ein wenig anders aufbauen.

1. Benutze doch einen Timer anstelle der Delays, wird dir spaeter viele 
Probleme ersparen.

2. Ich wuerde eine Variable verwenden welche die Richtung des Lauflichts 
bestimmt. z.B.: 1 = rechts, 0=links
In einer einfachen if-Schleife kannst du diese beim erreichen von 0 bzw. 
7 aendern.

Bin auch kein Experte in Sachen Microcontroller, aber was ich von der 
Schulzeit in Erinnerung habe, wurde das immer so gemacht...

Hoffe ich konnte dir ein bisschen helfen.

von Sascha P. (pagemaster77)


Lesenswert?

ja das programm war dafür eigentlich auch nicht gedacht sondern von mir 
immer nur weiter geschrieben.
Ich kann dies auch besser mit IF und else als mit 2 IF abfragen machen.

Wichtig war mir die Tasterfunktionen, da komm ich einfach nicht weiter.
So wie ich das in C geschrieben habe würde der C profi die hände über 
den Kopf zusammen schlagen, aber ich wollte erstmal die funktionen 
verstehen, und ein bissl was lernen.
Deshalb hatte ich auf Codeschnipsel mit erklärung gehofft.

von Shuzz (Gast)


Lesenswert?

Programmiere Dein Lauflicht erstmal unter Verwendung eines Timers.

D.h. Du stellst einen Timer so ein, dass er alle sagen wir mal ~250ms 
einen Interrupt auslöst. (z.B. 16-Bit Timer nehmen, Vorteiler von 64 und 
auf Overflow warten)

In der Interruptroutine erledigst Du dann das Lauflicht (simple Methode, 
eleganter wäre es, im Timer nur nen Flag für's Hauptprogramm zu setzen 
und das Lauflicht dort zu erledigen).

Dann brauchst Du noch eine Variable in der Du Dir merkst ob das 
Lauflicht grade laufen soll oder nicht.

Diese Variable kannst Du dann in der Mainloop mit Deinem Taster togglen.

Dann wirst Du merken, dass Du ausserdem noch eine Entprellroutine 
brauchst weil Taster nunmal eben die unangenehme Eigenschaft des 
Prellens haben. Das merkst Du daran, wenn Dein Programm scheinbar 
erratisch auf das Drücken des Tasters reagiert und Du einfach keine 
Erklärung dafür findest... ;)

Zum Thema Entprellen gibt's hier in der Codesammlung eine hervorragende 
Routine von Peter Danegger, einfach mal suchen.

von Sascha P. (pagemaster77)


Lesenswert?

einen Timer hab ich noch nicht programmiert.
Ich weiß wohl das das mit dem Internen Takt wohl erledigt wird.

Interrupt muß ich mich auch erstmal noch 5 mal einlesen.

dachte ich versuchs der reihe nach einlesen und ausgeben....
und dann weiter.

Okay werd dann wohl weiter versuchen..
erstmal lauflichter zu bauen.

von Thomas E. (thomase)


Lesenswert?

Philip Z. schrieb:
> In einer einfachen if-Schleife
http://www.if-schleife.de/

Sascha Peters schrieb:
> dachte ich versuchs der reihe nach einlesen und ausgeben....
> und dann weiter.
Das ist ja auch grundsätzlich richtig. Aber der nächste Schritt ist 
jetzt der Timer.

Denn das
>PORTB &= ~(1 << i);
>_delay_ms (500);
>PORTB |= (1 << i);
ist das, was du nicht haben willst. Der Controller trampelt einfach 
500ms auf der Stelle und macht weiter gar nichts. Auch nicht den Taster 
abfragen.

> Okay werd dann wohl weiter versuchen..
> erstmal lauflichter zu bauen.
Aber nur mit Timer. Sonst trampelst DU auf der Stelle.

mfg.

von Klaus 2. (klaus2m5)


Lesenswert?

Timer kann man auch ohne Interrupt zur Zeitmessung benutzen. Statt der 
Delay-Schleife kann man zum Beispiel am Anfang der Schleife den Counter 
abfragen, dann die Wartezeit addieren und warten bis der Counter das 
erwartete Ergebnis erreicht hat. Nun kann in der Warteschleife die 
Tastenabfrage mit eingebaut werden.

So habe ich das als Anfänger vor Jahrzehnten mal programmiert.

von Sascha P. (pagemaster77)


Lesenswert?

habt ihr mal ein paar codeansätze um dies besser zu verstehen?
Ich weiß ich bin unhöflich.
Ich will nicht das man mir das vorkaut.

Ich habe damals als laie hobbytechnisch an HTML gewagt....
als das mir zu blöd wurde bin ich an PHP gegangen.
Als ich mich entschieden habe mehr computer als webbasiert zu lernen bin 
ich richtung c++ gewandert.
Allerdings alles nur halb, da ich mir alles selbst angelesen habe.
nun spring ich auf die c Schiene aufgrund von microcontroller.

Mir fällt es zwar etwas leichter einen code zu lesen.
aber nicht immer alles ist gleich verständlich.

Ich bin auch erst 2 wochen an dem Thema dran und vorher war alles 
neuland.
Mein Arbeitskollege brachte mich auf das Thema, da er seinen Techniker 
macht.

Nur mal als kleiner anriss warum ich gerade da stehe wo ich stehe.

Für mich dient das als Hobbyzweck als beschäftigung.
Vielleicht möchte ich das mal mit meinem Hobby Modellbau verbinden, oder 
auch etwas weiter in die Elektroschiene.

von ....bitte ausfüllen.... (Gast)


Lesenswert?

Klaus 2m5 schrieb:
> Timer kann man auch ohne Interrupt zur Zeitmessung benutzen. Statt der
> Delay-Schleife kann man zum Beispiel am Anfang der Schleife den Counter
> abfragen, dann die Wartezeit addieren und warten bis der Counter das
> erwartete Ergebnis erreicht hat.

Das ist aber nicht sinnvoll.

von Klaus 2. (klaus2m5)


Lesenswert?

....bitte ausfüllen.... schrieb:
> Klaus 2m5 schrieb:
>> Timer kann man auch ohne Interrupt zur Zeitmessung benutzen. Statt der
>> Delay-Schleife kann man zum Beispiel am Anfang der Schleife den Counter
>> abfragen, dann die Wartezeit addieren und warten bis der Counter das
>> erwartete Ergebnis erreicht hat.
>
> Das ist aber nicht sinnvoll.

Wir kommen halt nicht als Experten auf die Welt! Es sollte auch nur als 
Beispiel dienen, wie man sich an die Implemetierung von Timer-Interrupts 
herantasten kann.

von aa (Gast)


Lesenswert?

Wichtig ist für dich zu verstehen das der µC nur eine sache gleichzeitig 
machen kann(ok stimmt nicht ganz aber für den Anfang)

Wenn du nicht mit Timer und Interrupts arbeiten willst, gibt es noch die 
Möglichkeit eine Sequenze aufzubauen, was bei dem einfachen fall noch 
geht aber aufwendig ist. Dafür gibt es in c die switch case anweisung.

Sieht dann so aus


endless loop
  lese Taster
  merke Zustand Taster aktuell

  fall 1 Taster an -> LEDs An
  fall 2 Taster aus LED N AUS LED N + 1 An

  warte zeit
loop

der Vorteil ist das du nach jedem LED umschalten den Taster Abfragst, 
der Nachteil ist das du den Taster länger als die Warte Zeit gedrückt 
halten musst

von Karl H. (kbuchegg)


Lesenswert?

Sascha Peters schrieb:

> habt ihr mal ein paar codeansätze um dies besser zu verstehen?

FAQ: Timer

Und ja, Timer sind wirklich der nächste Schritt.

Am Anfang seiner Studien ist _delay_ms ok. Denn irgendwo muss man 
anfangen und man kann nicht alles gleichzeitig lernen. Aber irgendwann 
kommt der Punkt, an dem man einsehen muss, dass _delay_ms keine Lösung 
ist, sondern im Gegenteil oft das Problem darstellt.

Ausnahme sind ganz kurze Wartezeiten, aber abgesehen davon ist ein Timer 
samt Interrupt so gut wie immer die bessere Lösung. Damit fährt der Zug 
dann in die gewünschte Richtung.

von Sascha P. (pagemaster77)


Lesenswert?

also wenn ich dies nun richtig studiert habe,
würde ich mein Projekt so angehen:

Ich würde mithilfe des Timers den Taster abfragen.
Wenn der Taster gedrückt wurde
sollte er den Wert einer Variable eins weiter zählen.

Je nachdem welchen Wert dann die Variable hat, kann ich dann durch ein
IF die Variable auswerten und ein dementsprechendes Lauflichtprogramm 
ablaufen lassen.

Der Timer löst so oft den ISR in einer Sek. aus das die Abfrage des 
Tasters in einer Sekunde oft genug abgefragt wird.
Das Entprellen wird dort wichtig weil wahrscheinlich sonst der 
Mikrocontroller die abfrage so oft auswerten wird das er ein Drücken des 
Tasters als Mehrfachdrücken erkennt.

So kann ich dann mit einer Taste unterschiedliche Programme laufen 
lassen.

von Karl H. (kbuchegg)


Lesenswert?

Sascha Peters schrieb:
> also wenn ich dies nun richtig studiert habe,
> würde ich mein Projekt so angehen:
>
> Ich würde mithilfe des Timers den Taster abfragen.
> Wenn der Taster gedrückt wurde
> sollte er den Wert einer Variable eins weiter zählen.
>
> Je nachdem welchen Wert dann die Variable hat, kann ich dann durch ein
> IF die Variable auswerten und ein dementsprechendes Lauflichtprogramm
> ablaufen lassen.

Wobei ein Lauflicht ja auch wiederrum nichts anderes ist, als eine 
zeitlich geordnete Abfolge von Ausgaben.
zeitlich geordnet - und schon wieder ist da ein Timer im Spiel. Das kann 
sogar derselbe Timer sein.


> Das Entprellen wird dort wichtig weil wahrscheinlich sonst der
> Mikrocontroller die abfrage so oft auswerten wird das er ein Drücken des
> Tasters als Mehrfachdrücken erkennt.

Nö.
Das hat damit nichts zu tun. Die Tasterauswertung stürzt sich ja sowieso 
nur auf die Erkennung des Unterschieds 'Taste nicht gedrückt' / 'Taste 
gedrückt'. Aber hinterhältigerweise kann ein prellender Taster nach dem 
Drücken noch so ein paar Wechsel 'vortäuschen', die es auszusortieren 
gilt.

> So kann ich dann mit einer Taste unterschiedliche Programme laufen
> lassen.

wobei.
Wenn man es vernünftig macht, dann sind deine 'Programme' gar keine 
unterschiedlichen Programme im softwaretechnischen Sinne. Das Programm 
ist immer dasselbe, nur die Daten mit denen ein Programmteil gefüttert 
wird, sind jeweils unterschiedlich. An diese Stelle kommen dann Arrays 
ins Spiel, die die Ausgabemuster enthalten, die von einem immer gleichen 
Programmteil abgearbeitet werden - im Takt des Timers.


Auch für etwas vermeintlich simples wie ein Lauflicht muss man, wenn man 
es universell und vernünftig machen will, schon ein ganze Menge 
Techniken und Kentnisse seiner Programmiersprache haben. Mit dem 
Simpelansatz 'Portausgabe - warten - Portausgbabe - warten - ....' kommt 
man nicht weit, das ist dann schon zu simpel.

von Daniel F. (df311)


Lesenswert?

es wurde ja schon viel gesagt, ein link ist mir aber bisher noch nicht 
untergekommen:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
und
http://www.mikrocontroller.net/articles/AVR-Tutorial

ja, ich weiß - das zweite tutorial (eigentlich das erste) ist in 
assembler. da das aber um einiges mehr informationen enthält würde ich 
empfehlen, die ersten kapitel (bis inkl. stack) zu machen und ganz 
wichtig auch zu verstehen. wenn es fragen dazu gibt einfach stellen 
(evtl. vorher die suchfunktion probieren)...
danach empfehle ich die zwei kapitel über timer.

wenn du das alles geschafft hast, versuch das ganze in C umzusetzen - 
keine angst, das klingt schlimmer als es ist...

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.