PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Takt an Eingang halbieren und an anderem Port augeben



Accenter
01.09.2008, 10:43
Ich brauche zur synchonisierung einer alten Drummashine eine 2:1 Teilung.

Ich habe das mit debounce und toggle versucht was auch klappt jedoch läuft es da nicht immer synchron.

Clocksync ist der Eingang eines Ports, Taktout der Ausgang.

Teilung:
Debounce Clocksync , 0 , Toggler, sub
Goto Teilung

Toggler:
toggle Taktout
Return

Welche andere Möglichkeit habe ich den Takt 2:1 zu teilen? Da das Programm nichts weiter zutun hat als die Teilung zu realisieren sollte das auch ohne Timer gehen oder?

uwegw
01.09.2008, 11:16
Wenn das Signal sauber ist und nicht entprellt werden muss, ist ein AVR damit schon deutlich unterfordert. Am simpelsten wäre wohl ein externer Interrupt, der zb auf der steigenden Flanke auslöst und dann jedesmal den Ausgang toggelt. Ließe sich genausogut mit nen bisschen Logikgattern bauen.

Die Frequenz dürfte ja einige Hundert Hz nicht überschreiten, nehme ich bei Drummachine mal an...

Accenter
01.09.2008, 11:38
Das Signal ist sauber und muß nicht entprellt werden. Es gibt noch kleine Zusatzaufgaben wie Triggern der Start und Stoptaste usw. Nur eine reine Taktteilung ist es also nicht drum scheiden Logikgatter aus.

Hast du nen Code für mich als Beispiel? Es läuft zwar mit Debounce und Toggle auch jedoch hängt es vom Zufall ab ob alles wirklich schön bei der 1 startet und sich synchronisiert.

PicNick
01.09.2008, 12:29
Das Halbieren wäre an sich einfach, da wär' z.B. "toggle" schon ok.

Aber um immer eine bestimmte At-First position zu haben, müßte man entweder START oder STOP auch erkennen.
eventuell ein einfaches Time-Out ?
d.h. wenn eine Sekunde gar nix kommt --> STOP


EDIT: Wenn wieder die MIDI-GEschichte ist, da gibt's ja start-stop und clock ?

Accenter
01.09.2008, 13:13
Läuft nicht über MIDI sondern DIN/SYNC. Das ist so beschaltet: Start/Stop (high= start, low=stop) dann Masse und natürlich noch das Clocksignal. Nach 6 high/low Übergängen wird ein Step weiter geschalten. Ich hab hier nun ein Gerät welches keine DIN/SYNC Buchse hat. Ich habe eine DIN/SYNC Buchse eingebaut und benötige nun den empfangenen Takt halbiert.

Wenn nun also start/stop von low auf high geht (externes Gerät wurde gestartet) trennt mir der Atmel den internen Takt auf und verarbeitet nun das Signal welches extern kommt (muß aber halbiert werden). Gleichzeitig sendet es einen kurzen high impuls an die Starttaste. Stopt man den externen Takt wird ein kurzes Stop gesendet an die Stoptaste und das Programm geht wieder in den 1:1 Durchschleifbetrieb. (interner Takt des Drumcomputers).

Die ganze Ansteuerung funktioniert jedoch startet alles abundzu verzögert. Es läuft dann im Takt mit aber nicht sauber auf der 1. das passiert selten aber abundzu eben doch.

Ist ein Interrupt also nötig? Das ganze läuf auf einem Mega8 mit internen 8Mhz Takt.

PicNick
01.09.2008, 13:42
Glaub garnicht, daß du einen Interrupt brauchst.
Du mußt nur dauernd die Pins auf Flanken checken und dem entsprechend den Grundzustand bestimmen und aus dem zusammen dann die Outputs setzen.
Ev. für die Output-Start-Stops einen Timer beschäftigen, damit die Signallänge passt.

Da sollte es eigentlich dann keine vernudelten 1-er geben.

Accenter
01.09.2008, 14:39
Wie überprüfe ich die Flanken? Hast du da ein Beispiel für mich Robert? Das mit dem Start/Stop klappt ganz gut aber ich teste das mal mit einem Timer... wäre toll wenns nur daran liegt.

python_rocks
01.09.2008, 15:03
Ich brauche zur synchonisierung einer alten Drummashine eine 2:1 Teilung.
Hallo Accenter!

Ich habe mir jetzt die anderen Beiträge noch nicht durchgelesen. Mich hat nur das Wort "Teilung" angesprungen, weil ich vor Kurzem etwas darüber geschrieben habe. Vielleicht kannst du damit etwas anfangen. http://halvar.at/elektronik/kleiner_bascom_avr_kurs/timer0_als_counter/

mfg
Gerold
:-)

PicNick
01.09.2008, 16:08
Flanken erkennt man einfach daran, dass sich der vorherige Zustand vom aktuellen unterscheidet.
Nach dem Check wird der aktuelle Zustand zum "vorherigen".
Steigend ist, wenn der alte Zustand =0 war und der neue=1

programmtechnisch kann man das verschieden lösen, je nach Umfeld.

In deinem Fall stellt der Zustand"alt" zusätzlich ja auch den Betriebsmodus dar (0= Bypass, 1=Sync)

Persönlich würde ich also Alt/Neu zu einer Zahl 0-3 kombinieren und einfach vier verschiende Sub-Programm anspringen


01---> Start --> Start Signal=1, Hold-Counter starten, clock 2:1
11---> Sync---> clock 2:1, Hold-counter runterzählen (bei 0 Start-Signal=0)
10---> Stop --> Stop Signal=1, Hold-Counter starten, clock 1:1
00---> Bypass> Hold-counter runterzählen (bei 0 Stop-Signal=0) , clock 1:1

Wie gesagt, man könnte auch einen Timer für das "Hold" beschäftigen
Den würde man beim Status-wechsel enablen, und der setzt einfach beide Start + Stop Output auf NULL, es kann ja nur bei einem ein 1-er gewesen sein. dann disabled er sich selbst.

Accenter
02.09.2008, 13:15
Mein Programm läuft wie es ist eigentlich super. Das einzige Problem ist, dass es abundzu verspätet startet. Das liegt scheinbar aber am debounce und toggle... wenn ich den Takt ohne Teilung durchreiche, läuft es mit der doppelten Geschwindigkeit aber exakt im Timing. Gibt es in Bascom einen Befehl um die Flanken austzuwerten oder muß ich das mit Flag-Bits machen?

PicNick
02.09.2008, 16:11
Na, so direkt, glaub ich, ist da nix.
PULSEIN will eigentlich die Pulsdauer messen,
DEBOUNCE nimmt den Input sozusagen zweimal (um zu debouncen)

Ich denke aber, dass normale Bascom-Befehle in deinem Falle schnell genug sein könnten

Angenommen, du checkst PIND.6 auf flanke


DIM stateold AS BYTE
DIM statenew AS BYTE

DO

statenew = PIND AND &H40 ' Bitmaske zu Bit# 6
IF statenew <> 0 AND stateold = 0 THEN
GOSUB steigende_flanke
END IF
stateold = statenew

LOOP