Forum: Compiler & IDEs Doppelklick abfragen - Welches ist die beste Strategie ?


von uboot-stocki (Gast)


Lesenswert?

Hi,

ich habe einen Mega16 mit 20 Tasten. Ich möchte - abhängig von der 
Betätigungsart - verschiedene Funktionen ausführen. Als Betätigung 
kommen in Betracht: Kurz oder Lang drücken sowie Doppelklick. Die 
Abfrage macht mir im Moment Kopfzerbrechen. Wer hat eine Idee wie man 
sowas machen könnte? Welche Strategie würdet Ihr nutzen? Timer mit 
Interupt? Polling mit Zähler ?

Wer hat ne Idee ?

Gruß und Danke

Andreas

von Dominik T. (dom) Benutzerseite


Lesenswert?

Peter Dannegger hat in der Code-Sammlung eine sehr gute 
Tastenentprellung mit Abfrage auf kurz und lang geschrieben. Diese lässt 
sicher bestimmt so erweitern wie du es haben möchtest.

Gruß,
Dominik

von uboot-stocki (Gast)


Lesenswert?

Hi,

hole den Thread nochmals hoch ... Vielleicht erbarmt sich ja doch jemand 
:-)

Ich habe mir Peters Routine angesehen und versucht zu vertehen. 
Irgendwie bringt mich das nicht richtig weiter. Zumal ich in C arbeite 
und seine Routine in Assembler ist.
Ich möchte im übrigen auch keinen fertigen Code sondern habe Interesse 
an der Information wie sowas "normalerweise" professionell gemacht wird.

Im Moment denke ich über eine Kombi aus Timerinterrupt (alle 0,1s) und 
Polling in der Routine nach. Bei gedrückter Taste wird dann ein globaler 
Zahlenwert ermittelt. Damit kann mal sehr schnell und einfach die 
Entprellung und das "lang-Drücken" machen. allerdings funzt das nicht 
mehr (ohne riesigen Aufwand) beim Doppelklick ....

Nochmals: Wer hat ne Idee ?

Gruß

Andreas

von Ralf (Gast)


Lesenswert?

Würde es was bringen, bei einem Tastendruck einen Counter o.ä. 
runterzuzählen, und wenn innerhalb der Counterzeit nochmals die gleiche 
Taste gedrückt wird, ein "Doppelklick-Flag" zu setzen?

Ralf

von Karl H. (kbuchegg)


Lesenswert?

Die Erkennung eines Doppelklicks hat immer etwas mit
- der Benutzer klickt und der Rechner misst die Zeit zwischen
den Klicks - zu tun

Ergo ja: Das würde was helfen.

Das Problem beim Doppelklick ist doch nicht die Erkennnug,
die ist trivial. Das Problem ist: Du musst beim ersten
Klick einen einfach Klick detektieren (und auch weitergeben)
und wenn dann in einer gewissen Zeit noch ein zweiter Klick
kommt, dann gilt der als Doppelklick. Dein Anwenderprogramm
hat aber den Einfachklick schon bearbeitet, der jetzt eigentlich
zurückgenommen werden müsste und durch einen Doppelklick
ersetzt wird.

Daher findest du in Windwos fast ausnahmslos die Syswtematik:
Ein einfacher Klick selektiert ein Doppelklick führt aus.
Dadurch gibt es keine Probleme, denn der Einfachklick selektiert
ein Objekt und der darauffolgende 'Upgrade' auf Doppelklick
führt eine Aktion aus.


Aber ansonsten: sei kreativ: Da gibt es kein richtig und kein
falsch. Was immer du als richtig definierst ist richtig.

von Daniel Held (Gast)


Lesenswert?

Den Code von Peter gibt es auch in C - suchen hilft.
Ich selbst habe die Routine auch erweitert um zwischen "kurz" - "lang" - 
und "gedrückt halten" zu unterscheiden.

von Peter D. (peda)


Lesenswert?

uboot-stocki wrote:

> kommen in Betracht: Kurz oder Lang drücken sowie Doppelklick.

Hast Du mal überlegt, was Du da vorhast ?

Wenn Du alle 3 Sachen implementierst, ist das Gerät unbedienbar, 
zumindest für andere.

Doppelklick habe ich auch nur mit Maus gesehen, nie mit Tasten. Der 
Grund dürte das fehlende visuelle Feedback sein. Dafür erkennt die Maus 
kein lange Drücken.


Kurz und lang Drücken dürfte schon komplex genug sein:

Beitrag "Universelle Tastenabfrage"


Peter

von Falk (Gast)


Lesenswert?

@Peter Dannegger

>Wenn Du alle 3 Sachen implementierst, ist das Gerät unbedienbar,
>zumindest für andere.

Hmm, würde ich nicht so pauschal sagen. Wahrscheinilch hat er ein LCD 
oder LEDs, oder oder oder. Blindbedienung ist so oder so nicht 
sonderlich rauchbar.

>Doppelklick habe ich auch nur mit Maus gesehen, nie mit Tasten. Der
>Grund dürte das fehlende visuelle Feedback sein. Dafür erkennt die Maus
>kein lange Drücken.

Doch! Klick mal im Windows Explorer kurz auf eine Datei. Sie wird 
selektiert. Klicke nun mal "lang" drauf. Du kannst sie nun umbenennen. 
Dito mit dem USB-Symbol rechts unten zum Auswerfen von USB-Geräten.

>Kurz und lang Drücken dürfte schon komplex genug sein:

???
Eine einfache Zählerauswertung. Sobald der Taster aktiv ist läuft ein 
Zähler hoch. Ist der Taster plötzlich nicht mehr aktiv (quasi High-Low 
Flanke) wird anhand des Zählerstandes entschieden ob es ein langer oder 
kurzer Tastendruck war. Dito für Doppelclick, hier muss das gleiche mit 
der Pause zwischen zwei steigenden Flanken gemacht werden. Das klingt 
für mich fast nur nach ner Fleissaufgabe + bissel clevere Schreibweise. 
Das Ganze dann per 10ms Timer periodisch aufrufen.

MFG
Falk


von Peter D. (peda)


Lesenswert?

Falk wrote:

>>Kurz und lang Drücken dürfte schon komplex genug sein:
>
> ???

Natürlich nicht die Implementierung, sondern rein aus der Sicht des 
Benutzers.


> Eine einfache Zählerauswertung. Sobald der Taster aktiv ist läuft ein
> Zähler hoch. Ist der Taster plötzlich nicht mehr aktiv (quasi High-Low
> Flanke) wird anhand des Zählerstandes entschieden ob es ein langer oder
> kurzer Tastendruck war.

Hab ich doch gemacht.

Das der Kurzdruck erst bei Loslassen reagiert, ist aber 
gewöhnungsbedürftig, der Nutzer erwartet erstmal die Reaktion beim 
Drücken.

Diese Funktion sollte man daher sparsam einsetzen (nur, wenn unbedingt 
nötig). Deshalb habe ich auch ne Maske definiert, damit nur wenige 
Tasten so erweitert sind.


> Dito für Doppelclick, hier muss das gleiche mit
> der Pause zwischen zwei steigenden Flanken gemacht werden.

Dagegen weigere ich mich.

Schon die Vorstellung, mein Videorekorder hätte Doppelklickfunktionen, 
würde mich rasend machen.
Ein solches Gerät würde wegen völliger Unbedienbarkeit sofort zurück 
gehen.


Peter

von Bernhard (Gast)


Lesenswert?

Ein-Knopf-Bedienung ist die dümmste Idee seit dem Gorilla-Arm-Syndrom.

http://jargon.watson-net.com/jargon.asp?w=gorilla+arm

von Falk (Gast)


Lesenswert?

@Peter Dannegger

>Das der Kurzdruck erst bei Loslassen reagiert, ist aber
>gewöhnungsbedürftig, der Nutzer erwartet erstmal die Reaktion beim
>Drücken.

Würde ich nicht so sehen. Aber Bedienphilosophien von Geräten sind eine 
Wissenschaft für sich.

>> Dito für Doppelclick, hier muss das gleiche mit
>> der Pause zwischen zwei steigenden Flanken gemacht werden.

>Dagegen weigere ich mich.

>Schon die Vorstellung, mein Videorekorder hätte Doppelklickfunktionen,
>würde mich rasend machen.
>Ein solches Gerät würde wegen völliger Unbedienbarkeit sofort zurück
>gehen.

Du benutzt ein solches Gerät jeden Tag. Nennt sich Computer. Genauer 
Maus. Und schau dir nur die armen MAC-User an. Die haben nur EINE Taste!
;-)

MFG
Falk

von Peter D. (peda)


Lesenswert?

Bernhard wrote:
> Ein-Knopf-Bedienung ist die dümmste Idee seit dem Gorilla-Arm-Syndrom.

Ja, das wär am besten:

Wenn ich dann auf dem Rekorder aufnehmen will, drücke ich einfach:

.- ..- ..-. -. .- .... -- .


Bloß nicht an den Benutzer denken, Usability ist ja schließlich ein 
Fremdwort.


Peter

von Bernhard (Gast)


Lesenswert?

>Wenn ich dann auf dem Rekorder aufnehmen will, drücke ich einfach:

>.- ..- ..-. -. .- .... -- .


Einige MP3-Player kommen da schon ganz schön nahe dran.

von Falk (Gast)


Lesenswert?

@Bernhard

>>Wenn ich dann auf dem Rekorder aufnehmen will, drücke ich einfach:

>>.- ..- ..-. -. .- .... -- .

;-)

>Einige MP3-Player kommen da schon ganz schön nahe dran.

Sowas lässt sich im SMS-Zeitalter problemlos verkaufen.
Es ist aber auch ein Dilema. Die Geräte schrumpfen ohne Ende, da ist 
kein Platz für Tasten und Displays. Sprachsteuerung ist bisher nur 
begrenzt tauglich, Telemetrie durch Telepathie hat auch so seine 
Probleme ;-)

MfG
Falk

von Bernhard (Gast)


Lesenswert?

Is aber doch Schmarrn!

Warum werden die Geräte dann immer kleiner gebaut, wenn man sie dann nur 
noch mit Zahnstocher oder Morsecode bedienen kann?

Das gute alte Nokia 5110 hat doch schließlich auch inne Hosen- bzw. 
Handtasche gepasst. Bei einigen neuen Modellen hab ich echte Probleme, 
nur eine Taste zu drücken. Und ich finde nicht dass ich solche derben 
Wurstfinger hab :P

von uboot-stocki (Gast)


Lesenswert?

Hallo,

erstmal vielen Dank für Euere Kommentare. Ich bin nicht der Profi-Coder 
aber ich habe vermutet sowas gibts schon. Offensichtlich ist das aber 
nicht der Fall, da es Usability-Problene gibt.

Daher beschreibe ich jetzt mal was ich vor habe, vielleicht kann jemand 
von euch einen Kommentar abgeben:

Es geht um eine Rolladensteuerung. Ich habe nur eine Taste um den 
Rolladen zu bedienen (sebstverständlich gibt es 2 Tasten - eine für 
"hoch" und die Andere für "runter") aber ich beschränke mich im 
Folgenden auf eine allgemeine Taste (gilt für beide).

Wird die Taste einmal "kurz" gedrückt fährt der Rolladen bis an seine 
Endposition (Der Rolladen fährt los, sobald die Taste gedrückt wird - 
also noch vor dem Loslassen)

Wird die Taste "lang" gedrückt ("gehalten") fährt der Rolladen bis die 
Taste losgelassen wird (Der Rolladen fährt los, sobald die Taste 
gedrückt wird - also noch vor dem Loslassen)

Der viel diskutierte Doppelklick soll alle Rollläden im gesamten Haus in 
die jeweilige Endposition fahren (Der erste Rolladen fährt los, sobald 
die Taste gedrückt wird - also noch vor dem ersten Loslassen, die 
restlichen sobald der Doppelklick erkannt wird)

M.E. nach ist das einen sehr gute Lösung. Wo sind Euere Kommentare ?

Gruß

Andreas

von Falk (Gast)


Lesenswert?

@uboot-stocki

>M.E. nach ist das einen sehr gute Lösung. Wo sind Euere Kommentare ?

Sehe ich auch so.

MfG
Falk

von Stefan K. (_sk_)


Lesenswert?

Ich habe es bei mir genau andersherum gemacht: kurzer Tastendruck bewegt 
kurz, langer Tastendruck fährt bis ans Ende. Allerdings habe ich auch 
Jalousien statt Rolläden, da werden definierte kurze Fahrzeiten 
benötigt, um den Jalousiewinkel einzustellen.

Das Ganze funktioniert genau wie die Fensterheber im Auto.

>Der viel diskutierte Doppelklick soll alle Rollläden im gesamten Haus in
>die jeweilige Endposition fahren (Der erste Rolladen fährt los, sobald
>die Taste gedrückt wird - also noch vor dem ersten Loslassen, die
>restlichen sobald der Doppelklick erkannt wird)

Vielleicht einen SEHR langen Tastendruck einführen, der dann alle 
Rolläden anspricht?

Bei mir läuft die Tastenerkennung komplett im Timer-IR (ähnlich wie bei 
Peters Version). Das Hauptprogramm bekommt folgende Werte zurück:

key_pressed
key_released
key_long_pressed
key_long_released

Damit kannst Du im Hauptprogramm praktisch alle Möglichkeiten.

Gruß, Stefan

von uboot-stocki (Gast)


Lesenswert?

Hi,

Ihr seht den Weg über den Timerinterrupt aber als den besten an? D.h. 
der Timerinterrupt wird ausgelöst und in der Interrupt-Routine wird die 
Taste gepollt?
Alternativ könnte man ja auch einen Interrupt auslösen sobald eine Taste 
gedrückt wird?

Mir ist übrigens aufgefallen, dass bei großen Interrupt-Zeiten (100ms 
pro UP-Aufruf) ein Entprellen nicht mehr nötig ist. Entspricht das 
Eueren Erfahrungen ?

Gruß

Andreas

von Falk (Gast)


Lesenswert?

@uboot-stocki

>Ihr seht den Weg über den Timerinterrupt aber als den besten an? D.h.

Ja.

>der Timerinterrupt wird ausgelöst und in der Interrupt-Routine wird die
>Taste gepollt?

Ja.

>Alternativ könnte man ja auch einen Interrupt auslösen sobald eine Taste
>gedrückt wird?

Nein. Das hatten wir schon. Warum? Siehe unten.

>Mir ist übrigens aufgefallen, dass bei großen Interrupt-Zeiten (100ms
>pro UP-Aufruf) ein Entprellen nicht mehr nötig ist. Entspricht das
>Eueren Erfahrungen ?

Genau DAS ist der Punkt. Durch das Pollen wird automatisch entprellt, 
während dein flankensensitiver Interrupt jeden Preller anzeigt.

MFG
Falk

von Sonic (Gast)


Lesenswert?

>während dein flankensensitiver Interrupt jeden Preller anzeigt.

Nicht wenn du nach dem ersten INT diesen für 20ms sperrst. Dann ersparst 
du dir das 100ms-gepolle.

von Falk (Gast)


Lesenswert?

@Sonic

>>während dein flankensensitiver Interrupt jeden Preller anzeigt.

>Nicht wenn du nach dem ersten INT diesen für 20ms sperrst. Dann ersparst
>du dir das 100ms-gepolle.

Ach ja? Und wie sperre ich ihn für 20 ms ohne den Prozessor in eine 
Delay Schleife zu verbannen? Mit nem Timer! Womit wir wieder bei der 
ursprünglichen Variante mit Timer Polling wären.

Q.E.D.
Falk

von Sonic (Gast)


Lesenswert?

>Womit wir wieder bei der ursprünglichen Variante mit Timer Polling wären.
Nein!
Der Timer muss nur einen Zyklus machen, dann wird er wieder angehalten 
(und kann für andere Zwecke verwendet werden). Um einen Taster ca. 20x 
am Tag abzufragen muss man ihn nicht knapp 52 mio. mal abfragen. da legt 
man den µC besser Schlafen.
Immer die verhältnismäßigkeit der Mittel im Auge behalten! ;-)

von Falk (Gast)


Lesenswert?

@ Sonic

>>Womit wir wieder bei der ursprünglichen Variante mit Timer Polling wären.
>Nein!
>Der Timer muss nur einen Zyklus machen, dann wird er wieder angehalten
>(und kann für andere Zwecke verwendet werden). Um einen Taster ca. 20x

Der Timer kann so und so für andere Zwecke benutzt werden. Wer sagt, 
dass ein Timer ausschliesslich für Tastenentprellung verwendet werden 
kann?

>am Tag abzufragen muss man ihn nicht knapp 52 mio. mal abfragen. da legt
>man den µC besser Schlafen.

Ok, in DIESEM Fall hast du wohl Recht. Aber wenn es um ein Gerät geht, 
welches ONLINE bedient wird mit LCD etc., ist die Timer Poll Methode 
IMHO die bessere Wahl.

>Immer die verhältnismäßigkeit der Mittel im Auge behalten! ;-)

Aber sicher. ;-)

MfG
Falk

von Sonic (Gast)


Lesenswert?

>ist die Timer Poll Methode IMHO die bessere Wahl.
Geschmacksache. Ist jedem je nach Vorliebe selber überlassen.

von Peter D. (peda)


Lesenswert?

Sonic wrote:

> Der Timer muss nur einen Zyklus machen, dann wird er wieder angehalten
> (und kann für andere Zwecke verwendet werden).

Wie soll denn ein Timer noch andere Sachen machen, wenn er nicht 
freilaufend ist ?

Irgendwie blöd, wenn die RTC nur geht beim Tastendrücken.


Die Leute, die Timer anhalten schreien ganz schnell: "zu wenig Timer":

Die anderen mit freilaufendem Timer sagen: "Wieso, ich hab sogar noch 2 
übrig" (bei 3 Timern).


Peter

von Sonic (Gast)


Lesenswert?

>Irgendwie blöd, wenn die RTC nur geht beim Tastendrücken.
Du betreibst die RTC in 1/100s-Auflösung? Brauchst du diese Auflösung?
Naja, man kann's so machen, von eine Uhr war ja auch keine Rede, oder 
hab' ich das überlesen?
"für andere Zwecke", damit meine ich Zählaufgaben, Frequenzmessung oder 
andere Aufgaben die mit dem freilaufenden Timer nicht realisiert werden 
können.

Wenn ich viele Zählvorgänge habe, die zeitgenau sein müssen mache ich 
das auch mit einem freilaufenden Timer und verschiedenen Teilern darin, 
aber nur wenn's unbedingt sein muss (Stoppuhr oder ähnliches.

von Stefan K. (_sk_)


Lesenswert?

Die eigendliche Tastenauswertung würde ich auf jeden Fall als Timer-IR 
machen. Per INT ist die Sache wesentlich komplizierter: Du musst nicht 
nur das Ein-Prellen, sondern auch das Aus-Prellen beachten. Ein Timer 
wird ja in jedem Fall benötigt, um lange Tastendrücke zu erkennen. Bei 
der INT-Methode können zudem Störungen die Tastenerkennung wesentlich 
leichter fehlerhaft auslösen.

Die 20 Tasten des OP werden sehr wahrscheinlich als Matrix ausgewertet 
-> das Aus für die INT-Erkennung (würde ggf. mit einem moderneren ATmega 
funktionieren mit Pin-On-Change-Interrupts).

Den verwendeten ATmega16 legt man wohl eh nur ungern in den Tiefschlaf, 
da er von sich aus nie mehr aufwachen kann (nur möglich durch externes 
Ereignis per INT-Pin). Auch da sind die modernen ATmega besser: die 
haben einen Watchdog-Timer, der den mc wecken kann, auch wenn der Quarz 
abgeschaltet ist.

Mein Vorschlag, wenn ein Powerdown-Mode > Idle benötigt wird:
* einen modernen ATmega verwenden
* Tastenerkennung wie gehabt per Timer
* Aufwecken aus dem Tiefschlaf separat per Pin-On-Change-IR

Gruß, Stefan

von Peter D. (peda)


Lesenswert?

Ich würds so machen:

1* klick: fahren, solange man drückt

2* klick: fahren bis zum Anschlag

3* klick: alle fahren bis zum Anschlag


Ich denke aber, egal wie, es ist immer gewöhnungsbedürftig.

Und da die Tasten ja bestimmt nicht nebeneinander sind, würde ich jedem 
Rolladen einen eigenen ATTiny13 spendieren: 2* Tasten, 2* Motor, 1* open 
drain für alle gleichzeitig.


Peter


von Peter D. (peda)


Lesenswert?

Sonic wrote:
>>Irgendwie blöd, wenn die RTC nur geht beim Tastendrücken.
> Du betreibst die RTC in 1/100s-Auflösung? Brauchst du diese Auflösung?


Die Interruptfrequenz bestimmt das schnellste benötigte Intervall und 
alle anderen werden mit Zählvariablen daraus abgeleitet.
Ist einfacher, als getrennte Timer nehmen.

Und ob der Interrupt nun 1% oder 0,01% CPU-Zeit verbraucht, ist doch 
egal.


Peter

von Stefan K. (_sk_)


Lesenswert?

Dann bleibt der Rolladen zwischen dem 1. und 2. klick stehen. Finde ich 
nicht so schön.
Kurz/lang Drücken gibt es in vielen anderen Geräten, aber einen 
Doppelklick auf (Licht-)Taster habe ich noch nie gesehen. Deswegen wird 
der unbedarfte Benutzer das auch nicht probieren (und stattdessen den 
Taster drücken, bis der Rolladen unten ist).

Gruß, Stefan

von Sonic (Gast)


Lesenswert?

>Die Interruptfrequenz bestimmt das schnellste benötigte Intervall und
>alle anderen werden mit Zählvariablen daraus abgeleitet.
Ist bekannt, wird in der SPS-Programmierung auch so gemacht (mach ich 
übrigens auch).

Nur kann's bei zeitkritischen Aufgaben wie Datenübertragung per USART 
(externes RAM, größere Datenmengen) oder einem Grafikdisplay zu 
unschönen Verzögerungen kommen.
Habe das mal mit einer RTC mit Timer1 und dem Async.-Timer (ext. Quarz) 
an Timer2 verglichen, Datenausgabe über USART, 512kB, 115200 baud, da 
war ein ziemlicher Zeitunterschied bei OCR-INT alle 0.1s. bei 1s ging 
das Ganze schon schneller.
Das Grafikdisplay hat sich auch in Zeitlupe aktualisiert.

Aber wie gesagt: das ist die Freiheit jedes Einzelnen wie er das 
umsetzt, je nach Geschmack.

von Falk (Gast)


Lesenswert?

@ Sonic

>Ist bekannt, wird in der SPS-Programmierung auch so gemacht (mach ich
>übrigens auch).

naja, SPS ist aber auch so ein Murks an sich . . .

>Nur kann's bei zeitkritischen Aufgaben wie Datenübertragung per USART
>(externes RAM, größere Datenmengen) oder einem Grafikdisplay zu
>unschönen Verzögerungen kommen.

Nicht wenn mans richtig macht.

>Habe das mal mit einer RTC mit Timer1 und dem Async.-Timer (ext. Quarz)
>an Timer2 verglichen, Datenausgabe über USART, 512kB, 115200 baud, da
>war ein ziemlicher Zeitunterschied bei OCR-INT alle 0.1s. bei 1s ging
>das Ganze schon schneller.
>Das Grafikdisplay hat sich auch in Zeitlupe aktualisiert.

Du konstruierst gern Katastrophen ;-)

>Aber wie gesagt: das ist die Freiheit jedes Einzelnen wie er das
>umsetzt, je nach Geschmack.

Jain. Es gibt schon ein paar handfest Vorteile der Timermethode.

MFG
Falk

P.S. Was wäre die Welt ohne religiösen Strei? ;-)

von Sonic (Gast)


Lesenswert?

>Du konstruierst gern Katastrophen ;-)

Definitiv ja! Um Schwächen zu finden muss man halt viel probieren und 
spielen. Ich mach' meine Erfahrungen gerne selber, dann merkt sich's 
bessser!
;-)

>Nicht wenn mans richtig macht.
Wie mache ich's denn richtig? Der Programmablauf wird definitiv alle 
1/100s unterbrochen und wartet solange, bis die Uhr und alles Andere was 
in die INT-Routine muss, abgearbeitet ist. Und wenn da noch weitere 
Zähler drin sind dauert's halt einige Taktzyklen. Da beißt keine Maus 
einen Faden ab!

>Es gibt schon ein paar handfest Vorteile der Timermethode.
richtig, kommt aber immer auf den Anwendungsfall an.

von Falk (Gast)


Lesenswert?

@ Sonic

>Definitiv ja! Um Schwächen zu finden muss man halt viel probieren und
>spielen. Ich mach' meine Erfahrungen gerne selber, dann merkt sich's
>bessser!
>;-)

Naja, man sollte aber im wesentlichen aus den Fehlern anderer lernen, 
das ist effektiver und bisweilen schwerzfrei.

>>Nicht wenn mans richtig macht.
>Wie mache ich's denn richtig? Der Programmablauf wird definitiv alle
>1/100s unterbrochen und wartet solange, bis die Uhr und alles Andere was
>in die INT-Routine muss, abgearbeitet ist. Und wenn da noch weitere

Ja und?

>Zähler drin sind dauert's halt einige Taktzyklen. Da beißt keine Maus
>einen Faden ab!

Wahnsinn, diese Erkenntnis! Viele Wege führen nach Rom, there are many 
ways to skin a cat. Man kann SEHR viel in die Main Loop legen und nur 
die Steuervariablen in den Interrupts schalten.
Ist aber alles reichlich akademisch ohne das reale Problem direkt auf 
dem Tisch zu haben.

MFG
Falk

von Sonic (Gast)


Lesenswert?

>Ja und?
Daraus folgere ich, dass du sowas noch nicht realisiert und aufgebaut 
hast.

>Man kann SEHR viel in die Main Loop legen und nur die Steuervariablen in den 
Interrupts schalten.
Guten Morgen, alter Zopf!

>Naja, man sollte aber im wesentlichen aus den Fehlern anderer lernen,
>das ist effektiver und bisweilen schwerzfrei.
Richtig, vor allem beim Heiraten! ;-)
Trotzdem: "curiosity killed the cat", um bei den Anglizismen zu bleiben, 
abgucken, nachbauen, Gedanken machen wie's besser geht.

von Peter D. (peda)


Lesenswert?

Sonic wrote:

> Wie mache ich's denn richtig? Der Programmablauf wird definitiv alle
> 1/100s unterbrochen und wartet solange, bis die Uhr und alles Andere was
> in die INT-Routine muss, abgearbeitet ist. Und wenn da noch weitere
> Zähler drin sind dauert's halt einige Taktzyklen. Da beißt keine Maus
> einen Faden ab!

Nehmen wir mal an, daß ist wirklich ne sehr große Interruptroutine, also 
etwa 1000 Zyklen.
Das sind dann bei 100Hz*1000/10MHz gerade mal 1% CPU-Last.

Eher hört man Flöhe 1km weit husten, als 1% weniger CPU-Leistung zu 
bemerken.


Peter

von Sonic (Gast)


Lesenswert?

>Eher hört man Flöhe 1km weit husten
Dann rechne das doch mal in Zeit um, wenn du 512kB Daten per USART 
ausgibst.

von Sonic (Gast)


Lesenswert?

Da können dich die hustenden Flöhe schon mal 7 Sekunden kosten ;-)

von Peter D. (peda)


Lesenswert?

Sonic wrote:

> Dann rechne das doch mal in Zeit um, wenn du 512kB Daten per USART
> ausgibst.

Häää ???

Du hältst den Timerinterrupt so lange an, bis aus der UART 512kB 
rausgeschlichen sind ?

Wer macht denn solchen Quatsch.

Der Timerinterrupt macht sein Ding und der UART-Interrupt die 
Datenausgabe und gut is. Wozu hat man denn schließlich verschiedene 
Interrupts.


Peter



von uboot-stocki (Gast)


Lesenswert?

Hi,

also ... zur weiteren Klärung:

Ich habe vor EINE Steuerung zu bauen. Die sitzt dann im Sicherungskasten 
neben den Relais für die Rolläden. Für 8 Rolläden benötige ich 16 
Eingänge und 16 Ausgänge. Deshalb habe ich den Mega16 gewählt. Natürlich 
habe ich auch 16 Relais ...

Von jedem Schalter aus sollen die drei vorher beschriebenen Funktionen 
anwählbar sein.

Ich baue diese Steuerung nur für mich und habe nicht vor sie zu 
verkaufen.

Die Interrupt-Geschichte hätte genau den Nachteil, dass ich die 16 
Eingänge über ein externes Oder (16 Dioden) auf den Interrupt-Eingang 
des Megas legen müsste.
Ich versuche das Projekt mit so wenig Bauteilen wie möglich zu 
realisieren, da in dem Sicherungskasten nicht viel Platz ist und ich 
keine Platinen o.ä. Ätzen kann - schon gar kein SMD. Daher wird das wohl 
ein Lochraster-Aufbau werden. Ausser einer Aufbereitung der 
Betriebsspannung, des Megas selbst und 16 Logic-Level Fets sowie jede 
Menge Klemmen brauche ich eigentlich nichts weiter (Evtl. noch ein paar 
Widerstände um die Taster mit einem definierten Strom betreiben zu 
können)

Daher denke ich, dass die Timer-Methode die bessere für mich ist, zumal 
ich sowieso einen "Systemtakt" brauche, da die Laufzeit der Rolläden 
unterschiedlich ist, muss ich unterscheidliche Impulszeiten für die 
Relais ausgeben.

Vielleicht habt Ihr ja noch ein paar Kommentare zu meinen Überlegungen 
...

Gruß und schonmal Danke für Euere Inputs

Andreas

von Sonic (Gast)


Lesenswert?

Schon richtig. Aber irgendwann musst du die Daten ins UDR schreiben. Im 
schlimmsten Fall hast du bei 10MHz Taktfrequenz
524288 Byte * 100µs (INT-Abarbeitung) = 52.43s
Da alle 115.2 Bytes (10 Bit) ein INT (1/100s) ausgeführt wird ergibt 
sich eine theoretische Verzögerung von 0.46s.
Dazu kommt das Datenauslesen aus dem SRAM und diverse andere 
Kleinigkeiten in der main-loop.
So kommst du schnell auf 7s. In meiner Anwendung jedenfalls.

von Walter (Gast)


Lesenswert?

>524288 Byte * 100µs (INT-Abarbeitung) = 52.43s
>Da alle 115.2 Bytes (10 Bit) ein INT (1/100s) ausgeführt wird ergibt
>sich eine theoretische Verzögerung von 0.46s.

keine Ahnung was du da rechnest, wieso für jedes Byte ein Mal 
Timerinterupt?
ich kann mich nur Peter anschließen:

>Der Timerinterrupt macht sein Ding und der UART-Interrupt die
>Datenausgabe und gut is.

von Sonic (Gast)


Lesenswert?

Die Interrupts arbeiten nicht gleichzeitig. Und irgendwann muss ich dem 
USART sagen dass es senden soll (UDR beschreiben), wenn das vom INT 
blockiert wird dauert's eben länger bis gesendet wird.
Nun gut, das gehört nicht hierher, vielleicht mach' mal einen eigenen 
Thread hierzu auf (soll keine Drohung sein ;-))

von Peter D. (peda)


Lesenswert?

@Sonic,

also ich rechne mal:

Quarz = 16MHz
Baudrate: 115200 Baud = 11520 Byte/s
16MHz / 11520 = 1388 Zyklen.

Worst Case:
Timerinterrupt kommt genau dann, wenn der Sendepuffer leer ist.
Ein neues Byte muß reingeschrieben werden, ehe das Schieberegister leer 
ist, d.h. man hat genau eine Bytezeit Reserve.

Also ein Timerinterrupthandler + UART-Interrupt Sendepuffer laden bis zu 
1388 Zyklen Dauer verzögert die UART um genau garnichts (0µs).


Peter

von Walter (Gast)


Lesenswert?

>Nun gut, das gehört nicht hierher

Erklärungsnotstand? ;-)

von Peter D. (peda)


Lesenswert?

uboot-stocki wrote:


> Vielleicht habt Ihr ja noch ein paar Kommentare zu meinen Überlegungen

Ja, ist o.k., Batteriebetrieb brauchst Du ja nicht, also ist das mit dem 
externen Interrupt eh nicht sinnvoll.

Die Tasten würde ich über Optokoppler entkoppeln.


Ob das Bedienkonzept hinhaut, hängt ganz davon ab, welche weiteren 
Personen (Geschlecht, Alter) die Rollläden noch bedienen wollen :-)


Peter

von Falk (Gast)


Lesenswert?

@ Sonic

>>Ja und?
>Daraus folgere ich, dass du sowas noch nicht realisiert und aufgebaut
>hast.

????
Ist das wieder die Sonic-Logik?
Das "Ja und" heisst so viel wie "Schön und gut, aber was willst du damit 
sagen?".

MFG
Falk

von Falk (Gast)


Lesenswert?

@ uboot-stocki

>Ich habe vor EINE Steuerung zu bauen. Die sitzt dann im Sicherungskasten
>neben den Relais für die Rolläden. Für 8 Rolläden benötige ich 16
>Eingänge und 16 Ausgänge. Deshalb habe ich den Mega16 gewählt. Natürlich
>habe ich auch 16 Relais ...

Ach so, du brauchst den MEGA8 wegen der grossen Anzahl IO Pins. OK.

>Die Interrupt-Geschichte hätte genau den Nachteil, dass ich die 16
>Eingänge über ein externes Oder (16 Dioden) auf den Interrupt-Eingang
>des Megas legen müsste.

Vergiss das. Polling und gut.

>Ich versuche das Projekt mit so wenig Bauteilen wie möglich zu
>realisieren, da in dem Sicherungskasten nicht viel Platz ist und ich
>>Betriebsspannung, des Megas selbst und 16 Logic-Level Fets sowie jede

Für 16 Relais solltest du 2x ULN2803 nehmen, die sind wesenlich kleiner 
und kompakter zu handhaben (Chip auf Lochraster stecken, verlöten, 
fertig.)

MFG
Falk

von Karl H. (kbuchegg)


Lesenswert?

Was mich noch etwas stört:
Hast du für die Rolläden keine Endschalter?
Mit der Methode: Motor A muss 10 Sekunden laufen um
die Endstellung zu erreichen hätte ich keine grosse
Freude.

von Sonic (Gast)


Lesenswert?

@ Falk und Peter D.:
ihr scheint es nicht so mit dem Arbeiten zu haben, schließlich seit ihr 
fast rund um die Uhr hier im Forum vertreten. Also frage ich mich wo ihr 
irgendwelche Erfahrung hernehmen wollt?
Da man hier NICHTS schreiben kann, ohne von derlei selbsternannten 
Experten auf eine sehr unschöne Art gemaßregelt zu werden, werde ich 
mich zukünftig auf lesenden Zugriff beschränken. Das dürfte euch doch 
auch recht sein, oder? Ihr merkt gar nicht mehr wie verbohrt ihr 
versucht, Anderen eure Weisheiten aufzudrücken, ohne irgendwelche 
anderen Lösungen auch nur ansatzweise in Betracht zu ziehen!

von Falk (Gast)


Lesenswert?

@ Sonic

>ihr scheint es nicht so mit dem Arbeiten zu haben, schließlich seit ihr
>fast rund um die Uhr hier im Forum vertreten. Also frage ich mich wo ihr

Mach dir mal keine Sorgen um unser Arbeitszeitmodell.

>Da man hier NICHTS schreiben kann, ohne von derlei selbsternannten
>Experten auf eine sehr unschöne Art gemaßregelt zu werden, werde ich

Massregeln? Kann es ein, dass du nicht sonderlich gut mit Kritik umgehen 
kanns?

>mich zukünftig auf lesenden Zugriff beschränken. Das dürfte euch doch
>auch recht sein, oder? Ihr merkt gar nicht mehr wie verbohrt ihr
>versucht, Anderen eure Weisheiten aufzudrücken, ohne irgendwelche
>anderen Lösungen auch nur ansatzweise in Betracht zu ziehen!

Das haben wir/ich. Aber wir haben auch Argumente dagegen. Ist natürlich 
auch ein Lösung, die beleidigte Leberwurst spielen wenn einem die 
sachlichen Argumente ausgehen.

MfG
Falk, gegenüber konstruktiver Kritik immer offen


von uboot-stocki (Gast)


Lesenswert?

Hi,



@Falk: Das mit den 2x ULN2803 habe ich noch garnicht bedacht. Ist 
sicherlich die einfachste Lösung - vielen Dank für den Tipp !!

@Karl-Heinz: In den Rolläden sind selbstverständlich auch Endschalter 
verbaut.
Mir schwebt (für eine spätere Ausbaustufe) vor, die Rolläden auch auf 
Position "halb" oder "dreiviertel" zu fahren. Ich denke da eine 
Sonnenstandsabhängige Steuerung ... sowas geht sicher nur über die 
Laufzeit der Rollläden. Als Vision habe ich da einen Lernmodus ...
Jetzt beschäftige ich mich erstmal mit den Basics - habe immernoch 
Probleme mit meinem Doppelklick ...

Gruß

Andreas

von Stefan K. (_sk_)


Lesenswert?

Wenn Du zuwenig Pins für die ULN2803 hast: von TI gibt es ähnliche mit 
SPI-Eingang. Kannst Du hintereinander hängen und brauchst dann nur 4 
Pins.

TPIC6B595

Gibt es z.B. bei Segot.

Gruß, Stefan

von Walter (Gast)


Lesenswert?

Wegen Endschalter:

ich verwende bei einem Schiebeladen einfach den Motorstrom:
der Laden fährt gegen eine mechanischen Anschlag, bei einem plötzlichen 
Stromanstieg schalte ich aus.
Das ist auch ganz gut wenn jemand den Kopf reinsteckt ...

von Peter D. (peda)


Lesenswert?

Sonic wrote:

> Da man hier NICHTS schreiben kann, ohne von derlei selbsternannten
> Experten auf eine sehr unschöne Art gemaßregelt zu werden,

Huch, da ist aber einer angefressen. Ich komme gleich mal vorbei, 
Köpfchen tätscheln.

Die Sache ist doch die, daß Du behauptet hast, Timerinterrupts würden 
merkbar Ressourcen fressen, aber nicht den geringsten Beweis 
(Beispielcode) dafür lieferst.

Und ich hab daraufhin nur mal ausgerechnet, daß es im Promillebereich, 
also unmerkbar ist.

Ich hab eigentlich kein Programm ohne schnellen Timerinterrupt. Wenn mir 
da auch nur 10% CPU Zeit verloren gingen, hätte es längs auffallen 
müssen. In der Regel sind die Programme aber sogar schneller, als 
funktionsgleiche andere Lösungen.


> Anderen eure Weisheiten aufzudrücken, ohne irgendwelche
> anderen Lösungen auch nur ansatzweise in Betracht zu ziehen!

Nö, ich lerne gerne dazu.
Bloß dann müßtest Du erstmal ne bessere Lösung zeigen.
Ich kann nichts einschätzen und daran lernen, wenn Du nichts zeigst.
Ich kann ja nicht hellsehen, womit Deine Timerinterrupts solche Unmengen 
von Zeit verbrauchen. Ich versuche jedenfalls, alle Interrupthandler 
möglichst kurz zu halten.


Peter


Beitrag #5091953 wurde von einem Moderator gelöscht.
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.