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?
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...
es ist ein digitales Signal...es soll nur überprüft werden, ob das Signal eine Sekunde lang auf HIGH.
is es zu einfach, dass mir keiner antwortet?;)
Ist zu einfach. Ja. Weshalb nicht eine Sekunde lang alle 10ms messen und vergleichen, ob es sich geaendert hat ?
leg es dir auf einen externen interrupt pin.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.