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
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 ;-) )
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.
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
@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
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
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?
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
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
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
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
Hallo, "Ausgangsleitungen Leitungen" -> Ausgangsleitungen "U-Variante" -> Ur-Variante ;-)) Gruß aus Berlin Michael
Danke Micha, das klingt echt gut. Kannst Du mir vielleicht ein Buch oä empfehlen, wo ich sowas hätte nachlesen können? Markus
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.