Ich habe hier das Innenleben eines relativ teuren Digital-Pianos. Es besteht aus der Tastenmechanik und Platinen zum auslesen der Tastenanschläge. Ich habe die Schaltung soweit entschlüsselt. Siehe Bild. Die Platinen sitzen über der Tastenmechanik. Dazwischen sitzt eine Gummimatte mit einer leitenden Schicht. Das Prinzip ist genau so wie bei einer IR-Fernbedienung. Die Tasten schlagen von unten gegen das Gummi und erzeugen so einen messbaren Kontakt. Jetzt hat JEDE der 88 Tasten 3 Kontakte über die "irgendwie" die Anschlaggeschwindigkeit gemessen wird. Drückt man die Klaviertaste langsam durch werden die Kontakte auch nacheinander ausgelöst. Drückt man z.B. Key1 aus der Schaltung wird zuerst SW1 aktiv, dann SW2 und zuletzt SW3. Um Kabel zu sparen (was durchaus sinnvoll ist, bei der Menge an Kontakten) "hängen" immer 4 Tasten zusammen an einer Leitung. Ich habe nur 4 Tasten gezeichnet. Der Rest wiederholt sich praktisch nur noch (22 mal). V1 bis V3 und G1 bis G4 gehen gleichermaßen an alle anderen Blöcke / Transistoren. 4 Tasten (12 Kontakte) müssen also immer gescannt werden. Wenn man so eine Klaviertaste anschlägt geht das schon recht schnell. Der zeitliche Differenz bis alle drei Kontakte aktiv sind dürften nur einige ms betragen. Nach der langen Vorrede hier meine eigentliche Frage. Wie würdet ihr die Transistoren ansteuern um die Anschlaggeschwindigkeit möglichst exakt zu messen? Welche Spannungen, Frequenzen und welche Abtastlogik wären sinnvoll? Beim Original kann ich leider nicht mehr Nachmessen. Nachtrag: Theoretisch würden auch zwei Kontakte pro Taste ausreichen um die Anschlaggeschwindigkeit zu messen. Warum hier 3 Kontakte verwendet wurden kann ich mir auch nicht erklären. Hat jemand eine Idee?
Es reicht, zunächst nur SW1 von allen 4 Tasten parallel zu erfassen (das wird man aber im Multiplex mit den 21 anderen Tastenblöcken machen). Wenn das Keyboard mit MIDI ausgestattet ist, ergibt sich sowieso eine eher langsame Samplefrequenz, 100us Abtastzeit pro Tastengruppe ergibt 2.2ms, sollte reichen. Erst wenn eine Taste SW1 gedrückt wurde, müssen SW2 und SW3 mit erfasst werden. Bei 10us Multiplexrate sollte aber auch dauernde Miterfassung kein Problem sein, 0.66ms für alle.
Sven K. schrieb: > Warum hier 3 Kontakte verwendet wurden kann ich mir auch nicht erklären. > Hat jemand eine Idee? Vielleicht will man die Beschleunigung messen. Beschleunigung ist die Änderung von zwei Geschwindigkeitsmessungen. Drei Tasten ermöglichen zwei Messungen. Sven K. schrieb: > Theoretisch würden auch zwei Kontakte pro Taste ausreichen um die > Anschlaggeschwindigkeit zu messen Theoretisch müsste ein Taste reichen indem man den Widerstand misst. Durch das Zusammendrücken des Tastengummis müsste der Widerstand kleiner werden.
:
Bearbeitet durch User
Gerald K. schrieb: > Theoretisch müsste ein Taste reichen indem man den Widerstand misst. > Durch das Zusammendrücken des Tastengummis müsste der Widerstand kleiner > werden. Da hast du aber nur die Anschlagskraft, nicht -geschwindigkeit. Außerdem schwankt wahrscheinlich der Widerstandswert insgesamt zu stark, als dass das ein sinnvolles Maß ist. Ansonsten wird deine Variante, dass man nicht nur Geschwindigkeit sondern auch Beschleunigung erfassen kann, schon hinkommen. Die Anschlagdynamik so eines e-Pianos unterscheidet sich schon von dem einfacher Keyboards (die vermutlich wirklich nur die Kraft messen).
Jörg W. schrieb: > Da hast du aber nur die Anschlagskraft, nicht -geschwindigkeit.
Die Beschleunigung ist proportional zur Kraft. Jörg W. schrieb: > Außerdem schwankt wahrscheinlich der Widerstandswert insgesamt zu stark, > als dass das ein sinnvolles Maß ist. Die Frage ist anderseits wie genau die Werte sein müssen um den Zweck zu erfüllen. Es ist auch bei einem realen Klavier schwierig über alle Tasten den gleichen Anschlag zu erzielen. Die Frage ist welchen Einfluß das Feedback zwischen Anschlagmotorik und Klangempfinden besteht. Der Klavierspieler kann sich mit der Zeit darauf einstellen.
:
Bearbeitet durch User
Gerald K. schrieb: > Die Beschleunigung ist proportional zur Kraft. Der Gummi misst aber die Bremskraft, nicht die Beschleunigungskraft. OK, die hängt von der Geschwindigkeit ab (insofern war meine obige Aussage falsch), aber die Beschleunigung selbst kannst du so nicht messen. Klar kann ein guter Pianist auch mit einem simplen Keyboard gut spielen, aber das Anschlagsgefühl auf einem ordentlichen e-Piano ist schon ein anderes. Da spielt aber nicht nur die Elektronik eine Rolle, sondern auch die mechanische Gestaltung (Nachbildung realer Klaviertasten, bei denen man eine größere Masse über Hebel beschleunigt).
Sven K. schrieb: > Warum hier 3 Kontakte verwendet wurden kann ich mir auch nicht erklären. > Hat jemand eine Idee? Nur die Geschwindigkeit ist relevant, sie ist das Ergebnis (Integral) einer beliebigen Beschleunigung des Hammers. Dafür reichen SW 2 und 3. SW 1 könnte dann dafür sein, wie lange die Taste gedrückt ist/Nachhall. Beim Klavier hat das ja auch einen "eigenen Druckpunkt".
A. S. schrieb: > SW 1 könnte dann dafür sein, wie lange die Taste gedrückt ist/Nachhall. > Beim Klavier hat das ja auch einen "eigenen Druckpunkt". Das ist ein guter Hinweis. Es könnte tatsächlich der Punkt sein, bei dem bei einem echten Klavier der Dämpfer von der Saite genommen bzw. wieder aufgesetzt wird. SW1 müsste also hauptsächlich beim Loslassen berücksichtigt werden. Mit SW2/SW3 wird dann die Geschwindigkeit gemessen.
Die drei Kontakte sind eher dazu da, um die Repetitionsmechanik eines echten (besseren) Flügels zu emulieren. Bei dem muss man die Taste nicht ganz loslassen (und damit auch die Dämpfer auf die Saite senken) um die Mechanik zu "resetten" und nochmal anschlagen zu können. 3 Kontakte damit man auch von der "Mittelstellung" noch die Geschwindigkeit messen kann. Gruß, Christian
Sven K. schrieb: > Warum hier 3 Kontakte verwendet > wurden kann ich mir auch nicht erklären. Hat jemand eine Idee? Ist für das Loslassen der Taste wichtig. Mit dem Mittelkontakt wird der virtuelle Dämpfer bedient.
Ich rate mal, dass das dahinterstehende Prinzip folgendes ist: Schlägt (in diesem Falle) der Taster auf das Gummi, so wird der Hauptimpuls für die Erfassung ausgelöst. Die anderen zwei Taster werden wohl so angeordnet sein, dass sie minimal später "aufschlagen". Aus diesen Zeiten kann man wohl ermitteln, wie stark angeschlagen wurde. Im Extremfall wird wahrscheinlich nur der erste oder höchstens der zweite Taster aktiv. Soll die Nachbarn schonen. oder auch nicht.
Sven K. schrieb: > Jetzt hat JEDE der 88 Tasten 3 Kontakte über die "irgendwie" die > Anschlaggeschwindigkeit gemessen wird. Normalerweise bei 3 Punkt-Kontakten wird tatsächlich eine Anäherungslogik damit bedient. Bedeutet: SW1-SW2 = Anschlagzeit SW2-SW3 = Aufschlaghärte Häufig werden da DSP's von DREAM verwendet. In der Scannrutine werden für alle 88 Tasten "Register" definiert, wo dann diese werte Abgelegt werden. Nach jedem Scanndurchgang wird Letzter Scan mit dem Nächsten Scann verglichen, und so dann ein "Ton" daraus generiert. Ist jetzt sehr stark vereinfacht, aber bei DREAM gibt es fertige "Tools" zum Download um das zu Berechnen. Es gibt aber auch Varianten wo SW3 als Aftertouch verwendet wird, bei Pianos aber eher selten ;-) PS Wir stellen Pianos her die genau so funktionieren, allerdings verwenden wir kein DREAM Chips mehr sondern haben da mittlerweile PGA's oder MCU's dazu ;-)
:
Bearbeitet durch User
Sven K. schrieb: > 4 Tasten (12 Kontakte) müssen also immer gescannt werden. Wenn man so eine > Klaviertaste anschlägt geht das schon recht schnell. Der zeitliche > Differenz bis alle drei Kontakte aktiv sind dürften nur einige ms > betragen. Warum? Ist es nicht einfacher erst alle anzusteuern und dann zu prüfen welche S1 gedrückt wurde? Das Prinzip ist Open Collector da bietet sich das an. Der Mensch hat auch nur 10 Finger mit begrenzter Reichweite und kann nicht alle gleichzeitig drücken. Daher muss man entferne Gruppen auch nicht prüfen (Ausnahmen kann man später machen).
Mucky F. schrieb: > Warum? Ist es nicht einfacher erst alle anzusteuern und dann zu prüfen > welche S1 gedrückt wurde? Das Prinzip ist Open Collector da bietet sich > das an. Es ist Einfacher Permanent alles zu Scannen, und bei Kontakt ein Register zu setzen das die Zeit zählt als den Scannforgang zu Unterbrechen wenn ein Kontakt geschlossen ist. Da müsstest du ja jedesmal einen Interrupt aufrufen und in ein Unterprogramm springen ?!? Sehr Häufig wird auch die Scannleitungen für bspw. LED Mitverwendet, so dass der Scann immer gleichbleibend ist und die LED's nicht bei gedrückten Tasten anfangen zu Flimmern...
Patrick L. schrieb: > SW1-SW2 = Anschlagzeit > SW2-SW3 = Aufschlaghärte Was wäre denn die Entsprechung bei einem echten Piano? Was ist Anschlagzeit?
Patrick L. schrieb: > Häufig werden da DSP's von DREAM verwendet. > In der Scannrutine werden für alle 88 Tasten "Register" definiert, wo > dann diese werte Abgelegt werden. > Nach jedem Scanndurchgang wird Letzter Scan mit dem Nächsten Scann > verglichen, und so dann ein "Ton" daraus generiert. > > Ist jetzt sehr stark vereinfacht, aber bei DREAM gibt es fertige "Tools" > zum Download um das zu Berechnen. Das ist sehr interessant. Was mich dazu noch interessiert: Mit welchen Frequenzen werden denn die Tasten abgescannt?
Patrick L. schrieb: > Es ist Einfacher Permanent alles zu Scannen, und bei Kontakt ein > Register zu setzen das die Zeit zählt als den Scannforgang zu > Unterbrechen wenn ein Kontakt geschlossen ist Hab das nur überflogen aber evtl. wird bei dieser Schaltung nicht gescannt, könnte der Sinn dieser Anordnung sein. Bei diesen langen Leitungen und der hohen Anzahl von Tasten hast du sonst Probleme mit der Abstrahlung.
A. S. schrieb: > Was wäre denn die Entsprechung bei einem echten Piano? Was ist > Anschlagzeit? Damit wird indirekt die Anschlaghärte gemessen. Diese wiederum beeinflusst die Lautstärke. Der dritte Taster ist für das Dämpfung der Seiten. Wenn der Pianomann die Taste unten hält.
Patrick L. schrieb: > Normalerweise bei 3 Punkt-Kontakten wird tatsächlich eine > Anäherungslogik damit bedient. > Bedeutet: > SW1-SW2 = Anschlagzeit > SW2-SW3 = Aufschlaghärte Bin jetzt auch verwirrt was hier was ist. Im Englischen wird die Anschlagstärke als Velocity bezwichnet. Das ist auch die richtige Charakterisierung. Die Geschwindigkeit, mit der der Hammer aus die Saite trifft bestimmt die Lautstärke und damit gleichzeitig den Klang. Was soll jetzt die Anschlagszeit im Gegensatz dazu sein wenn die Velocity mit den Kontakten 2 und 3 gemessen wird? Die Velocity könnte man genauso zwischen SW1 und SW2 messen. Christian Erker schrieb: > Die drei Kontakte sind eher dazu da, um die Repetitionsmechanik eines > echten (besseren) Flügels zu emulieren. Bei dem muss man die Taste nicht > ganz loslassen (und damit auch die Dämpfer auf die Saite senken) um die > Mechanik zu "resetten" und nochmal anschlagen zu können. > > 3 Kontakte damit man auch von der "Mittelstellung" noch die > Geschwindigkeit messen kann. So kommt's hin. Solange SW1 gedrückt ist wird der Dämpfer nicht abgesenkt (der Ton also nicht bedämpft) und man kann einen weiteren Anschlag mit SW2, SW3 messen. Danke
Gerhard Z. schrieb: >> SW1-SW2 = Anschlagzeit >> SW2-SW3 = Aufschlaghärte > > Bin jetzt auch verwirrt was hier was ist. Braucht es zur Betätigung der Schalter eventuell unterschiedliche Kräfte?
Sven K. schrieb: > Das ist sehr interessant. Was mich dazu noch interessiert: Mit welchen > Frequenzen werden denn die Tasten abgescannt? 200kHz hat aber damit zu tun dass man die LEDs nicht Flimmern sieht Die Routine ist Timer gesteuert, das die Optische so wie auch die Zeit zwischen den SW1~SW3 konstant ist. Zur Gedankenstütze mal Auszüge aus den Scann-Routinen:
1 | SetupOsc bic.b #OFIFG,&IFG1 ; Clear OSC fault flag |
2 | mov.b #RSEL0,&BCSCTL1 ; Set to 5MHz XTAL+XTS |
3 | mov.w #0FFh,R15 ; R15 = Delay |
4 | SetupOsc1 dec.w R15 ; Additional delay to ensure start |
5 | jnz SetupOsc1 ; |
6 | bit.b #OFIFG,&IFG1 ; OSC fault flag set? |
7 | jnz SetupOsc ; OSC Fault, clear flag again |
8 | bis.b #SELM_2+SELS,&BCSCTL2 ; MCLK= LFXT2/SCLK= LFXT2 |
9 | .
|
10 | .
|
11 | ; Timer A3 200KHz Devinitions ************************************** |
12 | ; As coded with TACLK= HF XTAL = 5MHz, I²C toggle rates are: |
13 | ; CCR0 = 5MHz/(25) = 200kHz one Clockphase |
14 | clr.w &TAR ; Reset Timer A3 |
15 | mov.w #Bitime,&TACCR0 ; Set 10uS Clocktime |
16 | mov.w #Bitime_5,&TACCR1 ; set 5us Clokphasetime |
17 | mov.w #Bitime_5,&TACCR2 // set 2nd Clockphase of Headbus_R CHANGE V1.9c! |
18 | SetupC0 mov.w #OUTMOD_4,&TACCTL0 ; CCR0 toggle, interrupt enabled+CCIE |
19 | SetupC1 mov.w #OUTMOD_0+OUT+CCIE,&TACCTL1 ; CCR1 SET, interrupt enabled |
20 | SetupTA mov.w #TASSEL_2+MC_1,&TACTL ; MCLK, contmode, interrupt+TAIE+MC_1 |
21 | /**/
|
22 | ; Startup of Scanregister Devinitions ****************************** |
23 | SYSinit bis.b #PK_SCL,&P2DIR ; Set to output, SCL = 0 |
24 | bis.b #PK_SCL,&P2OUT ; Set to input, SDA = 1 due to pull-up |
25 | mov.b #008h,BitCnt ; Initial [R12] Display Scanadress |
26 | mov.b #11111110b,&ScnPos ; Initial Scanposition (Invert) |
27 | FillLoop mov.b #000h,ALROW0-1(BitCnt) ; (F0)Set SW1 Matrix Keybits |
28 | mov.b #000h,ILROW0-1(BitCnt) ; (F0)Set SW2 Matrix Keybits |
29 | mov.b #000h,PLROW0-1(BitCnt) ; (E0)Set SW3 Matrix Keybits |
30 | dec.w BitCnt ; ? : Count down Address and test if (-) |
31 | jc FillLoop ; No : Continue scan |
32 | mov.b #END_RAM-LEDmem,BitCnt ; YES : Set [R12] with Length of Registerspace |
33 | .
|
34 | .
|
35 | SC2Loop bit.b #040h,&P2IN ; ? : Scanline Activ? |
36 | jz SC2Loop ; No : Wait of Scanline activ |
37 | bic.b #010h,&P1DIR // " : NO : Clear the Bit |
38 | SC2NoK bit.b #008h,&P1MEM // YES : ? : KL-SCAN0 bit set? |
39 | jz SC2NoK0 // " : NO : Clear the Bit |
40 | mov.b &P4MEM,&P4DIR // " : YES : Set the Bit |
41 | mov.b &P5MEM,&P5DIR // " : YES : Set the Bit |
42 | bis.b #008h,&P1DIR // " : YES : Set the Bit |
43 | SC2NoK0 bit.b #2h,ILROW6 // " : YES : ? : Test ENHLED |
44 | //bit.b #2,&I2CFLAG // YES : ? : [ffff'xkcE] "c" Flag?
|
45 | jz SC2Loopnc // " : NO : Continue Scanning |
46 | push #Key2P5 // " : Save next Step to Stack |
47 | br #EXEC_MIDI // " : Execute Recived Command |
48 | SC2Loopnc clr.w RowCont ; YES : Initial(R5) Rowcounter (Scanline 1~7) |
49 | mov.w #01h,ScanLine ; " : Initial(R8) Scanline Bitvalue |
50 | |
51 | Scan2P6 mov.b Scan2MAP+1(R5),AdrCnt ; Set R10 with Adress of RAMBANK for Actual Scanline position
|
52 | bit.b R8,&P6IN ; Test Scanline on P6
|
53 | jnz Clr2P6 ; ? : If LED ON?
|
54 | Set2P6 bis.b Scan2MAP(R5),LEDmem(R10); YES : Set Bit in RAM
|
55 | jmp Nxt2P6 ; " : and Continue Scan |
56 | Clr2P6 bic.b Scan2MAP(R5),LEDmem(R10); NO : Reset Bit in RAM |
57 | |
58 | Nxt2P6 incd.b RowCont ; Count up Rowcounter(R5) by 2 for next MAP Adress |
59 | rlc.b ScanLine ; ? : Set next Scanline(R8) and Test 1st 8 Line scanned |
60 | jnc Scan2P6 ; NO : go next Scanline |
61 | mov.b #10h,ScanLine ; YES : Scann next 4 Bit on P5 |
Idee schrieb: > Braucht es zur Betätigung der Schalter eventuell unterschiedliche > Kräfte? Kann man so sagen stimmt aber nicht 100%, teilweise ist es tatsächlich so das der SW3 etwas mehr Kraft braucht um zu reagieren, ist aber Unterschiedlich ob er eine "Aftertouch" Funktion hat oder eben den Druck des Hammers auf der Virtuellen Seite emulieren soll. Das Bild zeigt das Schema im Auszug von Controller mit denen wir E-Piano und Orgeln nachträglich mit MIDI ausrüsten. Dort wird der Scan mit dem Scan des Instruments Synchronisiert und liegt je nach Gerät zwischen 50kHz~500kHz
:
Bearbeitet durch User
Mucky F. schrieb: > Damit wird indirekt die Anschlaghärte gemessen. Diese wiederum > beeinflusst die Lautstärke. Der dritte Taster ist für das Dämpfung der > Seiten. Wenn der Pianomann die Taste unten hält. Du hast die Posts ja nicht gelesen. Wenn, dann muss, wie beschrieben, der erste Schalter die Dämpfung machen, da er als letzter geöffnet wird. Außerdem ging es um die Frage, worin der Unterschied zwischen "Anschlagzeit" und "Anschlaghärte" liegen soll, da beides Synonym ist. Die "Härte" kann nur über die Zeitdifferenz zweier Schalter gemessen werden.
Patrick L. schrieb: > 200kHz hat aber damit zu tun dass man die LEDs nicht Flimmern sieht > Die Routine ist Timer gesteuert, das die Optische so wie auch die Zeit > zwischen den SW1~SW3 konstant ist. Vielen Dank für die Internas. Für die LEDs dürften auch 200Hz ausreichen. Der Hohe Takt dürfte doch eher die Auflösung der Anschlagstärke bestimmen: Wenn da typisch 1ms zwischen liegt und ich das mit 1% auflösen möchte, dann brauche ich halt 200kHz.
A. S. schrieb: > Vielen Dank für die Internas. Gerne Geschehen man versucht ja am Verstehen zu Helfen A. S. schrieb: > Für die LEDs dürften auch 200Hz ausreichen. Ja das ist Richtig wenn sie Konstant sind Bei gewissen E-Pianos marke China sind es sogar oft 100 Hz. oder weniger auch gibt es Tatsächlich welche die es Per Interrupt abfragen wo man dann ganz deutlich der Anzeige ansieht wenn mehrere Tasten zeitgleich angeschlagen werden. Das A. S. schrieb: > dass man die LEDs nicht Flimmern sieht ist auch eher auf den Umstand des Timer Aufrufs gemeint. wobei selbst bei 200kHz sieht man wenn ein Interrupt plötzlich das LED so 30 Cyclen lang leuchten lässt bis der IRQ abgearbeitet wurde. Da die MIDI Daten in der Regel Velocity 0~255 [00~FF] übertragen hat sich da meistens die 200kHz durchgesetzt was für den @TO interessant sein dürfte. A. S. schrieb: > Wenn da typisch 1ms > zwischen liegt und ich das mit 1% auflösen möchte, Hast du ganz schön erklärt wobei die Zeit von SW2 und SW3 meistens nur noch mit 0~127 aufgelöst wird. Das hängt dann wieder vom verwendeten MIDI Format ab :-) A. S. schrieb: > Die "Härte" kann nur über die Zeitdifferenz zweier Schalter gemessen > werden. Auch das ist ganz schön erklärt. Die Geschwindigkeit ist das eine was hauptsächlich die Ton Lautstärke beim Piano ändert, die "Härte" macht aber Tatsächlich eine Klangänderung aus. Es gibt E-Pianos die mit Hall-Elemente Messen, wobei die dan meist auch richtige Hammermechanik haben und es gibt auch welche die mittels Piezo messen aber das ist dann eine andere Liga. Was für den TO auch interessant sein dürfte ist die Lösung wie man aus einem Bestehenden Scannprint das schon verbaut ist via MIDI eine Taste drückt, dazu angehängte Schema der Keymatrix einer Oktave.
:
Bearbeitet durch User
Um sich 3x88 Optokoppler zu Sparen, gehört dan die Blockmatrix dazu Siehe Schema. Wichtig ist natürlich dass das ganze Scansynchron läuft, weshalb man sich mit dem vorhandenen Scann synchronisieren muß.
Das Ganze ist komplizierter als man denkt: Aus dem Zeitintervall, das typischerweise zwischen 2ms und 80ms (je nach Anschlaghärte) liegt, muss, wenn das Signal über MIDI gesendet werden soll, eine von 127 Velocity-Werten ermittelt werden. Das könnte man mit Tabelle machen, aber man wird feststellen, dass man eine zeitliche Auflösung von deutlich unter 100µs braucht, um auch verschiedene sehr laute Anschläge noch gut aufzulösen. Sprich, man braucht mindestens einen 16-Bit-Timer und damit eine 64kByte große Tabelle. Ich habe das Ganze also ohne Tabelle realisiert auf einem Arduino mit 16MHz in Assembler. Ich habs nur mit größten Optimierungsanstrengungen hinbekommen. Und das war nur für zwei Kontakte. Für drei Kontakte braucht man definitiv eine viel leistungsfähigere CPU und will eigentlich auch kein MIDI mit seiner Reduktion auf 127 Velocity-Werte dazwischen haben, sondern die Tongeneratoren direkt ansteuern mit z.B. 1000 Velocity-Werten (mehr werden auch genutzt, sind aber weder vom Spieler noch vom Zuhörer zu unterscheiden).
Justin S. schrieb: > und damit eine 64kByte > große Tabelle. Nein die tabelle kanst du dir sparen, da reicht eine Calculation, da der Timer ja sehr konstant arbeitet ist die zeit "T" aucch sehr direkt mit einer einfachen Calculation machbar. Dazu hat der MSP430F145 eine MPY32 integriert, damit lässt sich das in Realtime berechnen ;-) Gut es sagt niemand dass es Einfach ist, aber halt machber. und ja alles im purem Assembler programmiert damit auch zuverlässig jedes Timing funktioniert.
1 | ; Flotingpoint MPY use ACC32 |
2 | GO_FP_MPY mov.w R4,&0130h ; Load first operand (XXxx) |
3 | mov.w R8,&0138h ; Load 2nd operand (YYyy) |
4 | mov.w &13Ah,&Sum0 ; Save the Loword of MPY |
5 | mov.w &13Ch,&Sum1 ; Save the Hiword of MPY |
6 | bit.b #80h,R6 ; ? : Floatingpoint MPY? |
7 | jz FPU_EXIT ; NO : Inteeger no EXP Byte used |
8 | tst.b R10 ; EXP Used? |
9 | jz FPU_EXIT ; NO : Inteeger no EXP Byte used |
10 | call #EXP_MINUS ; Set the Exponent |
11 | GO_INT_MPY |
12 | jmp FPU_EXIT |
13 | |
14 | go_div bit.b #80h,R6 ; ? : Floatingpoint MPY? |
15 | jz go_div_INT ; NO : Inteeger no EXP Byte used |
16 | tst.b R10 ; EXP Used? |
17 | jnz go_div_EXP ; NO : Inteeger no EXP Byte used |
18 | inc.b R10 |
19 | go_div_EXP mov.w R4,&0130h ; Load first operand xx |
20 | mov.w R10,&0138h ; Load 2nd operand |
21 | mov.w &13Ah,&Sum0 ; Save the Loword of MPY |
22 | mov.w &13Ch,&Sum1 ; Save the Hiword of MPY |
23 | go_div_INT push.w &Sum1 ; Highword of ACC32 |
24 | push.w &Sum0 ; Lowword of ACC32 |
25 | push.w R8 ; Exponent |
26 | call #DIVIDE |
27 | pop.w &Sum0 ; geht the Real value |
28 | |
29 | jmp FPU_EXIT |
30 | ; Flotingpoint MPY use ACC32 |
31 | |
32 | go_mov mov.w R4,Sum0 |
33 | |
34 | |
35 | FPU_EXIT ; Destination (YY) Test and Write Programm |
:
Bearbeitet durch User
Patrick L. schrieb: > Gut es sagt niemand dass es Einfach ist, aber halt machber. und ja alles > im purem Assembler programmiert damit auch zuverlässig jedes Timing > funktioniert. Hab schon lange keinen von Hand geschriebenen Assembler mehr gesehen. Aber bei 200kHz muss man schon aufpassen, dass dort nichts dazwischen "funkt". > Was für den TO auch interessant sein dürfte ist die Lösung wie man aus > einem Bestehenden Scannprint das schon verbaut ist via MIDI eine Taste > drückt, dazu angehängte Schema der Keymatrix einer Oktave. Nein. Ich habe das Keyboard-Modul ohne Gehäuse aus einer Reparatur überlassen bekommen. Die Tasten haben eine echte Hammermechanik. Ich möchte praktisch einen kleine MIDI-Controller dazu bauen um das Teil am PC verwenden zu können. So wie ich das gesehen habe, ist die 3x4 Matrix, wie ich sie hier habe, nicht so üblich. Ich würde jetzt naiv bei der Matrixansteuerung so vorgehen: 1. V1=1 2. G1 bis G4 der Reihe nach auf Masse legen 3. Key01-04 bis Key85-88 jedes mal einlesen. Das ganze jeweils auch für V2=1 und V3=1 Eventuell müsste man die Leitungen Key01-04 bis Key85-88 durch einen kurzen Impuls wieder auf 1 zurücksetzen. Schaltung und Mikrocontroller dazu muss ich mir noch überlegen.
Sven K. schrieb: > So wie ich das gesehen habe, ist die 3x4 Matrix, wie ich sie hier habe, > nicht so üblich. Das dürfte für die Scanlogic nicht Problematisch werden, da die Row und Colum anhand einer Tabelle in der Scanlogic verarbeitet werden. Dis haben wir so gelöst um möglichst Flexibel auf jedes Mögliche Keyboard/Orgel/Oder E-Piano ohne grössere Softwareanpassung eingehen zu können.
1 | ; Byte | FE | FD | FB | F7 | EF | DF | BF | 7F | |
2 | ; Scanline | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
3 | ; | P4.0(01)| P4.1(02)| P4.2(04)| P4.3(08)| P4.4(10)| P4.5(20)| P4.6(40)| P4.7(80)| |
4 | ; ScanSwitch|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3| |
5 | ;$4110 |BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT| |
6 | ; $41 $10| "C0" | "C#0" | "D0" | "D#0" | "E0" | "F0" | "F#0" | "G0" | |
7 | LD0000 DB 04h,01h,00h,04h,01h,01h,04h,01h,02h,04h,01h,03h,04h,01h,04h,04h,01h,05h,04h,01h,06h,04h,01h,07h |
8 | ; $41 $20| "G#0" | "A0" | "A#0" | "H0" | "C1" | "C#1" | "D1" | "D#1" | |
9 | LD0018 DB 00h,02h,00h,00h,02h,01h,08h,02h,02h,00h,02h,03h,00h,02h,04h,00h,02h,05h,00h,02h,06h,00h,00h,00h |
10 | ; $41 $30| "E1" | "F1" | "F#1" | "G1" | "G#1" | "A1" | "A#1" | "H1" | |
11 | LD0030 DB 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h |
12 | ; $41 $40| "C2" | "C#2" | "D2" | "D#2" | "E2" | "F2" | "F#2" | "G2" | |
13 | LD0048 DB 00h,10h,11h,00h,10h,12h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h |
14 | ; $41 $50| "G#2" | "A2" | "A#2" | "H2" | "C3" | "C#3" | "D3" | "D#3" | |
15 | LD0060 DB 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h |
16 | ; $43 $10| "E3" | "F3" | "F#3" | "G3" | "G#3" | "A3" | "A#3" | "H3" | |
17 | LD0078 DB 00h,01h,08h,00h,01h,09h,00h,01h,0Ah,00h,01h,0Bh,00h,01h,0Ch,00h,01h,0Dh,00h,01h,0Eh,00h,01h,0Fh |
18 | ; $43 $20| "C4" | "C#4" | "D4" | "D#4" | "E4" | "F4" | "F#4" | "G4" | |
19 | LD0090 DB 00h,02h,08h,00h,02h,09h,00h,02h,0Ah,00h,02h,0Bh,00h,02h,0Ch,00h,02h,0Dh,00h,02h,0Eh,00h,02h,0Fh |
20 | ; $43 $30| "G#4" | "A4" | "A#4" | "H4" | "C5" | "C#5" | "D5" | "D#5" | |
21 | LD00A8 DB 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h |
22 | ; $43 $40| "E5" | "F5" | "F#5" | "G5" | "G#5" | "A5" | "A#5" | "H5" | |
23 | LD00C0 DB 00h,04h,08h,00h,04h,09h,00h,04h,0Ah,00h,04h,0Bh,00h,04h,0Ch,00h,04h,0Dh,00h,04h,0Eh,00h,04h,0Fh |
Achtung Tabelle wird überlappt dargestellt da zu wenig zeichen im Fenster möglich sind
:
Bearbeitet durch User
Das Thema "Klaviatur abtasten" wurde hier im Forum ja schon mehr durchgekaut. Wenn man nicht in der Verkabelung ersticken will, bleiben da eigentlich immer nur Schieberegister. Die kann man einfach kaskadieren und genauso einfach per SPI einlesen. Mit einer Matrixansteuerung vermindert man den Leitungsaufwand nicht, sondern steigert ihn nur weiter. Und ob die Kontakte sich in einer Matrix betreiben lassen, sollte man zumindest auch vorher genaustens geprueft haben.
xyz schrieb: > Mit einer Matrixansteuerung vermindert man den Leitungsaufwand > nicht, sondern steigert ihn nur weiter. > Und ob die Kontakte sich in einer Matrix betreiben lassen, > sollte man zumindest auch vorher genaustens geprueft haben Meistens werden die Matrixen bei bestehenden Keys ja bereits vordecodiert, Das heißt hier im Fall vom TO mit Transistoren, oder häufig auch mit Dioden. da reduziert sich der Kabelaufwand schon beachtlich. Auf den Schemas wären das CN11 und auf dem anderen CN19. Wen wir eigene Keys bauen ist das meistens über 1MHz I²C Bus gelöst. dann hat man natürlich kaum mehr Kabel. Wie Gesagt wenn das Keyboard Vorgegeben ist wie hier beim TO, dan muß man die Steuerung auch entsprechend Gestalten. Aus diesem Grund sind unsere Key to MIDI Controller so gestaltet dass sie auch beides offerieren also Matrix oder I²C (PF_SDA und PF_SCL auf dem Kontroller) Genau so stellt der MIDI to Key Controller auch immer 2 Analogports für Beender oder ähnliches zur Verfügung CN1 (JOG_A und JOG_B). Ausgangseitig wird dies dan mit einem schnellen Digitalpoti gelöst (links oben auf dem Schema der Hauptplatiene)
:
Bearbeitet durch User
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.