Forum: Mikrocontroller und Digitale Elektronik "keine Änderung" des ADC soll zu Ereignis führen


von Ja (Gast)


Lesenswert?

Hallo Freunde, ich stehe vor einem Problem:
Ich habe einen Beschleunigungssensor, den ich mit meinem Atmega8 via ADC 
verbunden habe. Anscheinend sind diese Beschleunigungssensoren nur 
bedingt Beschleunigungssensoren, da sie die Beschleunigung nur relativ 
zur Erdgravitation messen und keine eigentliche Beschleunigung an sich.
Wie auch immer, mein Problem:
Ich möchte, dass wenn es keine Änderung am ADC gibt (Toleranz =< 20, 
wegen Noise), der Wert also bspw. 500 - 520 für eine Minute (interne Uhr 
via Interrupts) beträgt, dass an PortB ein Output Pin aktiviert wird.
Wie vergleiche ich jetzt die Werte (in C) und halte sie fest?
Bitte um ernstgemeinte Hilfe
Danke!

von Kermit (Gast)


Lesenswert?

Speichere alten ADC wert, lese neuen ADC Wert =>
Falls gleich (oder +/- 20) => Aktion 1
Falls ungleich (oder +/- 20) => Aktion 2

von Max D. (max_d)


Lesenswert?

Das letzte mal als ich nachgesehen hab war jede Beschleunigung relativ.
Ungeachtet dessen: Du liest den ADC so oft wie sinnvoll (hängt stark von 
der Zielsetzung ab) ein und solange der gelesene Wert im Rahmen zählt 
ein Zähler hoch. Wenn der bei einer Minute angekommen ist, dann setzt du 
den Ausgang.
Wenn der Rahmen verlassen wird, dann setzt du den Zähler zurück und 
schiebst den Rahmen hinterher.

von Ja (Gast)


Lesenswert?

Ich kann doch theoretisch auch den Referenz-ADC Wert, der keine Änderung 
aufzeigen soll, bei sekunde == 0 immer wieder neu setten oder?

von Max D. (max_d)


Lesenswert?

Ja schrieb:
> Ich kann doch theoretisch auch den Referenz-ADC Wert, der keine
> Änderung
> aufzeigen soll, bei sekunde == 0 immer wieder neu setten oder?

Damit ist aber z.B. Nicht abgedeckt wenn von 0:01 bis 1:59 der gleiche 
Wert anliegt (und das obwohl fast 2 Minuten das gleiche anliegt).

von U. M. (oeletronika)


Lesenswert?

Hallo,
> Ja schrieb:
> Hallo Freunde, ich stehe vor einem Problem:
> Ich möchte, dass wenn es keine Änderung am ADC gibt (Toleranz =< 20,
> wegen Noise), der Wert also bspw. 500 - 520 für eine Minute (interne Uhr
> via Interrupts) beträgt, dass an PortB ein Output Pin aktiviert wird.
> Wie vergleiche ich jetzt die Werte (in C) und halte sie fest?
ich schlage eine andere Signalverarbeitung vor.
Als erstes führe die rohmesswerte in ein dig. Tiefpassfunktion in der 
Art:
MW_tp = (MW_vorgänger x (TPF-1)+ MW_akt)/TPF  mit TPF = {1....n)

Je höher du die Zahl für TPF wählst, desto weniger rauscht das 
geglättete Signal noch. TPF stellt man dann so ein, dass die 
Ansprechgeschwindigkeit den Anforderungen der Anwendung noch genügt.

Wenn du jetzt Signalverändernungen detektieren willst, so kann man dies 
auch mit solchen Tiefpassfunktionen machen.

Führe 2 solcher Tiefpassfunktionen, eine mit einem hohen TPF und eine 
zweite mit einem eher geringen TPF-Wert.
Die Differenz von beiden zeigt temporäre Änderungen.
Die erst Funktion mit sehr hohem TPF-Wert kompensiert Drift des Sensors.
Gruß Öletronika

von Ja (Gast)


Lesenswert?

Max D. schrieb:
> Damit ist aber z.B. Nicht abgedeckt wenn von 0:01 bis 1:59 der gleiche
> Wert anliegt (und das obwohl fast 2 Minuten das gleiche anliegt).

Wäre es dann vielleicht besser das bei jeden Wert, der nicht zwischen/in 
der Toleranz liegt als neuen Wert zu setten?

U. M. schrieb:
> MW_tp = (MW_vorgänger x (TPF-1)+ MW_akt)/TPF  mit TPF = {1....n)

Habe mich in meinem Leben niemals damit beschäftigt, das ist dann doch 
ein wenig zu hoch für mich (leider)..

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ja schrieb:
> Habe mich in meinem Leben niemals damit beschäftigt, das ist dann doch
> ein wenig zu hoch für mich (leider)..

Falls du es nicht erkannt hast, das ist die normale Mittelwertbildung 
mit N Elementen. Ein simples Beispiel für 2 Elemente wäre:
1
G_wert = (G_Sensor + G_wert) >> 1;
Da wirst du mit keinem analog/digital Wandler drum herum kommen, denn 
keiner ist so perfekt, das er nicht um wenigstens ein Bit springt.

von Ja (Gast)


Lesenswert?

Okay eine Frage noch: wie löse ich diesen Konflikt code-technisch:
Wenn sich Sekunde verändert (also bei jeder Änderung der Sekunde z.B von 
1 auf 2. oder von 59 auf 0) dann soll ein neuer Adc Wert ausgelesen 
werden und gespeichert werden?

von eProfi (Gast)


Lesenswert?

> MW_tp = (MW_vorgänger x (TPF-1)+ MW_akt)/TPF  mit TPF = {1....n)

Diese Formel hat den Nachteil, dass das Ergebnis nie den Eingangswert 
erreicht. Daher verwende ich:
ADCsum += ADC - ADCsum / n
mit n = 1, 2, 4, 8, 16, 32 oder 64, damit es als shr ausgeführt werden 
kann. Oder man schreibt es gleich so hin:
ADCsum += ADC - (ADCsum >> m);    //m 1..6 ,  Klammer notwendig!

ADCsum steigt auf das n-fache von ADC an, was ein Vorteil für die 
Weiterverarbeitung (downscaling) sein kann.
bei einem 10bit-ADC reicht für ADCsum ein U16 für n bis 64.

Wenn man den Filter schnell setzen will, reicht ein
ADCsum = ADC << m;


> Wenn sich Sekunde verändert
if (sec != secOld){
  secOld = sec;
  storeData();
  }

Matthias, si tacuisses...
> Falls du es nicht erkannt hast, das ist die normale
> Mittelwertbildung mit N Elementen.
Es ist ein PT1-Glied. Der letzte Wert hat das stärkste Gewicht.

von Bernd K. (prof7bit)


Lesenswert?

Max D. schrieb:
> Das letzte mal als ich nachgesehen hab war jede Beschleunigung relativ.

Wo hast Du das gelesen, das ergibt keinen Sinn.

Und die Beschleunigungssensoren die man so üblicherweise verwendet 
messen die absolute Beschleunigung. Und was der Threaderöffner mit 
Formulierungen wie "Beschleunigung nur relativ zur Erdgravitation" oder 
mit "nur bedingt Beschleunigungssensoren" oder "keine eigentliche 
Beschleunigung an sich" zum Ausdruck bringen wollte ist weitgehend 
rätselhaft.

von Ja (Gast)


Lesenswert?

Wenn du das Ding an der x-Achse umdrehst, wird, wenn der Vorgang des 
umdrehens abgeschlossen ist, immer noch Beschleunigung (-xg) gemessen 
obwohl der Sensor selbst nicht mehr bewegt (=beschleunigte) wird.

von Bernd K. (prof7bit)


Lesenswert?

Ja schrieb:
> Wenn du das Ding an der x-Achse umdrehst, wird, wenn der Vorgang des
> umdrehens abgeschlossen ist, immer noch Beschleunigung (-xg) gemessen
> obwohl der Sensor selbst nicht mehr bewegt (=beschleunigte) wird.

Ja, das ist auch normal, er erfährt ja immer noch die Erdbeschleunigung.

von Ja (Gast)


Lesenswert?

Okay danke Leute, ich hab mir jetzt folgendes System überlegt:
Der Adc Wert wird bei jeder Sekundenänderung abgefragt. Also wenn 
Sekunde sich ändert, lese ADC aus und Speicher den Wert als Variable.
Wenn jetzt eine neue Sekunde anbricht, soll der ADC Wert ausgelesen 
werden und mit der Variable (vorheriger Wert) verglichen werden. Wenn 
neuer ADC mehr als +-20 abweicht, wird dieser als neuer ADC Wert 
gespeichert, sodass sich die Referenz sekündlich andert, wenn es so sein 
muss. Wenn der neue Wert nun im Rahmen liegt, so wird ein Zähler 
hochgezählt. Wenn dieser 60 erreicht hat, so setze Output 1.
hab ich da einen logischen Fehler drin?

von NSA (Gast)


Lesenswert?

Und was passiert wenn der Zähler auf 30 zählt, sich der wert nun die 
nächsten 5 Minuten kontinuierlich ändert (Zähler zählt nicht) und 
anschließend wieder im Rahmen bleibt, bis der Zähler 60 erreicht hat?

von Ja (Gast)


Lesenswert?

Wenn der Zähler schon hochgezählt hat oder auch nicht: wenn neuer ADC 
als Referenz (weil nicht im Rahmen), dann Zähler = 0.

von Udo S. (urschmitt)


Lesenswert?

Ja schrieb:
> Wenn du das Ding an der x-Achse umdrehst, wird, wenn der Vorgang des
> umdrehens abgeschlossen ist, immer noch Beschleunigung (-xg) gemessen
> obwohl der Sensor selbst nicht mehr bewegt (=beschleunigte) wird.

Massenanziehung (Gravitation) und Beschleunigung einer Masse sind 
ununterscheidbar.

von Karl H. (kbuchegg)


Lesenswert?

Udo Schmitt schrieb:
> Ja schrieb:
>> Wenn du das Ding an der x-Achse umdrehst, wird, wenn der Vorgang des
>> umdrehens abgeschlossen ist, immer noch Beschleunigung (-xg) gemessen
>> obwohl der Sensor selbst nicht mehr bewegt (=beschleunigte) wird.
>
> Massenanziehung (Gravitation) und Beschleunigung einer Masse sind
> ununterscheidbar.

Zumindest solange, solange man nicht aus dem Fenster sehen kann. Etwas 
was Sensoren eher selten können.

von knallbär (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Ja schrieb:
>> Wenn du das Ding an der x-Achse umdrehst, wird, wenn der Vorgang des
>> umdrehens abgeschlossen ist, immer noch Beschleunigung (-xg) gemessen
>> obwohl der Sensor selbst nicht mehr bewegt (=beschleunigte) wird.
>
> Massenanziehung (Gravitation) und Beschleunigung einer Masse sind
> ununterscheidbar.

Jedenfalls in der newtonschen Mechanik. Relativistisch schon.

Auch wenn das OT ist:
- Beschleunigung ist definiert durch a = dv/dt
- Erdbeschleunigung ist nur im freien Fall eine Beschleunigung (dv/dt != 
0)
- Erdbeschleunigung beschleunigt eine Masse im freien Fall mit 9,81 
m/(s^2) innerhalb der newtonschen Mechanik. Im allgemeinen 
relativistischen Fall nicht (daher ist es allenfalls eine Hilfsgröße mit 
der sich bequem Gewichtskraft einer Masse innerhalb der newtonschen 
Mechanik berechnen lässt).

von Udo S. (urschmitt)


Lesenswert?

knallbär schrieb:
> Jedenfalls in der newtonschen Mechanik. Relativistisch schon.

Wie bitte?

von knallbär (Gast)


Lesenswert?

knallbär schrieb:
>> Massenanziehung (Gravitation) und Beschleunigung einer Masse sind
>> ununterscheidbar.

Die Aussage ist natürlich korrekt.
Meine Aussage bezog sich hauptsächlich auf:

Bernd K. schrieb:
> Ja, das ist auch normal, er erfährt ja immer noch die Erdbeschleunigung.

von Udo S. (urschmitt)


Lesenswert?

Ok, ich dachte schon jetzt soll ich anfangen über schwaches und starkes 
Äquivalenzprinzip zu argumentieren.
Ist nämlich zu lange her, da bin ich nicht mehr sattelfest :-)

von Ja (Gast)


Lesenswert?

Okay......

von Ja (Gast)


Lesenswert?

Meine Frage: wie bekomme ich Tolreanz in den Code? Also der ADC Wert 
darf +- vom alten Referenzwert abweichen?

von Cyblord -. (cyblord)


Lesenswert?

Ja schrieb:
> Meine Frage: wie bekomme ich Tolreanz in den Code? Also der ADC Wert
> darf +- vom alten Referenzwert abweichen?

Ist das dein Ernst? Weißt du was Subtraktion ist? Danach kannst du deine 
Abweichung ja mit der von dir gewünschten Toleranz vergleichen.

von Karl H. (kbuchegg)


Lesenswert?

Voneinander abziehen und wenn das Ergebnis im Bereich -Toleranz bis 
+Toleranz liegt, dann waren auch die Werte nicht weiter voneinander 
entfernt.

(Die Verwendung der abs Funktion kann hier zb ganz hilfreich sein: Wenn 
der Absolutwert der Differenz kleiner als .... )

von Karl H. (kbuchegg)


Lesenswert?

Man könnte auch sagen:

Wenn der neue Wert größer als der (Referenzwert minus der Toleranz) ist 
UND der neue Wert kleiner als der (Referenzwert plus der Toleranz) dann 
....


Wie machst du das denn händisch?

Bei einer Toleranz von 5, liegt 18 innerhalb oder ausserhalb der 
Toleranzgrenze, wenn der Referenzwert 20 ist? Wie hast du das 
festgestellt? Was hast du gemacht um zu deiner Aussage zu kommen? Und 
nein: ich hab scharf hingesehen gilt nicht! Du musst schon eine Regel 
angeben, die jeder ABC-Schütze, der gerade mal ein bischen rechnen kann 
anwenden kann.
Wenn du so etwas angeben kannst, dann kannst du es auch programmieren. 
Wenn du es nicht angeben kannst, dann musst du dich eben selbst 
beobachten, wie du so ein Problem löst und davon dann die Regel 
ableiten.

Manchmal (eigentlich ziemlich oft) hilft auch aufmalen.

Hier ist eine Zahlengerade mit den relevanten Markierungen
1
     13  14  15  16  17  18  19  20  21  22  23  24  25  26  27 
2
   ---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
3
4
      ^       |           ^       ^                   |
5
      |       |           |       Referenzwert        |
6
      |       |           |                           |
7
      |       |           zu untersuchender Wert      |
8
      |       |                                       |
9
      |       |///////////////////////////////////////|
10
      |       |<-------- 5 ------>|<------- 5 ------->|
11
      |                   Toleranzbereich
12
      |
13
     zu untersuchender Wert

warum ist 18 im Toleranzbereich und 13 nicht? Welche Beziehungen gelten?

von Ja (Gast)


Lesenswert?

Kann ich Betragsstriche setzen? Wenn ja wie? Ich meine, wenn der Wert 
vorher kleiner war als der 2., dann kommt da was negatives raus, und das 
kann dann außerhalb der Toleranz liegen und trotzdem akzeptiert werden 
von Code (600-670 =-70; -70<60, also würde Zaehler ++1 gehen, obwohl der 
Messwert eigentlich nicht in der Toleranz liegt..

von Karl H. (kbuchegg)


Lesenswert?

Ja schrieb:
> Kann ich Betragsstriche setzen?

Nein.

> Wenn ja wie?

Indem du in deinem C-Buch den Vorrat an mathematischen Funktionen 
nachliest. Wie willst du denn programmieren, wenn du mehr als 80% deiner 
Programmiersprache und der Funktionen, die du zur Verfügung hast gar 
nicht kennst!
Die Funktion heisst abs()

http://www.tutorialspoint.com/c_standard_library/c_function_abs.htm

von Konrad S. (maybee)


Lesenswert?

Udo Schmitt schrieb:
> Massenanziehung (Gravitation) und Beschleunigung einer Masse sind
> ununterscheidbar.

Ja, oft gehört und gelesen. Aber:

Betrachte die Vektoren zweier (geeignet) "nebeneinander" liegender 
Punkte. Bei der "Beschleunigung einer Masse" liegen die Vektoren 
parallel zueinander. Bei Gravitation zeigen sie auf einen gemeinsamen 
Punkt (Gravitationszentrum). Bei Zentrifugalkraft zeigen sie von einer 
gemeinsamen Geraden (Drehachse) weg.

von Cyblord -. (cyblord)


Lesenswert?

Konrad S. schrieb:
> Bei Zentrifugalkraft zeigen sie von einer

Die Kraft gibt es nicht, das weißt du hoffentlich. Es ist mehr ein 
beobachtbarer Effekt. Keine Kraft. Ähnlich wie die Coreolis-"Kraft".

von Konrad S. (maybee)


Lesenswert?

Yep, wollte aber nicht da auch noch Anführungszeichen setzen.

von Cyblord -. (cyblord)


Lesenswert?

Konrad S. schrieb:
> Yep, wollte aber nicht da auch noch Anführungszeichen setzen.

Na gut ;-)

von Karl H. (kbuchegg)


Lesenswert?

Konrad S. schrieb:
> Udo Schmitt schrieb:
>> Massenanziehung (Gravitation) und Beschleunigung einer Masse sind
>> ununterscheidbar.
>
> Ja, oft gehört und gelesen. Aber:
>
> Betrachte die Vektoren zweier (geeignet) "nebeneinander" liegender
> Punkte. Bei der "Beschleunigung einer Masse" liegen die Vektoren
> parallel zueinander. Bei Gravitation zeigen sie auf einen gemeinsamen
> Punkt (Gravitationszentrum). Bei Zentrifugalkraft zeigen sie von einer
> gemeinsamen Geraden (Drehachse) weg.

Der springende Punkt ist aber, dass ein Beschleunigungssensor immer nur 
die Summe der Beschleunigungen misst und es keinen Weg gibt, alleine nur 
mit dieser Information diese Summe in die einzelnen Komponenten 
aufzudröseln.

von Konrad S. (maybee)


Lesenswert?

Karl Heinz schrieb:
> Der springende Punkt ist aber, dass ein Beschleunigungssensor immer nur

... an einem Punkt misst und die Auflösung, erst recht die Genauigkeit, 
bei Weitem nicht ausreichen, um einen praxistauglichen Sensor mit 
vernünftigen Abmessungen zu bauen. Mir ging es nur um die oft behauptete 
Ununterscheidbarkeit von Gravitation vs. Beschleunigung und diese 
Ununterscheidbarkeit gilt eben nur, wenn man nur einen Punkt 
betrachtet.

von Karl H. (kbuchegg)


Lesenswert?

Konrad S. schrieb:

> Ununterscheidbarkeit von Gravitation vs. Beschleunigung und diese
> Ununterscheidbarkeit gilt eben nur, wenn man nur einen Punkt
> betrachtet.

... oder man es mit linearen Beschleunigungen zu tun hat.
In rotatorischen Bewegungen gelten wieder andere Regeln. Zumindest wenn 
man etwas über die Geometrie der Bewegung weiss.

von Konrad S. (maybee)


Lesenswert?

Karl Heinz schrieb:
> Konrad S. schrieb:
>
>> Ununterscheidbarkeit von Gravitation vs. Beschleunigung und diese
>> Ununterscheidbarkeit gilt eben nur, wenn man nur einen Punkt
>> betrachtet.
>
> ... oder man es mit linearen Beschleunigungen zu tun hat.

Die lineare Beschleunigung ist eben doch von der Gravitation 
unterscheidbar. (Oder habe ich dich jetzt missverstanden?)

von Karl H. (kbuchegg)


Lesenswert?

Lass gut sein. Ich will jetzt nicht schon in wieder in diese Diskussion 
rein.
Du kannst das eben. Alle anderen können es nicht.

von Konrad S. (maybee)


Lesenswert?

Denk in 'ner ruhigen Stunde noch mal über den Winkel der 
Beschleunigungsvektoren zueinander nach. Sooo schwierig ist das nicht. 
;-)

von Karl H. (kbuchegg)


Lesenswert?

Konrad S. schrieb:
> Denk in 'ner ruhigen Stunde noch mal über den Winkel der
> Beschleunigungsvektoren zueinander nach. Sooo schwierig ist das nicht.
> ;-)

Ich denke eher schon, dass es ziemlich schwierig ist, in einem 
Kräfteparallelogramm nur mit der Kentniss der Resultierenden und einer 
Seitenlänge und ohne einen Winkel zu kennen, das Parallelogramm im 
allgemeinen Fall eindeutig zu rekonstruieren. Immerhin ist das der 
Versuch, ein Dreieck mit nur 2 Bestimmungsstücken zu konstruieren.

PS: wir reden hier von einer beliebigen Orientierung des Sensors in 
Bezug auf die Gravitationsrichtung. Hab ich diese Orientierung, dann ist 
die Sache leicht. Hab ich sie nicht, dann kann ich sie nur mit den Daten 
des Beschleunigungssensors nicht nicht ermitteln.

von Willi M. (lt1014)


Lesenswert?

Hallo,
ich hab sowas ähnliches mal mit Hilfe der einfachen linearen Regression 
gelöst:
- Werte in array einlesen
- Regressionsgerade berechnen
- die Steigung dieser Geraden mit Schwelle vergleichen
Gruß
Willi

von Konrad S. (maybee)


Angehängte Dateien:

Lesenswert?

Kleine Skizze zur Veranschaulichung.
Ich spreche davon, dass man die Beschleunigung an zwei geeignet 
gewählten Punkten misst. In der Skizze hält das Männeken also in jeder 
Hand einen "Beschleunigungssensor". Und durch Betrachtung der Lage der 
Vektoren zueinander lassen sich die drei Fälle - Gravitation, lineare 
Bescchleunigung, "Zentrifugalkraft" - voneinander unterscheiden. Bis 
eben auf die kleine Einschränkung, dass real existierende Sensoren dafür 
nicht ausreichen dürften (OK, das mit der Zentrifuge würde noch 
klappen).

von Ja (Gast)


Lesenswert?

Letzte Frage: ich habe Sekunden als Variablen im Timer. Wie schaff ich 
folgendes umzusetzen im c-Code:
Wenn Sekunde sich ändert, read ADC.
Also der Term "wenn Sekunde sich ändert"
Danke

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Lies gefälligst ein gutes Buch über C und verstehe dessen Inhalt. Lies 
ggf. noch Bücher über Algorithmen und Softwareentwicklung.

von Ja (Gast)


Lesenswert?

Ich frage so nach einem Term was los

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Solch einen Ausdruck selbst zu formulieren ist eine Kleinigkeit, sobald 
Du die Grundlagen der Programmiersprache verstanden hast. Du besitzt 
jedoch keinerlei Grundlagen. Das musst Du nachholen.

von Karl H. (kbuchegg)


Lesenswert?

Ja schrieb:
> Letzte Frage: ich habe Sekunden als Variablen im Timer. Wie schaff ich
> folgendes umzusetzen im c-Code:
> Wenn Sekunde sich ändert, read ADC.
> Also der Term "wenn Sekunde sich ändert"


Wie würdest DU das denn machen, wenn DU vor der Aufgabe stehst (und ein 
schlechtes Gedächtnis hast aber sauschnell bist)?

Also ich würde:
* mir Papier und Bleistift nehmen um mir was notieren zu können 
(Hinweis: sowas ist immer ein Hinweis darauf, dass man eine Variable 
braucht)

* dann würde ich zuerst mal auf meine Uhr sehen und mir die aktuelle 
Sekunde notieren. Die ist zb jetzt gerade 23

* in meiner laufenden Aktion würde ich immer wieder auf die Uhr sehen, 
die Sekunden ablesen und mit dem vergleichen, was auf dem Papier steht. 
Da ich sauschnell bin, lese ich von der Uhr zb ab: 23
Auf meinem Papier steht auch 23, also hat sich die Sekunde nicht 
verändert. Es ist immer noch dieselbe Sekunde.

* ich mach ein bischen was anderes und schau dann wieder auf die Uhr. 
Ich lese ab: 24
Ein Blick auf mein Papier zeigt mir, dass die 23, die dort stehen nicht 
identisch sind zu den 24 die ich jetzt gerade abgelesen habe. Bingo! Die 
Sekunden haben sich offenbar verändert!
Also mach ich mein Ding, das ich jede Sekunde machen möchte und notiere 
mir auf dem Papier: 24

* nach kurzer Zeit schau ich wieder auf die Uhr und lese ab: 24
Ein Blick auf das Papier zeigt mir: 24. Die aktuelle Sekunde stimmt mit 
der notierten überein. D.h. seitdem ich das letzte mal die 
Sekundenaktion gemacht habe, ist nocht keine Sekunde vergangen.


und so geht das immer weiter dahin. Uhr ablesen und mit dem vergleichen, 
was auf dem Papier steht. Stimmen die beiden Zahlen überein, dann hat 
sich offenbar die Sekunde nicht verändert. Stimmen sie nicht überein, 
dann hat eine neue Sekunde begonnen, ich mach mein Dinge und notiere mir 
diese neue Sekundenzahl, damit ich bei der nächsten Ablesung wieder 
weiss, wann ich das letzte mal mein Ding gemacht habe.


Eigentlich ganz simpel. Selbst Kleinkinder können diese Strategie 
intuitiv anwenden.


Eine Veränderung festzustellen bedeutet IMMER, dass man sich irgendwo 
einen früheren Zustand merken muss. Ob sich das Bild einer Stadt im 
Laufe der Zeit verändert, kannst du nur feststellen, wenn du das heutige 
Bild mit einem Photo von früher vergleichst. Hier ist das Photo von 
früher genau das, was bei mir Papier und Bleistift war. Aber egal wie: 
um das Festhalten des aktuellen Zustands, damit man in der Zukunft mal 
mit diesem Zustand vergleichen kann, kommt man nicht rum. Das folgt 
schon daraus, dass man als Mann auf die Frage seiner besseren Hälfte 
"Schatz, fällt dir an mit irgendeine Veränderung auf" besser die 
Haarfarbe von gestern noch im Gedächtnis parat hat. Gedächtnis ist das, 
was man in einer Programmiersprache eine Variable nennt. Stellt man also 
für 'Haarfarbe_Frau' keine Gedächtnis Speicherzellen ab, dann hängt sehr 
bald der Haussegen schief, weil man dann eben eine entsprechende 
Veränderung nicht feststellen kann.
1
   Haarfarbe_Frau = Frau ansehen;
2
3
   while( laufend ) {
4
5
     Haarfarbe_jetzt = Frau ansehen;
6
7
     if( Haarfarbe_jetzt != Haarfarbe_Frau ) {
8
       Kompliment machen;
9
       Haarfarbe_Frau = Haarfarbe_jetzt;
10
     }
11
12
   }

Wobei das bei Frauen trickreich werden kann und die Frage als Fangfrage 
qualifiziert werden muss. War sie nicht beim Frisör und hat sich statt 
dessen ein neues Kleid gekauft, dann hängt nach einem Kompliment über 
die vermeintlich neue Haarfarbe erst recht der Haussegen schief. Aber 
das ist dann eine andere Geschichte und das zu vermeiden erfordert 
wieder andere Variablen, in denen man sich Dinge merken muss.

von Ja (Gast)


Lesenswert?

1
volatile unsigned int sekunde;
2
volatile unsigned int sekundeCOM;
3
volatile unsigned int sekundeCOM2;
4
5
int main(void)
6
{
7
  sekundeCOM = sekunde }
8
9
while(1)
10
  {
11
    sekundeCOM2 = sekunde;
12
    if (sekundeCOM2 != sekundeCOM)
13
    {
14
      sekundeCOM = sekundeCOM2;
15
    
16
    } }
17
[....]
18
19
ISR(TIMER1_COMPA_vect)
20
{
21
  millisekunden++;
22
  if(millisekunden == 1000)
23
  {
24
    sekunde++;
25
    millisekunden = 0;
26
    if(sekunde == 60)
27
    {
28
      minute++;
29
      sekunde = 0;
30
    }
31
    if(minute == 60)
32
    {
33
      stunde++;
34
      minute = 0;
35
    }
36
    if(stunde == 24)
37
    {
38
      stunde = 0;
39
    }
40
  }
41
}
 ?

von Paul B. (paul_baumann)


Lesenswert?

@Karl-Heinz

Wenn Du kein Ausbilder und/oder Lehrer bist, dann hättest Du es werden
sollen, ja eigentlich werden müssen. Ich habe noch Keinen gesehen, der 
so anschaulich erklären konnte.

(Das mußte ich mal sagen und nein: Das ist keine Schleimerei, das ist 
mein
Ernst)

MfG Paul

von Karl H. (kbuchegg)


Lesenswert?

Ja schrieb:

> ?

Haus in ein neues Projekt rein, schliess den Timer an, mach eine 
triviale Operation wenn sich die Sekunden verändert haben, zum Beispiel 
eine LED am Ausgang umschalten und wenn die LED im Sekundentakt blinkt, 
weisst du das alles in Ordnung ist.

Mehr Mut zum Risiko. Und mehr Mut auch mal ein Testprojekt zwischen zu 
schieben um eine bestimmte Technik zu testen. Mehr als das es nicht 
funktioniert kann dir nicht passieren! So lernt man. Wenn du dir hier 
jede 3 Zeilen Code absegnen lässt, lernst du genau gar nichts. Das 
Verfahren ist bekannt und es in Code zu giessen ist nicht schwer. Also: 
hau rein.

Man muss nicht alles gleich ins endgültige Projekt einbauen, wo es mglw. 
noch 200 andere Sachen geben kann, die schief gehen. Man kann ruhig für 
ein Detailproblem mal ein eigenes Projekt eröffnen, in dem man sich 
intensiv mit einer neuen Technik auseinandersetzt und die getrennt von 
der großen Aufgabenstellung durchtestet. Mit den heutigen IDEs dauert 
das generieren eines neuen Projektes keine 20 Sekunden. Das geht 
schneller, als du hier deine Frage posten kannst.

von Ja (Gast)


Angehängte Dateien:

Lesenswert?

Okay, danke! Echt vielen dank! Hast mir sehr geholfen, aber eine Frage 
hätte ich da noch: ich scheine immer das selbe falsch zu machen.
Hier Fehlermeldung +
hier der Code:
1
#define F_CPU 1000000UL     /* 1MHz */
2
 
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <stdlib.h>
8
9
 
10
 //Variablen für die Zeit
11
 volatile unsigned int millisekunden;
12
 volatile unsigned int sekunde;
13
 volatile unsigned int minute;
14
 volatile unsigned int stunde;
15
16
 
17
18
// Defines:
19
#define LED1    (1<<PD5)
20
#define LED2    (1<<PD6)
21
 
22
 // Timer 1 konfigurieren
23
 TCCR1B = (1<<WGM12);  // CTC Modus
24
 TCCR1B |= (1<<CS11); // Prescaler 8
25
 // ((1000000/8)/1000) = 125
26
 OCR1A = 125-1;
27
 
28
 // Compare Interrupt erlauben
29
 // Compare Interrupt erlauben
30
 TIMSK = (1<<OCIE1A);
31
 
32
 // Global Interrupts aktivieren
33
 sei();
34
 
35
int main()
36
{
37
  // LED-Pins als Ausgang definieren
38
  DDRD |= LED1 | LED2;
39
 
40
 
41
  while(1)
42
  {
43
    if (sekunde == 5)
44
    { 
45
    
46
    PORTD ^= LED1 | LED2;
47
    _delay_ms(200);
48
 
49
  
50
    }    
51
  }
52
}
53
 
54
55
56
ISR(TIMER1_COMPA_vect)
57
{
58
  millisekunden++;
59
  if(millisekunden == 1000)
60
  {
61
    sekunde++;
62
    millisekunden = 0;
63
    if(sekunde == 60)
64
    {
65
      minute++;
66
      sekunde = 0;
67
    }
68
    if(minute == 60)
69
    {
70
      stunde++;
71
      minute = 0;
72
    }
73
    if(stunde == 24)
74
    {
75
      stunde = 0;
76
    }
77
  }
78
}

Muss ich vor volatile noch etwas schreiben oder wie?

von Karl H. (kbuchegg)


Lesenswert?

1
.....
2
3
// Defines:
4
#define LED1    (1<<PD5)
5
#define LED2    (1<<PD6)
6
 
7
 // Timer 1 konfigurieren
8
 TCCR1B = (1<<WGM12);  // CTC Modus
9
 TCCR1B |= (1<<CS11); // Prescaler 8
10
 // ((1000000/8)/1000) = 125
11
 OCR1A = 125-1;
12
13
....

Ähm.
In C sind ausführbare Anweisungen nur innerhalb von Funktionen erlaubt.
OK, ich geb zu die Fehlermeldungen sind etwas missverständlich. Dazu 
müsstest du die Definition von TCCR1B kennen um die zu verstehen. Tut 
hier nichts zur Sache, denn: ausführbare Anweisungen gehören in 
Funktionen.

(Du hast dich hier zu sehr vom Stichwort 'volatile' leiten lassen. Du 
musst mehr auf die Zeilennummern achten! Bringt dich denn ein 
Doppelklick auf die Fehlermeldung nicht zur bewussten Stelle mit dem 
Fehler? Sie ist zwar auch manchmal falsch, aber zumindest hättest du 
gesehen, dass deine volatile von der problematischen Stelle weit 
entfernt sind und sehr wahrscheinlich daher nichts damit zu tun haben)

von Ja (Gast)


Lesenswert?

Karl Heinz schrieb:
> Ähm.
> In C sind ausführbare Anweisungen nur innerhalb von Funktionen erlaubt.
> OK, ich geb zu die Fehlermeldungen sind etwas missverständlich. Dazu
> müsstest du die Definition von TCCR1B kennen um die zu verstehen. Tut
> hier nichts zur Sache, denn: ausführbare Anweisungen gehören in
> Funktionen.

Gut zu wissen, vielen Dank!

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Ja schrieb:
> Gut zu wissen, vielen Dank!

Diese Information hättest Du beim sorgfältigen Durcharbeiten jedes 
ordentlichen Lehrbuches von selbst erhalten.

von Ratgeber (Gast)


Lesenswert?

Andreas Schweigstill schrieb:
> Diese Information hättest Du beim sorgfältigen Durcharbeiten jedes
> ordentlichen Lehrbuches von selbst erhalten.

Andreas Schweigstill schrieb:
> Lies gefälligst ein gutes Buch über C und verstehe dessen Inhalt. Lies
> ggf. noch Bücher über Algorithmen und Softwareentwicklung.

Andreas Schweigstill schrieb:
> Solch einen Ausdruck selbst zu formulieren ist eine Kleinigkeit, sobald
> Du die Grundlagen der Programmiersprache verstanden hast. Du besitzt
> jedoch keinerlei Grundlagen. Das musst Du nachholen.


Kannst Du bitte, bitte mal die Griffel von der Tastatur lassen, wenn Du 
nichts, aber auch gar nichts als diese ewige Lehrbuchplatte abzuspielen 
hast?

Danke.

von Karl H. (kbuchegg)


Lesenswert?

Ratgeber schrieb:

> Kannst Du bitte, bitte mal die Griffel von der Tastatur lassen, wenn Du
> nichts, aber auch gar nichts als diese ewige Lehrbuchplatte abzuspielen
> hast?

Er hat allerdings recht.

Manche brauchen eben immer wieder einen Arschtritt, bis sie endlich 
begreifen, dass eine Programmiersprache zu erlernen etwas anderes ist 
als Briefmarkensammeln, bei dem man halt einfach mal anfängt und es wird 
schon irgendwie gehen. 2 Youtube Videos und 3 Webseiten (natürlich die 
mit nicht zu viel erklärendem Text, dann man will ja schliesslich nicht 
auch noch lesen) reichen eben nicht um wenigstens die einfachsten 
Grundlagen zu schaffen.

von Ratgeber (Gast)


Lesenswert?

Karl Heinz schrieb:
> Er hat allerdings recht.

Nein, ER hat kein Recht -insbesondere deshalb nicht weil er im Gegensatz
zu Dir keine Hilfestellung und keinen nützlichen Rat parat hat, sondern
immer nur das Gleiche stupide wiederholt. Ich beobachte dieses Verhalten
schon eine ganze Weile, nicht erst in diesem Beitrag. Nun war der Punkt
erreicht, etwas dazu zu sagen.

von Ja (Gast)


Lesenswert?

Okay, ich befürchte zwar zerfetzt zu werden, aber vielleicht kriege ich 
ja doch eine Antwort: ein Delay-Befehl also _delay_ms(200ms) zum 
Beispiel:
Verzögert dieser in einer Whileschleife den kompletten Ablauf oder wird, 
wenn dieser Befehl z.B. in einem if-Statement ausgeführt wird, nur die 
if-Zeile verzögert und der Rest läuft weiter so schnell ab?
Danke

von Bernd K. (prof7bit)


Lesenswert?

Ja schrieb:
> Verzögert dieser in einer Whileschleife den kompletten Ablauf

Ja. Zumindest erstmal in erster Näherung (siehe unten)

> oder wird,
> wenn dieser Befehl z.B. in einem if-Statement ausgeführt wird, nur die
> if-Zeile verzögert und der Rest läuft weiter so schnell ab?
> Danke

Nein. Es gibt nur einen Punkt an dem Du Dich im Ablauf des Programmes 
befindest, wenns an dem Punkt nicht weiter geht dann hängts dort.

Wie eine Person beim Einkaufen die sequentiell den Einkaufszettel 
abarbeitet, wenn das Finden der Erdbeeren in der riesigen Obst und 
Gemüseabteilung 2 Minuten dauert dann kann sie nicht gleichzeitig noch 
den Punkt "wenn frische Erdbeeren da sind dann bring auch Schlagsahne 
mit" gleichzeitig abarbeiten. Das geht nicht. Erst die Erdbeeren, dann 
die Sahne.

Das geht nur wenn die Person zu zweit ist (Threads oder Interrupts). 
Aber auch die können sich gegenseitig blockieren und auch die sind nicht 
wirklich gleichzeitig (zumindest nicht auf Ein-Kern-CPUs) aber sie 
helfen zumindest indem man beim Nachdenken über das Problem und dem 
Schreiben des Programms zumindest aus logischer Sicht einfach so tun 
kann als würde man zwei separate Programme für zwei CPUs schreiben, das 
kann so manches komplexe Problem elegant entknoten, kann aber auch 
ungewünschte Seiteneffekte haben die man beachten muss wenn beide 
gelegentlich auf die selben Daten zugreifen sollen.

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.