Forum: Mikrocontroller und Digitale Elektronik Digitales Signal timen


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich möchte das im Anhang befindliche Signal erzeugen. Zuerst soll 
auf Leitung 1 ein 100 ns langer Puls erzeugt werden, danach soll Leitung 
2 400 ns auf high gehen und dann wieder fallen. 1 us nach dem ersten 
Puls soll dann das ganze von vorn beginnen. Das soll exakt 5036 mal 
passieren, wozu ich einen MC benutzen würde. Aber das schnelle 
Zeitsignal würde ich gern mit Logik-ICs erzeugen (billig billig 
einfach).
Wichtig ist vor allem, dass Leitung  und 2 immer in Phase sind.
Ich habe an eine Oszillatorschaltung und Zähler gedacht, aber so richtig 
weiß ich nicht wie ich die Zeitverhältnisse damit realisieren soll. Die 
genauen Werte sind aber nicht soo wichtig, kann alles +- 100 ns sein.
Vielen Dank den Helfern!

Markus

von Jan (Gast)


Lesenswert?

Ich glaube nicht, dass du mit Logik-ICs billiger weg kommst als mit z.B. 
einem attiny13, gibts für einen Euro. Den taktest du mit 10MHz und 
schreibst ein kurzes asm-Programm:
1
ldi one_reg,1
2
ldi two_reg,2
3
ldi zero_reg,0
4
ldi counterl,low(5000)
5
ldi counterh,high(5000)
6
start:
7
out PORTB,one_reg
8
out PORTB,two_reg
9
dec counterl
10
subc counterh,zero_reg
11
nop
12
out PORTB,zero_reg
13
tst counterl
14
tstc counterh
15
brne start

(So, sonst schreib ich niemandem einfach so seinen Code, aber dafür hab 
ich auch mal ein paar Fehler eingebaut ;-) )

von Markus (Gast)


Lesenswert?

Danke für den Code, aber kennt vielleicht jemand, zumindest zum 
Verständnis, einen Link auf eine Schaltung mit der man sowas direkt 
machen kann? Vielleicht muss es später ja schneller gehen und dann ist 
bei einem MC schnell Schluss.

von remo (Gast)


Lesenswert?

100ns entspricht einem Cycle bei 10Mhz Takt.
Mit einem Mini Atmel ATtiny für 1 Euro lässt sich das einfach erledigen.
Nehmen wir an die Leitung 1 sei PortB0 und Leitung 2 sei PortB1
dann setzt du den PortB auf 0x01 und im nächsten Schritt auf 0x02 dann 
drei nop und den PortB auf 0x00 zurücksetzen. das ganze in einer 
Schleife 5036 mal und in der Schleife die restliche Zeit der 2400ns 
durch eine weitere kleine Schleife oder nop verbraten. Fertig.

   .define tmp    = R16
   .define zero   = R17
   .define one    = R18
   .define two    = R19

   ; Variablen initialisieren
   ldi null, 0x00
   ldi one, 0x01
   ldi two, 0x02

   ; Ports initialisieren
   out PORTB, zero    ; PortB initialisieren
   ldi tmp, 0x03
   out DDRB, tmp      ; PortB0+1 sind Ausgänge

; schleife 5036mal,   -5036 ist in hex 0xEC54
   ldi R25, 0xEC
   ldi R24, 0x54
loop:
   ldi PortB, one
   ldi PortB, two
   nop
   nop
   nop
   ldi PortB, zero    ; 600 von 2400 ns sind nun verbraten
   nop                ; Die Schleifa am Schluss braucht noch 4 cycles
   nop                ; also noch 1400ns durch 14 nops verbraten
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   addiw R24, 0x01    ; 16-bit Schleifenzähler erhöhen
   brne loop          ; schon 5036 mal durch ?
fertig:
   rjmp fertig

So, wirklich fertig, viel Spass und ciao
Remo


von Dirk (Gast)


Lesenswert?

Hi,

ein kleiner CPLD z.B. von Xilinx XC9536 könnte dein Problem recht 
schnell lösen.

Gruß,
Dirk

von remo (Gast)


Lesenswert?

@Jan: du warst schneller, aber es ist doch erstaunlich wie sich die 
Lösungen ähneln. Das mit dem low()+high() hast du schöner gemacht. dafür 
ist mein Addiw mit einem einzigen anschliessenden brne schöner.
So nun muss er doch auch mal was selbst machn, oder?

Remo

von Markus (Gast)


Lesenswert?

Sagt mal, kann es sein dass ihr nicht wisst wie es mit Logik geht? Ich 
will wirklich kein CPLD, da muss ich Zeug kaufen um es zu proggn, 
irgendeine Sprache zum programmieren lernen etc. Viel zu aufwendig. Tiny 
ist sicher eine gute Idee, aber vielleicht sollen aus den 100 ns mal 10 
ns werden und dann wirds knapp für den Tiny. Ich möchte gern etwas dabei 
lernen, aber beim programmieren vom Tiny lern ich nichts Neues. Wie hat 
man sowas denn früher gemacht? Vor CPLDs und den Sachen? Ich freu mich 
auch über einen Link wo solche Zeitgeberschaltungen allgemein 
beschrieben sind, bei digitaler Logik hapert es bei mir wirklich und dem 
würde ich gern anders abhelfen als in Software zu lösen.

Grüße,
Markus

von Karl H. (kbuchegg)


Lesenswert?

Such mal nach 'Monoflop'.
2 555 als Monoflop beschaltet, einer mit 100, einer mit 400ns
wobei der 2.te von der fallenden Flanke des ersten getriggert
wird.
Aber wenn du sowieso einen µC einsetzt, bietet es sich ja
geradezu an, den auch für die Pulse zu benutzen. Und ausserdem
ist das ein µC Forum. Was hast du erwartet?

von Markus (Gast)


Lesenswert?

Es ist ja sehr nett von euch das ihr mir helft, aber mich interessiert 
eben speziell wie es mit Logik geht. Euer Code ist zwar sehr nett, 
allerdings hilft er mir bei meiner Frage leider nicht weiter.

Markus

von Johannes A. (Gast)


Lesenswert?

Ich bin zwar bisher nur Beobachter, hätte allerdings doch erwartet, dass 
nach Markus' zweitem Posting bei irgendjemandem der Groschen fällt.

Nagut, ist er halt nicht gefallen...

Also ich würde mal sagen, mit nem AVR hast Du immerhin noch Luft bis 
20MHz, wo ein 555 - sorry Karl-Heinz - schon lange nicht mehr mitkommt, 
aber darüber ist mit dieser Family echt Sense. Womöglich auch schon 
vorher, denn ich nehme nicht an, dass die ganze "Zappelei" auf zwei 
Leitungen reiner Selbstzweck ist, sondern dass da so nebenbei noch 
irgendwas übertragen oder eingespeist oder sonstwie verarbeitet werden 
soll. Oder?

Gruß Johannes

von FBI (Gast)


Lesenswert?

Hi,

mit Zähler ist doch eigentlich ganz einfach:

Zählerstand 0  --> Leitung1 ein
Zählerstand 1  --> Leitung1 aus, Leitung2 ein
Zählerstand 5  --> Leitung2 aus
Zählerstand 10 --> Zähler auf 0 zurücksetzen

Ansonsten noch bei Zählerstand 10 einen zweiten Zähler triggern, der bis 
5036 zählt und dann den Takt abschaltet.

CU Frank

von Michael U. (Gast)


Lesenswert?

Hallo.

keine Lust zum malen jetzt...

Takt 100ns erzeugen (20MHz-Oszi und Teiler 2:1 dahinter, damit 50:50.

4-Stufigen Binär-Zähler damit Takten, 1-aus 16 Dekoder dahinter.

Ausgang 0 ist der 100ns-Impuls. Ausgang 1,2,3,4 OR-Verknüpft ist der 
400ns Impuls im Anschluß. Mit Ausgang 10 den Zähler zurücksetzen.

Falls Spikes nicht sein dürfen, die Ausgangsleitungen Leitungen auf je 
ein D-Flip-Flop als Latch mit dem Eingangstakt takten.

Das wäre so die U-Variante. Aufmalen und vereinfachen musst Du noch 
selbst. ;)

Gruß aus Berlin
Michael

von Michael U. (Gast)


Lesenswert?

Hallo,

"Ausgangsleitungen Leitungen" -> Ausgangsleitungen
"U-Variante" -> Ur-Variante

;-))

Gruß aus Berlin
Michael

von Markus (Gast)


Lesenswert?

Danke Micha, das klingt echt gut. Kannst Du mir vielleicht ein Buch oä 
empfehlen, wo ich sowas hätte nachlesen können?

Markus

von Michael U. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

im Moment würde mir auch nur "Museums-Ware" einfallen:
TTL-Kochbuch evtl.

Hab mal den Anfang zum Spaß rangehangen. ;)

Ob es die ICs noch alle gibt? Keine Ahnung...

Jetzt noch 2x 74HCT590 o.ä. als 16-Bit-Counter an den 100ns-Ausgang,
den Zählerstand von 5036 mit Gattern dekodieren, ein Flip-Flop als 
Start-Stop-Schaltung ran und fertig.

Wenn die Dekodierung auf DIP-Schalter legt, kann man es sogar einfach 
umprogrammieren.

Naja, geht heutzutage eben auch mit anderen Mitteln, hier ist es mehr 
Lötaufwand, Kosten halten sich in Grenzen, Platz- und Strombedarf ist 
höher, machen kann man das aber auch heute noch, wenn man will. :)

Gruß aus Berlin
Michael

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.