Hi Ich möchte mit meinem µC ein Signal wie im Bild (Anhang) erstellen. Die kurzen Zacken sind LOW und die längern ein HIGH. Die Zeitabstände sind mir bekannt. Nur wie kann ich so ein Signal selber erstellen? danke mfg Rene
Rene Pratsch schrieb: > Die kurzen Zacken sind LOW und die längern ein HIGH. > Die Zeitabstände sind mir bekannt. Und die wären? > Nur wie kann ich so ein Signal selber > erstellen? Da es mehrere Techniken gibt, hängt es u.a. auch von den einzuhaltenden Zeiten ab, welche Technik man benutzt. Ein anderes Thema ist zb: was hat der µC sonst noch zu tun?
Hallo Man kann ein Timer mit dem Compare-Match Interrupt verwenden. Dann prüft man in jeder ISR in welchem Zustand man sich befindet und reagiert entsprechend. Zum Schluss schreibt man die Dauer bis zur nächsten Aktion in das Output-Compare Register. Ist das Zufälligerweise Märklin Digital?
Der µC horcht zusätzlich über die RS232. Hier bekommt er die Daten wie er das Signal erzeugen muss. zB eine 1 -> Signal 11000100 zB eine 5 -> Signal 11010100 Die HIGH Flanke beträgt 1ms die LOW Flanke beträgt 300µs
> Die HIGH Flanke beträgt 1ms > die LOW Flanke beträgt 300µs Flanken sind theoretisch zeitlos :-/ In der Realität haben sie eine gewisse Steilheit. Aber das ist hier irrelevant. Du meinst wohl eher sowas: Eine '1' ist 1ms high, dann 300us low. Eine '0' ist 300us high, dann 1ms low.
> Eine '1' ist 1ms high, dann 300us low. > Eine '0' ist 300us high, dann 1ms low. ja genau so hab ich das gemeint nur nicht wirklich so hingeschrieben.. und wie ist es nun möglich ein solches signal zu erzeugen? also mit den richtigen zeitabständen? danke
Rene Pratsch schrieb: >> Eine '1' ist 1ms high, dann 300us low. >> Eine '0' ist 300us high, dann 1ms low. > > ja genau so hab ich das gemeint nur nicht wirklich so hingeschrieben.. > > und wie ist es nun möglich ein solches signal zu erzeugen? also mit den > richtigen zeitabständen? Indem du zb einen Timer so aufsetzt, dass er alle 100µs eine ISR aufruft. Der Rest ist dann nur noch abzählen in der ISR und gegebenfalls den Pin umschalten.
Wie genau muß denn das ganze sein. Einfacher wäre 1ms/333µs oder 900µs/300µs. Peter
Wenn man sich als Anfänger das Interrupt/Timer-Geraffel sparen will kann man auch einfach Warteschleifen benutzen. Leider bleibt ist es dann nicht/nur sehr schwer möglich auch noch andere Aufgaben zu erledigen. Aber oft ist das ja garnicht notwendig. cli() bit setzen x us warten _delay_us(x) bit löschen x us warten _delay_us(x) ... usw .. sei() das führt schneller zum Erfolg und kann sogar genauer sein.
Peter Dannegger schrieb: > Wie genau muß denn das ganze sein. > Es sollte sehr genau dem entsprechen: '1' ist 1071us high, dann 357us low. '0' ist 357us high, dann 1071us low. also ein Takt hat 1428us
> Flanken sind theoretisch zeitlos :-/
Nicht ganz: hier im Forum liest man immer wieder mal von
Flankenwechseln. Unter einem Flankenwechsel verstehe ich, wenn
beispielsweise auf eine steigende Flanke unmittelbar eine fallende
folgt, also ein kurzer Spike. Damit man hier einen Zeitpunkt angeben
kann, muss sowohl die steigende als auch die fallende Flanke einen
gewisse Dauer aufweisen.
(bitte meinen Beitrag nicht zu ernst zu nehmen)
> '1' ist 1071us high, dann 357us low. > '0' ist 357us high, dann 1071us low. 1071 ist das 3fache von 357. Damit wird die Sache recht einfach. Zähle 4 Takte à 357µs und schalte nach dem ersten oder dritten. Eine SPI-Lösung wäre auch denkbar: Takte die SPI mit 357µs und schreibe pro Byte 2 Datenbits, wobei die Nibbles entweder 0b1000 oder 0b1110 sind. Ist die Anzahl der Bits ungerade, musst Du im letzten Byte mit 0b0000 auffüllen.
> muss sowohl die steigende als auch die fallende Flanke einen > gewisse Dauer aufweisen. Wie schon erwähnt: Flankensteilheit. Die wird idR. gemessen von 10% bis 90% des Maximalpegels. > (bitte meinen Beitrag nicht zu ernst zu nehmen) Kam mir nicht in den Sinn ;-)
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.