Forum: Mikrocontroller und Digitale Elektronik Wie überprüfen, ob sich anligendes Signal nicht verändert?


von Cha_Ko (Gast)


Lesenswert?

Hallo Leute, ich möchte mit einem uC überprüfen, ob sich ein Signal, 
welches am Controller anliegt über eine gewisse Spanne, sagen wir 1 
Sekunde, nicht verändert. Ich arbeite mit einem Atmega 32 und 
programmiere in C. Kann mir da jemand einen Tip geben, wie das am besten 
geht?

von Dida N. (quader)


Lesenswert?

Digitales oder analoges Signal?

Falls es ein digitales Signal ist, sollte ein einfacher Statuswechsel 
detektiert werden, oder ändert sich da ein ganzes Muster? Ersteres wäre 
ja mit einer einfachen Abfrage zu lösen.

Bei einem analogen Signal einfach jede Sekunde die ADC-Werte miteinander 
vergleichen mit berücksichtigung einiger Bits Ungenauigkeit...

von Cha_Ko (Gast)


Lesenswert?

es ist ein digitales Signal...es soll nur überprüft werden, ob das 
Signal eine Sekunde lang auf HIGH.

von Cha_Ko (Gast)


Lesenswert?

is es zu einfach, dass mir keiner antwortet?;)

von 6640 (Gast)


Lesenswert?

Ist zu einfach. Ja. Weshalb nicht eine Sekunde lang alle 10ms messen und 
vergleichen, ob es sich geaendert hat ?

von tobi (Gast)


Lesenswert?

leg es dir auf einen externen interrupt pin.

von Karl H. (kbuchegg)


Lesenswert?

Na ja, so schwer ist das wirklich nicht.

Da gibt es viele Strategien, die man einsetzen kann.
Kommt auch darauf wann, wozu das gut sein soll, bzw.
wie dein Signal konkret aussieht.

Eine Möglichkeit ist zb.:

Das schwierigste ist es wohl, 1 Sekunde abzumessen.
Dazu benutzt du einen Timer, der zb. alle 10ms einen
Interrupt (Overflow oder einen CTC Interrupt) auslöst.

In der ISR passiert dann erstaunlich wenig:

   Einen Zähler erhöhen. Dieser Zähler wird im Hauptprogramm
   ständig abgefragt, ob er schon 100 erreicht hat. Da die ISR
   alle 10ms aufgerufen wird, ist 1 Sekunde vergangen wenn der
   Zähler 100 erreicht hat. Dadurch geht es dann im Hauptprogramm
   weiter.


Das Hauptprogramm wartet in einer Schleife, bis der Zähler
die 100 erreicht hat. Gleichzeitig überprüft sie innerhalb
der Schleife ständig, ob der Eingangspin noch immer 1 ist.
Ist er das nicht -> dann hat das Signal gewechselt.
Das wird dann vermerkt und der Timer kann wieder angehalten
werden.
Konnte aber die Schleife den Zähler bis 100 durchlaufen
lassen (sprich: Ist 1 Sekunde vergangen) und es wurde keine
0 am Eingang gesehen, dann wahr wohl das Signal die ganze Zeit
auf 1


In Pseudocode
1
volatile uint8_t TimeCounter;
2
3
ISR( .... )
4
{
5
  TimeCounter++;
6
}
7
8
uint8_t CheckInput()
9
{
10
  uint8_t InputDown;
11
12
  TimeCounter = 0;
13
14
  // hier kommt die Timer Initialisierung
15
  // so dass der Timer mit der richtigen Frequenz zählt
16
  // und regelmässig einen Interrupt auslöst
17
18
  ...
19
20
21
  InputDown = 0;
22
  while( TimeCounter < 100 ) {
23
    if( PINxx & ( 1 << Pxx ) == 0 ) {
24
      InputDown = 1;
25
      break;
26
    }
27
  }
28
29
  // Timer wieder stoppen
30
31
  ...
32
33
  // das wars
34
  return InputDown;
35
}

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.