PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Signalabtastung mit ATMEGA644



blackflame2025
31.10.2011, 11:45
Hallo,

ich bin momentan auf der Suche nach einer einfachen Lösung um ein digitales (nicht analoges) TTL Signal mit meinem MC zu erfassen und in ein Register zu legen.
Ich bin auf meiner Suche bereits auf das I²C Protokoll gestoßen, weiß aber nicht ob ich es für meinen Anwendungsfall benutzen kann, da das TTL Signal über keinen CLK verfügt.
Auch die ADC Wandlung taugt für mich nichts, da ich nicht den Wert des Analogsignals herausfinden möchte, sondern die daraus resultierende logische 1 oder 0.


Zum Hintergrund:
Ich verwende einen US Empfänger, mit welchem ich nach längerer Aufbereitung des Signals, ein TTL Signal bekomme und dieses abgreifen möchte ohne meine CPU dauernd mit dem Abtasten zu beschäftigen, da diese schon genug mit der Demodulation des Signals zu tun hat.

Ich würde mich über eine Antwort freuen!
LG

ranke
31.10.2011, 11:54
analoges TTL Signal

Kannst Du das noch etwas genauer beschreiben? TTL-Signale kenne ich bisher nur als digitale Signale.

blackflame2025
31.10.2011, 12:14
sorry natürlich ist das Signal digital (Spannungspegel 5V positiv, 0V negativ) - ich habe es nur fälschlicherweise analog bezeichnet.

ranke
31.10.2011, 13:04
Wenn Du Dein Signal an einem externen Interrupt Pin anlegst, kannst Du mit einer Pegeländerung einen Interrupt hervorrufen. Das ist die Methode der Wahl, wenn die Pegeländerung relativ selten passiert und wenn der Prozessor zwischenzeitlich (wenn der Pegel stabil ist) etwas anderes machen soll. Die Zeitdauer eines High-Pegels kann man z.B. messen, wenn man beim Pegelwechsel Low> High mittels Interruptroutine einen Timer startet und beim Übergang high > Low nachsieht, wie weit er mit dem Zählen gekommen ist. Das Timer starten bzw. nachsehen braucht nur wenige Maschinenbefehle, der Timer selbst läuft im Hintergrund.

blackflame2025
31.10.2011, 14:51
Gute Idee das könnte klappen. Ich werds mal ausprobieren und melde dann meinen Erfolg/Misserfolg :)

wkrug
31.10.2011, 22:31
Für das Problem fallen mir ein paar Lösungsvorschläge ein.

Meine erste Wahl wäre da der ICP ( Interrupt ), bei dem beim entsprechenden Pegelwechsel gleich der Zählerstand eines Timers in ein Register geschrieben wird.
Stellt man innerhalb dieser Routine auch gleich das Sensing von steigende auf fallende Flanke um, kann sowohl die Impulslänge, als auch die Pausenlänge bestimmt werden.
Man zieht einfach die entsprechenden, zwischengespeicherten ICP Werte voneinander ab.

Möchte man sich die sensing Umschalterei sparen, könnte man auch zwei Interrupts z.B. INT0 und INT1 parallel schalten und den einen auf steigende Flanke und den anderen auf fallende Flanke einstellen.
Innerhalb der Interrupts kann man dann einen Timer auslesen, und mit dem vorherigen Wert der anderen Routine verrechnen.

Eine weitere Möglichkeit wär der Pin Change Interrupt, der bei einem Pegelwechsel an bestimmten Pins einen Interrupt verursacht.
Allerdings muss man dabei selber rauskriegen welcher Pin und welche Flanke den Interrupt verursacht hat.

Als letzte Möglichkeit wär noch das Polling, bei dem in festen Abständen abgefragt wird, wie der Pegel am entsprechenden Eingang ist.
Um da eine Gleichförmigkeit reinzukriegen, würde ich dafür einen Timer Interrupt verwenden.
Wenn Du dazu einen Comparematch Interrupt verwendest, sind die Zeitintervalle sogar noch einfach einstellbar.

Es kommt halt auf die Signalfrequenz und die benötigte Auflösung an, welche Methode für Dich die Beste ist.

blackflame2025
01.11.2011, 07:23
Das sind schon einige Gute Eindrücke.
Ich werds alles mal ausprobieren.
Vielen Dank!

Mein Signal kommt übrigens mit 2khz am Eingang an!
Gibts die Möglichkeit das Polling in Hardware umzusetzen oder gibts so ewas gar nicht in Hardware?
Ich meine 2khz sollte man in gewisser regelmäßigkeit abtasten können, ohne dass meine CPU doll ausgelastet wird. Schöner wärs trotzdem :)

wkrug
01.11.2011, 07:43
Gibts die Möglichkeit das Polling in Hardware umzusetzen oder gibts so ewas gar nicht in Hardware?
Kann man sicher machen, aber was soll das bringen? Bei einem Pegelwechsel muss trotzdem der µC aktiv werden.
Dann kann mans ebenso gut über Interrupts lösen und braucht keine zusätzliche Hardware.

Bei 2kHz würd ich die ICP Methode benutzen. Bei 8MHz Taktfrequenz und einem Prescaler von 8 kriegst Du dabei eine Auflösung von 1µS.
Der maximale Abstand zwischen 2 Pegelwechseln darf dabei, bei einem 16Bit Counter, ca. 65ms betragen, wenn man ohne einen Überlaufzähler arbeitet.
Mit einem 16Bit Überlaufzähler ( Zähl Variable die im Timer Overflow hochzählt ) kommt man auf etwa 42000 Sekunden.