Forum: Mikrocontroller und Digitale Elektronik Input Capture


von Andreas Juhl (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hab hier schon mal was gepostet, aber irgendwie hats niemanden so recht
gekümmert!

Jetzt hab ich mal das Programm zur fehlersuche Minimiert.

Ich möchte mit einem Atmel ATmega16 mittels des ICP (Input Capture)
Eingangs Eine Lampe Leuchten lassen, sobald das der Impuls kleiner als
1500 ms ist (Hex 05 DC).

Mein Prozessor ist auf 8 Mhz internen Oszilator eingestellt, und der
vorteiler für den Zähler ist 8, also 1 Zähler = 1 ms

Das funktioniert scheinbar auch schon ganz gut, nur wenn ich mit dem
Signal langsam bis auf 950ms runterfahre gibt es eine Stelle
mittendrin, an der das licht wieder erlischt, noch weiter runter geht
es wieder an. Ich glaube auch dass die Schaltschwelle nicht bei genau
1500 liegt sonder etwas darüber. Woran kann der Fehler denn liegen?

Zum testen benutze ich das Signal einer Fernsteuerung für
Modellflugzeuge (Royal EVO 12) in PPM 9 Modus.


Hab ich das überhaupt generell richtig verstanden,

dass ich wenn ich das Signal von aufsteigender zu absteigender Flanke
messen will, erst den Interrupt auf ansteigende Flanke triggern muss,
dann Wert speichern, dann auf absteigende Flanke triggern, und die
differenz aus Aktuellem und gespeichertem wert nehmen muss?

von Peter D. (peda)


Lesenswert?

"aber irgendwie hats niemanden so recht gekümmert"

Hier ist doch kein Kümmerkasten !!!

Hier sitzen nur ganz normale Leute, wie Du und ich.

Und wenn einer nichts dazu sagen kann, dann schweigt er eben.

Capture wird wohl nur sehr selten eingesetzt, ich habs auch noch nie
benutzt.


Peter

von Sven Müller (Gast)


Lesenswert?

Vielleicht hat sich keiner gekümmert weil das schon oft hier diskutiert
wurde..

Aber ich will mal nicht so sein..

1. Wie kommst du darauf das ein Zähler 1ms ist? (milli!!) es ist eine
us (gesprochen mükro, 1e-6)
 2. Ja, du musst den trigger umschalten. Bei der berechnung wert2 -
wert1 =zeit müssen alle datentypen als unsigned int definiert sein
(wenn du c nutzt)
3. hast du alle Interrupts wieder passend gesperrt?

von crazy horse (Gast)


Lesenswert?

noch ein Tip, der die Software übersichtlicher macht:
lege das Signal sowohl an einen Int-Eingang als auch den ICP-Eingang,
damit sparst du dir ganze Umschalterei und Rechnerei.
Der externe Int (nur steigende Flanke) macht nichts weiter, als Timer1
auf 0 zurückzusetzen, beim ICP (fallende Flanke) liest du den
Capture-Wert aus, der ist dann die Impulslänge, bei 8MHz und Vorteiler
8 direkt in µs.
Und noch was: bitte in den diversen Interruptroutinen immer das SREG
sichern! Es gibt kaum eine Ausnahme von dieser Regel.

von Uwe (Gast)


Lesenswert?

Hi!
>cpi TimerAktuellHigh, $05
>brsh AuswertEnde
>cpi TimerAktuellLow, $DC
>brsh AuswertEnde

Ich habe dir schonmal geschrieben das deine Vergleicherei nicht i.o.
ist. "CPC" ist der gesuchte Befehl der dir weiterhilft. Ich versuche
es mal zu erklären:
1. Test ">$05?" ist ja noch ok.
Aber was ist bei <$05?
1. $4FF bis $400 haut alles hin.
2. aber jetzt kommt es: $400-1=$3FF
3. von $3 FF bis $3 DC Licht aus weil >=$DC
und das ganze bei $2FF,$1FF,$0FF nochmal.


MFG Uwe

von Andreas Juhl (Gast)


Angehängte Dateien:

Lesenswert?

Danke Uwe,

jetzt funktionierts.

Hab ichs endlich doch noch kapiert!



Ich weiss, du hattest das schon mal geschrieben, da hab ichs auch
probiert, und der einschaltpunkt lag immernoch daneben, da hab ich dann
gedacht dass es das auch nicht sein kann.

Naja, der 2.Fehler war dann noch dass das Signal was am Sender
rauskommt um 400ms kürzer ist als gedacht

von Rahul (Gast)


Lesenswert?

@Sven:
Es heisst entweder mikro oder mü!

von Andreas Juhl (Gast)


Lesenswert?

Stimmt,

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.