Gibt es einen Baustein (5 V, TTL-Pegel) mit den folgenden Eigenschaften: 8 Eingänge 8 Register 8 Ausgänge 1 Takteingang 1 Reseteingang Nach einem Takt wird der 8-Bit Eingangswert zum Registerinhalt addiert und auf dem Ausgang ausgegeben. Der Reseteingang setzt das Register auf Null.
ATMega8 :) Der hat sogar ein paar Pins mehr kann mehr und hat sogar 32 Register auch wenn nicht alle für alle Dinge benutzt werden können und besitzt auch viel mehr Funktionen als einfache I/O Dinge. Wie schnell soll das ganze denn von statten gehen? Je nach dem Fällt dann ein µC raus.
ohne Reset: http://www.datasheetcatalog.org/datasheets/70/248178_DS.pdf mit Reset 2 X http://www.datasheetcatalog.org/datasheet/philips/74HC_HCT174_CNV_2.pdf
Hi >Nach einem Takt wird der 8-Bit Eingangswert zum Registerinhalt addiert >und auf dem Ausgang ausgegeben. Der Reseteingang setzt das Register auf >Null. Als TTL/CMOS mit Sicherheit nicht. MfG Spess
In TTL/CMOS Logik läuft das auf 3 Bausteine raus. 2x 4-Bit Adder und 1x Register.
@Gast Der ATMega8 ist ein guter Vorschlag. Leider aber zu langsam. @Z8 Der Eingangswert soll mehrfach addiert werden. --- Es würde mit zwei 4-Bit Addierern 74HCT83 und einem 8-Bit Latch 74HCT573 gehen. Aber ab drei Bausteinen beginnt ja schon ein "TTL-Grab".
@all Da haben sich ein paar Beiträge gekreuzt. Vielen Dank für eure Antworten und Informationen. Wäre ja auch zu schön gewesen, dies in einem Baustein zusammengefaßt zu bekommen.
@Martin H.
> 2,4 MHz Taktfrequenz
Warum ist dir dann ein Mega8 zu langsam?
@Peter 20 MHz / 2,4 MHz = 8 1/3 Takte Mit deiner Frage deutest du schon an, daß du weißt wie es mit den paar Takten geht. Nur raus damit!
Ein fertiges IC mit diesen Funktionen ist mir nicht bekannt. Ein GAL würde die funktionellen und zeitlichen Anforderungen aber erfüllen. Ein 16V8 könnte schon ausreichen. Mit einem Mega8 geht das natürlich auch. Allerdings braucht er nach meinen Überlegungen 6 Zyklen pro Schleifendurchlauf, so dass er für 2,5MHz Signalfrequenz mindestens mit 14,4MHz getaktet werden muss, was wiederum einen externen Quarz oder Oszillator erfordert, der zusätzlich Platz braucht.
Ich schrieb: > Allerdings braucht er nach meinen Überlegungen 6 Zyklen pro > Schleifendurchlauf, Hoppla, da hatte ich den Takteingang vergessen (der Reset war berücksichtigt). Dann werden's wohl ein paar Zyklen mehr. Aber besonders elegant ist die AVR-Lösung in meinen Augen sowieso nicht ;-)
Die Frage ist noch wann der Eregniss am Ausgang vorhanden sein soll. Es würde ja auf jeden Fall mit einem µC verzögert erscheinen. Gibt es auch einen Ausgangstakt?
yalu wrote: > Ein fertiges IC mit diesen Funktionen ist mir nicht bekannt. Ein GAL > würde die funktionellen und zeitlichen Anforderungen aber erfüllen. > Ein 16V8 könnte schon ausreichen. Bist du sicher, dass ein 16V8 einen 8-Bit Accumulator hinkriegt? Könnten die Terme eng werden.
lLoop: in reg, datenport ; 1T sbis statusport, takt ; 2T add reg, reg ; 1T sbis status, reset ; 2T clr reg, reg ; 1T out datenport, reg ; 2T rjump lLoop ; 2T maximale Laufzeit 11 : Takte 20MHz / 11 -> 1,8 MHz schade !!! Ein ATmega geht nicht aber ein LPC2000 oder ARM7?
A. K. schrieb:
> Bist du sicher, dass ein 16V8 einen 8-Bit Adder hinkriegt?
Nein, sonst hätte ich nicht " könnte ausreichen" geschrieben ;-)
Schnelle I/O ist nicht die starke Seite der ARMs. Die PIC24H/dsPIC33 sind da besser aufgestellt. 40MHz Takt, und das müsste eigentlich mit in einem einzigen Befehl plus Schleife funktionieren. Wenn das Reset Signal nicht genause schnell sein muss => Hardware-Reset, spart Code und damit Zeit.
edit:
>out datenport, reg ; 1T
jetzt sind schon 2MHz mit einem ATmega 88
evtl habe ich noch was übersehen? Schaut mal bitte drüber!
>Bist du sicher, dass ein 16V8 einen 8-Bit Accumulator hinkriegt? Könnten >die Terme eng werden. Das geht in einem 16V8 nicht rein. Habe ich vor Jahren schon mal versucht. Gruss helmi
PS: Beim PIC hatte ich den Takt vergessen. Also doch ein paar Befehle mehr. Beim Takt entsteht das Problem, auch im oben gezeigten AVR Code, dass man besser auf die Flanke und nicht auf den Zustand gehen sollte, sonst addiert er gern auch mehrfach. 2,4MHz schafft der aber in jedem Fall.
Z8 schrieb: > maximale Laufzeit 11 : Takte 20MHz / 11 -> 1,8 MHz > jetzt sind schon 2MHz mit einem ATmega 88 sbis und der jeweils nachfolgende Befehl brauchen zusammen jeweils 2 Zyklen, unabhängig davon, was das Ergebnis der Prüfung ist), damit wären wir schon bei 8 Zyklen, d.h. es geht :) Aber: Martin hätte wahrscheinlich gerne Flankentriggerung für den Takteingang, da sonst bei länger anliegendem aktiven Taktpegel der Wert unkontrolliert hochgezählt wird. Dann klappt es mit den 8 Zyklen doch nicht :(
@Z8 Im Programm ist der Wurm drin. Ein 8-Bit Port des ATMega8 soll als Eingangsport dienen, ein zweiter 8-Bit Port als Ausgangsport.
Helmut Lenzen schrieb: >> Bist du sicher, dass ein 16V8 einen 8-Bit Accumulator hinkriegt? >> Könnten die Terme eng werden. > > Das geht in einem 16V8 nicht rein. Habe ich vor Jahren schon mal > versucht. Schade. Ja, dann wird's wohl doch eher ein CPLD ala XC9536 werden, das aber eigentlich schon wieder etwas oversized ist.
Martin H. wrote: > Es würde mit zwei 4-Bit Addierern 74HCT83 und einem 8-Bit Latch 74HCT573 > gehen. Aber ab drei Bausteinen beginnt ja schon ein "TTL-Grab". Den 74HC83 wirst du schlecht kriegen, eher schon den 74HC283. Und den 74HC273 als Register. Der '573 hat erstens kein Reset und ist zweitens ein transparentes Latch was hier nicht sehr hilfreich ist. Und ein CPLD tut das zwar auch, aber in diesem Fall ist das "CMOS Grab" wohl doch einfacher.
1 | .include "m32def.inc" |
2 | .def akku = r17 |
3 | .def reg = r16 |
4 | #define data PORTD |
5 | #define output PORTC |
6 | |
7 | .org 0x0 |
8 | rjmp init |
9 | .org INT0addr |
10 | rjmp reset |
11 | .org INT1addr ; 4 - 5 Takte Interupt |
12 | in reg, data ; 1 |
13 | add reg, akku ; 1 |
14 | out output, akku ; 1 |
15 | ;-------------------------- |
16 | ; max 8 Takte |
17 | |
18 | loop: |
19 | sei |
20 | rjmp loop |
21 | |
22 | |
23 | init: |
24 | // Init Interupts |
25 | // Enable Interupts |
26 | |
27 | reset: ;4-5 Takte Interrupt + 2 rjmp |
28 | clr akku ;1 Takt |
29 | ;---------------------- |
30 | ; max 8 Takte |
31 | out output, akku ; 1 |
32 | sei |
33 | nop |
34 | rjmp loop |
Braucht nen AVR mit 2 vollständigen 8 bit Ports und die Bereitschaft so ein wirres Programmkonstrukt einzusetzen... Takt liegt dabei auf INT1 und reset auf INT0, der Mega32 sollte 20MHz noch schaffen ;) Martin H. wrote: > 20 MHz / 2,4 MHz = 8 1/3 Takte Bleiben noch 1/3 Takte über :) Wen man ICP oder PCINT nuzt kann man das clear noch da mit reinquetschen falls einem die verzögerung der ausgabe um maximal einen Takt zu lange ist beim Reset...
@ Martin H. (Gast) >Nach einem Takt wird der 8-Bit Eingangswert zum Registerinhalt addiert >und auf dem Ausgang ausgegeben. Der Reseteingang setzt das Register auf >Null. Sag mal lieber was du im Grossen und Ganzen machen willst. Dann kann man nämlich auch viel bessere Tips geben. MfG Falk
@Läubi: Bischen ungünstig daran ist, dass der Stack munter im ganzen Datenadressraum reihum reinschreibt. Alles wird ohne Rücksicht auf Verluste platt gebügelt, egal ob RAM, Register oder I/O. Einen weiterer Befehl für die Re-Inititialisierung von SP sollte schon sein.
spess53 wrote:
> Als TTL/CMOS mit Sicherheit nicht.
Gegeben hat das mal, 4bittig allerdings. '482 und '681 beispielsweise.
Sind aber heute allenfalls noch in irgendeinem Museum zu finden. Der
SN74S482 dürfte in manchen Minicomputern der 70er gesteckt haben.
@Läubi: Die Idee mit dem nicht zurückkehrenden Interrupthandler finde ich etwas hackish, aber cool :) Der Einwand von A. K. ist aber nicht ganz unbegründet, da im Adressraum des RAMs eben auch die I/O- und Datenregister liegen. Von der Zeitdauer bin ich mir auch nicht ganz sicher, ob das klappt: Der Interrupthandler braucht für IN, ADD, OUT und SEI 4 Zyklen. Im Datenblatt steht: "The instruction following SEI will be executed before any pending interrupts." Also wird auch der RJMP (2 Zyklen) noch vor dem nächsten Interrupt ausgeführt. Erst jetzt kommt der eigentliche Interrupthandler-Aufruf, der noch einmal 4 Zyklen dauert. Das macht zusammen 10 Zyklen, oder habe ich mich vertan?
> Das macht zusammen 10 Zyklen, oder habe ich mich vertan?
Edit: Du kannst natürlich den SEI vor den OUT schreiben, dann sollte
zumindest dieses Problem behoben sein :)
Edit 2: Bei 8 Zyklen für die vollständige Ausführung eines Interrupts hat man ja noch 0,33 Zyklen übrig. Diese könnte man dazu nutzen, in einem periodischen Timerinterrupt mit relativ großer Periodendauer den Stackpointer (zumindest dessen H-Byte) zurückzusetzen. Dann ist zwar die Verzögerungszeit nicht mehr konstant, aber im Mittel können die 8,33 Zyklen eingehalten werden. Ich gebe aber keine Garantieo darauf, dass das wirklich funktioniert ;-)
Edit 3: Das Rücksetzen des Stackpointers muss nicht in einem Timerinterrupt, sondern kann auch einfach zwischen dem OUT und der Endlosschleife im INT1-Handler geschehen. Dort vergrößert das Rücksetzen die Verzögerungszeit überhaupt nicht.
> .org INT1addr ; 4 - 5 Takte Interupt
Es Dauert zwar 4-5 Takte bis man dort ist, aber wenn man in der ISR kann
ja schon der nächste Takt kommen, damit sollte auch noch seit für ein
RETI sein.
prx schrieb: >Gegeben hat das mal, 4bittig allerdings. '482 und '681 beispielsweise. >Sind aber heute allenfalls noch in irgendeinem Museum zu finden. Der >SN74S482 dürfte in manchen Minicomputern der 70er gesteckt haben. 74LS181 gibt es bei Angelika (0,87 EUR) MfG Rainer
Jo, aber das bringt nichts, dem '181 fehlt das Register. Im '482 ist es drin.
>Autor: Martin H. (Gast) >Datum: 27.04.2009 16:50 >@Z8 >Im Programm ist der Wurm drin. Ein 8-Bit Port des ATMega8 soll als >Eingangsport dienen, ein zweiter 8-Bit Port als Ausgangsport. kleingeist. :)
ja okay das mit dem SP stimmt... aber man kann halt im Main oder so da noch was reinbauen könne, war mehr ein proof of concept ;) nach dem sei könnte auch noch ein oder mehrer nops stehen ich frag mich eher wozu man so ein akku register nutzen will... reti könnte man auch nutzen kostet anstelle des sei... Alternativ könnte man auch den reset an reset vom AVR anschließen und den AVR mit dem X-fachen Takt takten wenn man eh taktsyncron zu einem System arbeiten will macht eine Flankenerkennung ja nicht unbedingt sinn
Hi Läubi .., hab ich nicht verstanden. ! Ich kommentiere mal alle Befehle, die normal nicht ausgefüht werden aus. lLoop: in reg, datenINport ; 1T sbis statusport, takt ; 2T add reg, reg ; 1T sbis status, reset ; 2T ; clr reg, reg ; 1T out datenOUTport, reg ; 1T rjmp lLoop ; 2T 20 MHz / 9 Takte -> 2,23 MHz Das normale Aufsummieren geht mit 2,2MHz. Schade, reicht immer noch nicht ! :(
1 | lLoop: |
2 | in reg, datenINport ; 1T |
3 | sbis statusport, takt ; 2T |
4 | add reg, reg ; 0T (bereits in sbis "drin") |
5 | out datenOUTport, reg ; 1T |
6 | rjmp lLoop ; 2T |
7 | ;----------------------------------------- |
8 | ; 6 Takte |
sbis braucht 2(resp 3 bei 2 Word Befehlen) Takte wenn die Bedingung gilt (skip wird ausgeführt) sonst einen Takt. d.h. ein Takt ist doppelt gezählt! Ohne das rjmp sind es zudem nur 8 Words, wenn du also einen Proz nimmst der ein vielfaches von 8 Words hast, kannst du einfach den ganzen Flasch vollschreiben, am ende gehts automatisch wieder vorne los. macht dann nurnoch 4 Takte (Register sind nach dem Reset Defaultmäßig 0, einziges problem: Konfiguration in/out)
Hi Läubi .. (laeubi), dann haben wir es doch :) -> M48/88 Herzlichen Dank Z8
Achso und wegen dem X-fachen Takt...
1 | loop: |
2 | in reg, datenINport ; 1T |
3 | add reg, reg ; 1T |
4 | out datenOUTport, reg ; 1T |
5 | rjmp loop ; 2T |
Wenn du jezt den AVR an eine Taktquelle anschließt die den 5 fachen Takt deines Systems hat, dann läuft der AVR Syncron zu deinem Systemtakt und du kannst in jedem Takt eine akkumulation machen, dann natürlich auch keine Pause machen (außer du spendierst noch nen Clockenable in irgeneiner weise ;) )
Eine Frage blieb noch unbeantwortet: Ob die Reaktion auf Reset sich in den 2,4MHz Takt synchron einfügen muss, oder ob das eher eine Initialisierung mit reduzierter Zeitbedingung ist. In letzterem Fall kann man das aus der Schleife rausnehmen und direkt den Reset-Anschluss des Controllers verwenden.
Z8 wrote: > Hi Läubi .. (laeubi), > > dann haben wir es doch :) -> M48/88 > Herzlichen Dank Z8 Der M88 hat aber nicht zwei "volle" 8-bit Ports! Ohne die Anwendung für das ganze zu kennen ist es aber eh etwas müßig ;)
Macht der Controller doch schon selber. Ist nur nicht ganz so schnell.
Martin H. wrote: > Gibt es einen Baustein (5 V, TTL-Pegel) mit den folgenden Eigenschaften: > > 8 Eingänge > 8 Register > 8 Ausgänge > 1 Takteingang > 1 Reseteingang > > Nach einem Takt wird der 8-Bit Eingangswert zum Registerinhalt > addiert und auf dem Ausgang ausgegeben. Der Reseteingang > setzt das Register auf Null. möglicherweise tun es ja auch 2 Stück LS385 (mit der richtigen Verdrahtung): 8 Eingänge: Input A 8 Register: SUM FlipFlop 8 Ausgänge: naja, die Ausgänge der SUM FFs eben 1 Takteingang: CLK 1 Reseteingang: CLR S/_A auf Low Eingang B0 auf Low Eingänge B1..B7 mit jeweiligem Ausgang A des niederwertigeren Bits verbinden (A0..A6)
@Holger T. Du hast recht, zwei LS385 erfüllen die Funktion. Es sieht aber so aus, daß der Baustein nicht an jeder Ecke zu haben ist.
Viel Spass mit dem '385. Das gibt ein sehr interessantes Resultat. Ähnelt etwas einem Schieberegister. Da passiert nämlich auch dann etwas, wenn a=0 aber q!=0. Das ist sind 4 einzelne serielle Addierer mit internem Übertrag aus dem Vortakt, keine Volladdierer plus Register.
Hi Es gibt noch eine andere Möglichkeit: 64k- EPROM und Register. Acht Adressleitungen werden mit den Registerausgängen und die anderen acht mit den EPROM-Ausgängen verbunden. Die entsprechenden Speicherstellen enthalten die zugehörigen Summen. Ein Reset liesse sich über das Register und OE und Pull-Down-Widerstände realisieren. Vielleicht noch nicht 100%-ig ausgegoren. Aber so in der Richtung. MfG Spess
Klar. Nur ist ein EPROM auch nicht kleiner als 2 Adder. Für Reset nimmst du das Clear vom 273 Register (asynchron) oder ein 128KB EPROM (synchron). Das Ergebnis gibt's in beiden Fällen am Register, nicht am EPROM.
Hi
>Nur ist ein EPROM auch nicht kleiner als 2 Adder.
Welche Adder? Soll er jetzt nun doch ein Museum ausrauben? Zumindest
lässt sich mein Vorschlag mit BEs realisieren, die in jeder besseren
Bastlerkiste rumliegen. Und Schnell genug ist es auch.
MfG Spess
Den 74HC283 gibt es auch ohne Raubzug, ganz banal bei Reichelt. Und ein paralleles (E)EPROM hat man heute eigentlich nur dann rumliegen, wenn man schon länger dabei ist, oder alten Kram ausschlachtet. Aber klar, wenn man das hat, und den nötigen Programmer, warum nicht.
Hi
>Den 74HC283 gibt es auch ohne Raubzug, ganz banal bei Reichelt.
Ok. Aber für die Aufgabenstellung langt das nicht ganz. Das ist dann
auch noch etwas Logik notwendwendig.
MfG Spess
> Das ist sind 4 einzelne serielle Addierer mit internem Übertrag aus > dem Vortakt, keine Volladdierer plus Register. @A.K. Du hast recht. Auch mein Beschaltungsvorschlag ist unsinnig - habe nochmal darüber nachgedacht. Also vergesst meinen Beitrag ganz schnell.
8 Bit getaktetes Register : 74364 2 * 4 Bit Volladierer: 74283 Das hier mit einm µC zu lösen ist vergleichbar emit die 200m bis zum Bäcker mit dem Auto zu fahren. Es geht aber ........
Ralph wrote: > Das hier mit einm µC zu lösen ist vergleichbar emit die 200m bis zum > Bäcker mit dem Auto zu fahren. Ist ähnlich wie Kreuzworträtsel lösen. Meistens ziemlich sinnfrei, kann aber Spass machen. Manchen macht es auch Spass, 12 Leute in einen Kleinwagen zu quetschen. So darfst du das betrachten.
> Schade. Ja, dann wird's wohl doch eher ein CPLD ala XC9536 werden, das > aber eigentlich schon wieder etwas oversized ist. Ich fasse es nicht! Das Ding kostet mich bei Abnahme von 160 Stück (1 Tray) 70 ct, was schon teuer sein dürfte. Im Einzelhandel wird er vielleicht das dreifache kosten. Dafür spart er Leiterplattenfläche, Verdrahtung und die Beschaffung von Uralt-Logikgattern. Das Ding addiert in Windeseile und nicht so lahmarschig wie ein Prozessor. Außerdem macht die Implementierung des Entwurfs in den Stein wesentlich mehr Freude als das Leiterplattenmalen. Fehler werden durch Überprogrammieren behoben. Oh GOTT!
Bernd G. schrieb: >> Schade. Ja, dann wird's wohl doch eher ein CPLD ala XC9536 werden, das >> aber eigentlich schon wieder etwas oversized ist. > > Ich fasse es nicht! > ... > Oh GOTT! Jetzt aber :) Warum denn so fassungslos? Lies noch einmal meinen Beitrag von oben durch. Ich hatte den XC9536 weder mit Uralt-Logikgattern noch mit lahmarschigen Prozessoren verglichen. Das "schade" bezog sich vielmehr darauf, dass man die Aufgabe nicht mit einem 16V8-GAL lösen kann, das von der Anzahl der Ein- und Ausgänge exakt passen würde und bzgl. Kosten, Leiterplattenfläche und -layout eindeutig Vorteile gegenüber dem XC9536 hätte. Von den Fähigkeiten des XC9536 wird hier nur ein Bruchteil genutzt, deswegen schrieb ich "etwas oversized", womit ich aber nicht ausdrücken wollte, dass es keine sinnvolle Lösung ist. Ob letztendlich das CPLD oder die drei Logik-ICs das Optimum darstellen, hängt davon ab, ob man dem Platzbedarf oder den Kosten den Vorrang gibt (beim XC9536 sind auch die Kosten für die Programmierung zu berücksichtigen).
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.