Hallo zusammen,
es gab schon einmal einen Thread über dieses Thema.
Karl Heinz (kbuchegg) hatte mir dabei auch sehr geholfen.
Jetzt bin ich gerade dabei, die Planungen umzusetzen.
Ich habe jetzt Platinen-Layouts und Schaltpläne erstellt.
Jetzt brauche ich nur noch den passenden Code dazu.
Kar Heinz hatte mir ja einen gesagt, dass ich mich wieder melden soll,
wenn ich anfange zu bauen.
Dies war der Code:
while(!(UCSRA&(1<<UDRE)))// warten bis Senden moeglich
60
;
61
62
UDR=c;
63
}
64
65
voidSendNoteOn(uint8_tnote)
66
{
67
uart_putc(NOTE_ON);
68
uart_putc(note);
69
uart_putc(100);
70
}
71
72
voidSendNoteOff(uint8_tnote)
73
{
74
uart_putc(NOTE_OFF);
75
uart_putc(note);
76
uart_putc(0);
77
}
78
79
voidscanKeys(uint8_t*keys)
80
{
81
SET_BIT(SR_PORT,SR_PS);
82
CLR_BIT(SR_PORT,SR_PS);
83
84
for(uint8_ti=0;i<NR_SR;i++)
85
keys[i]=fetchByte();
86
}
87
88
intmain(void)
89
{
90
uint8_tprevKeys[NR_SR];
91
uint8_tnowKeys[NR_SR];
92
uint8_tchanged,pressed;
93
uint8_tmidiNote;
94
95
SR_DDR|=(1<<SR_PS)|(1<<SR_C);
96
uart_init();
97
98
scanKeys(prevKeys);
99
100
while(1)
101
{
102
scanKeys(nowKeys);
103
104
midiNote=MIDI_NOTE_C2;// die erste Note im Manual
105
106
for(uint8_ti=0;i<NR_SR;i++)
107
{
108
changed=nowKeys[i]^prevKeys[i];
109
pressed=nowKeys[i];
110
111
prevKeys[i]=nowKeys[i];
112
113
if(changed!=0x00)
114
{
115
for(uint8_tbit=0;bit<8;++bit)
116
{
117
if(changed&0x80)
118
{
119
if(!(pressed&0x80))
120
SendNoteOn(midiNote);
121
else
122
SendNoteOff(midiNote);
123
}
124
midiNote++;
125
changed<<=1;
126
pressed<<=1;
127
}
128
}
129
else
130
midiNote+=8;
131
}
132
}
133
}
Das ist der Code für ein Manual.
Jetzt brauche ich nur diesen Code für drei Manuale und Pedal und
Schweller und Taster.
Den Schwellercode habe ich auch schon.
Siehe hier:
1
#include<avr/io.h>
2
#include<avr/io.h>
3
#define F_CPU 1000000 // 1 MHz
4
#define BAUD 31250 // MIDI-Baudrate (31,25kBit)
5
#include<util/setbaud.h>
6
voidadc_init(void){
7
8
//interne Referenzspannung
9
//ADMUX = 0xC0;
10
11
//AVCC
12
//ADMUX = 0x40;
13
14
//AREF
15
ADMUX=0xC0;
16
17
18
ADCSRA=0x80;//ADC aktivieren, Rest 0 setzen
19
20
//ADCSRA |= 0x01; //Vorteiler 2
21
//ADCSRA |= 0x02; //Vorteiler 4
22
//ADCSRA |= 0x03; //Vorteiler 8
23
//ADCSRA |= 0x04; //Vorteiler 16
24
ADCSRA|=0x05;//Vorteiler 32
25
//ADCSRA |= 0x06; //Vorteiler 64
26
//ADCSRA |= 0x07; //Vorteiler 128
27
28
ADCSRA|=(1<<6);//Konvertierung starten
29
30
while(ADCSRA&(1<<6)){};//Kovertierung beendet
31
32
uint16_tergebnis=0;
33
34
ergebnis=ADCL;
35
ergebnis+=(ADCH<<8);
36
37
}
38
39
uint16_tadc_read(uint8_tkanal){
40
41
staticuint8_tinit=0;
42
43
if(init==0){adc_init();init++;}//beim ersten Aufruf zunaechst initialisieren
44
45
ADMUX&=(0xE0);//Vorhandenen Wert fuer den Kanal loeschen
46
47
//den Wert fuer den Kanal schreiben, dabei die vorderen 3 Bits vor evtl. fehlern schuetzen
while(!(UCSRA&(1<<UDRE))){}// warten bis Senden moeglich
102
UDR=c;// sende Zeichen
103
}
104
105
voidSendmidicontrol(void){
106
uart_putc(176);// Control-Comment
107
uart_putc(100);// Control # (0-127)
108
uart_putc(100);// Control Value (0-127)
109
}
Es soll insgesamt 3 Schweller geben, 3 Manual, 1 Pedal, 1
Schieberegisterkette mit Tastern für die Setzersteuerung.
Die Pinbelegung vom Atmega8 isdt aus dem Schaltplan der Masterplatine zu
entnehmen.
Muss ich die Codes jett einfach nur kopieren ?
Was schlägst du vor Karl Heinz?
Vielen Dank für deine/eure Bemühungen!!!!
Viele Grüße
Fabi
Fabian Müller schrieb:> Was schlägst du vor Karl Heinz?
Gerade erst gesehen.
Vorschlag:
zunächjst mal kümmern wir uns um die Manuals.
Dazu braucht es 3 Schieberegisterketten, für jedes Manual eines.
Die 3 Schieberegisterketten werden mit den Steuerleitungen parallel
gehängt und gemeinsam ausgelesen, dann dauert das für alle 3 nicht
wesentlich länger als nur für eines alleine.
Ich würde auch vorschlagen, die Setzer-Taster im Grunde wie ein Manual
zu behandeln. D.h. da sind nicht 3 SR-Ketten, sondern deren 4. Auch wenn
die 4.te hardwaremässig nicht voll ausgeführt ist. Macht aber nix.
Programmintern tun wir einfach so, mit dem Bewusstsein, dass einge der
'Tasten' Phantasiewerte aufweisen.
Vorschlag für den Anschluss
1
+-------+
2
|
3
PB0 o---------------------+------> PS der Taster-SR Kette
4
| |
5
PB1 o------------------+--)------> C der Taster-SR Kette
6
| | |
7
PB2 o------------------)--)------> DATA der Taster SR-Kette
8
| | |
9
PB3 o---------------+ | |
10
| | | |
11
PB4 o-------------+ | | +------> PS Manual 1 -+
12
| | | | | |
13
PB5 o-----------+ | | +--)------> C Manual 1 SR-Kette
14
| | | | | | |
15
| | | +--)--)------> Data Manual 1 -+
16
| | | | |
17
| | | | |
18
+-------+ | | | |
19
| | | +------> PS Manual 2 -+
20
| | | | |
21
| | +--)------> C Manual 2 SR-Kette
22
| | | | |
23
| +----)--)------> Data Manual 2 -+
24
| | |
25
| | |
26
| | |
27
| | +------> PS Manual 3 -+
28
| | |
29
| +---------> C Manual 3 SR-Kette
30
| |
31
+----------------> Data Manual 3 -+
Ist das bei dir hardwaremässig so möglich?
(Ich hoffe, du hast da deine Masterplatine noch nicht gebaut)
Die Manualplatine:
Würde ich nicht so machen.
Ich würde mir ein kleines Platinenmodul machen, auf dem EIN (maximal 2)
Schieberegister sitzt. Ernsthaft.
Jedes dieser Module hat eine Stiftleiste als "Eingang" und eine
Stiftleiste als "Ausgang". Jedes Modul holt sich die PS und die
C-Leitung vom Eingang und schleift sie auf seinen Ausgang durch. Die
Data-Leitung von der Ausgangsstiftleiste geht auf den Kaskadiereingang
des Schieberegisters und der Datenausgang vom Schieberegister geht auf
auf die Eingangsstiftleiste. Dazu natürlich noch Vcc und GND (wobei es
nicht schadet, ,mehrere GND bzw. Vcc Leitungen auf dem Kabel zu haben,
so dass zwischen jeder Signale-führenden Leitung jeweils eine Vcc bzw.
GND Leitung liegt. 2-reihige Stiftleisten sind ideal dafür.
Die Module werden in der benötigten Anzahl pro Schieregisterkette
mittels kurzer Flachbandkabel aneinander gesteckt, wobei die Module dann
möglichst dicht an die Manual-Tasten kommen, für die sie zuständig sind.
d.h. die Module werden so aneinander gereiht
Jedes Rechteck ist ein Modul - eine Platine. Alle Platinen sind gleich
und man kann 'beliebig' viele hintereinander schalten, je nachdem
wieviele Eingänge in dieser Kette benötigt werden.
Dadurch, dass die Platinen auf die Art klein sind, kann man die auch
problemlos fertigen. Und dadurch, dass die Verbindungen zwischen den
Modulen problemlos ein paar Zentimeter lang sein können
(Flachbandkabel), können die Platinen jeweils in unmittelbarer nähe der
8 Tasten sitzen, für die sie zuständig sind. (oder 16 Tasten, wenn
jeweils 2 Schieberegister auf einem Modul sitzen)
Pro Manual brauchst du also 8 derartige Model (oder 4, bei 2 SR pro
Modul). Für alle 3 Manuals daher 24 Module (oder 12). Für die Taster pro
8 Taster jeweils 1 weiteres Momdul (oder pro 16 Taster), wobei ich mir
die Frage stelle, ob die Pedale im Prinzip ja auch einfach nichts
anderes als Schalter sind und daher mit den Tastern mitgehen.
Willst du irgendwann man mehr Schalter und Taster, dann hängst du
einfach ein weiteres Modul an diese Kette an, was durch die
'standardisierten' Anschlüsse auch problemlos geht.
So würde ich das aufbauen, wenn ich den Platz in der vorgegebenen Orgel
habe, entlang der Manuals jeweils kleine Platinen anbringen zu können.
Zu deinen Platinen.
Da haben wir wieder mal zum 3 millionsten mal den immer gleichen Fehler:
JEDES IC benötigt seinen Blockkondensator. Zwischen Vcc und GND gehört
(möglichst dicht an das IC herangerückt) ein 100nF keramischer
Kondensator.
Ohne diese Kondensatoren kann es funktionieren, muss aber nicht. Gerade
bei derartigen Sachen, würde ich aber nicht auf 'kann' setzen, sondern
auf Nummer sicher gehen. Blockkondensator hin und zumindest der Teil ist
in Punkte 'Erhöhung der Zuverlässigkeit' erst mal abgehakt.
Die Blockkondensatoren stellen sicher, dass kleine Spannungseinbrüche,
die durch kurzzeitig hohen Stromverbrauch eines IC entstehen, abgeblockt
und am Ort des Entstehens ausgeglichen werden. Nicht ganz unwichtig,
wenn im µC Arbeit verrichtet wird bzw. wenn ca. 30 Schieberegister
gleichzeitig schalten. Da entstehen ganz schnell Stromspitzen, die das
Netzteil mit Sicherheit nicht schnell genug ausregeln kann.
Hallo,
viele Dank für deine Antwort.
Habe mich jetzt doch gegen den Selbstbau entschieden.
Es wird mir zu kompliziert.
Werde Platinen von WIRA oder Konsorten kaufen.
Gruß
Fabi
Ein derartiger µC hat zuwenig Pins, als das man die Tasten der Manuals
direkt anhängen könnte.
Die Schieberegister beheben das, indem sie sich zu einem bestimmten
Zeitpunkt den aktuell Zustand jeder Taste merken und der µC dann die
jeweiligen Zustände im Gänsemarsch an lediglich 3 Pins einlesen kann.
Falls das jemand liest und sich dafür interessiert:
Die Firma Döpfer hat ein fertiges System für bis zu 64 INs und OUTs und
auf UCAPPS gibt es Projekte mit bis zu 128 IOs.
Nur so zur Information.
In der Zeitschrift "c't Magazin" 2005 Heft14,15,17,22 war mal eine
Selbstbau Musik-Workstation "Klangcomputer ||" beschrieben. Sehr
interessant aber aufwändig.
Karl H. schrieb:> Die Schieberegister beheben das, indem sie sich zu einem bestimmten> Zeitpunkt den aktuell Zustand jeder Taste merken und der µC dann die> jeweiligen Zustände im Gänsemarsch an lediglich 3 Pins einlesen kann.
Ich benutze diese hier in Handverdrahtung. Sind 1,50 das Stück.
Kennt jemand was Besseres? Z.b. eine komplette Kaskade für gleich 32
Kanäle?
Naggige 595er hab ich schon fuer 3 ct/Stck per 30er Stange gesehn.
Das waeren aber wohl auch die flaschen.
Du brauchst Parallel-In Serial-Out.
Die 595er sind Serial-In und Parallel-Out!
Organist schrieb:> Ja, richtig. Zum Ansteuern nach diesem Schema benötige ich aber beide> Funktionen:
Dass dieses "Schema" für deine Zwecke völlig untauglich ist, wurde in
dem verlinkten Thread schon ausgiebig diskutiert. Es bringt nichts, wenn
du noch ein paar weitere Threads damit beglückst.
Aber wenn du es UNBEDINGT so machen WILLST, dann mache es genau so.
Fang einfach mal damit an und mach ein Funktionsmodell zum Lernen. So,
wie du zur Zeit herumhampelst und dich in der Theorie und halbgaren
Spekulationen verlierst, dauert das Jahre und wird nichts.
Schlumpf schrieb:> Matrixtastaturen bei Musikinstrumenten sind Kaese.
Ganz meine Worte. Auf jeden Fall bei Einzelstücken. Wenn man 1 Million
davon macht, dann sieht das evtl. anders aus...
Spaetestens wenn er denn mal wirklich 61 oder 73 oder womoeglich
sogar 88 Tasten an/in einer Matrix verknueppern muss, wird ihmchen
schon die Einsicht kommen.
Statt 8 oder 16 Leitungen (+GND) per Tastaturabschnitt, fuer eine
Tastatur ohne oder mit Anschlagdynamik, hat er dann mit einem wilden
Draht/Platinenverhau zu kaempfen.
Mein Beileid hat er dann nicht.
Zum Glück hat ein Orgel keine Anschlagdynamik, aber da müssen noch viele
andere Schaltkontakte (Register, Koppel,...) abgefragt werden. Und wehe,
wenn man mal hinterher noch was erweitern will.
Mit vielen Schieberegistern hintereinander ist das kein Problem: die
verteilten Schalter/Taster/Kontakte müssen nicht großartig verdrahtet
werden, weil sie einfach auf dem kürzesten Weg zum (durchaus räumlich
gesehen) nächsten Schieberegister verdrahtet werden. Und wenn die Mimik
zu wenige Eingänge hat, weil noch was erweitert werden soll, dann hängt
man einfach noch ein paar Schieberegister dahinter.
Es ist ja nicht so, dass ich sowas nicht schon ein paar Mal gemacht
hätte und ins Blaue hinein fabulieren würde...
> Mit vielen Schieberegistern hintereinander ist das kein Problem
Ja.
> räumlich gesehen
Genau deswegen.
Eine Matrix wuerde auch keine IOs an einem Controller/FPGA einsparen
sondern nur zusaetzliche belegen.
Schlumpf schrieb:> Eine Matrix wuerde auch keine IOs an einem Controller/FPGA einsparen> sondern nur zusaetzliche belegen.
Wieso denn das bitte?
Schlumpf schrieb:> fuer eine> Tastatur ohne oder mit Anschlagdynamik, hat er dann mit einem wilden> Draht/Platinenverhau zu kaempfen.
Es geht auch nicht um die Tasten des Manuals, sondern nur um Schalter,
die per Hand bedient werden und Funktionen steuern.
Fuer die Abfrage von Tasten (gegen GND) mit einem Parallel-Seriellen-SR
braucht man nur Takt und Daten.
Macht genau 2 IOs.
Um die Tasten in einer Matrix abzufragen braucht man noch Ausgaenge.
Die muessen ja auch angesteuert werden.
> Wieso denn das bitte?
[Hier stand ein unfreundlicher Satz.]
> Es geht auch nicht um die Tasten des Manuals, sondern nur um Schalter,> die per Hand bedient werden und Funktionen steuern.
Was da dran haengt ist den Schieberegistern weitgehend egal.
Schlumpf schrieb:>> Wieso denn das bitte?>> [Hier stand ein unfreundlicher Satz.]
Wenn du eine sachliche Rückfrage nicht beantworten möchtest, dann lass
es eben. Am Besten hälst Du Dich aus solchen Foren fern, wenn Du nicht
kommunizieren kannst, oder willst.
Und noch dies:
Schlumpf schrieb:> Matrixtastaturen bei Musikinstrumenten sind Kaese.>> Ausser Billigheimern macht sowas niemand ohne Not.
Nur so am Rande:
http://www.doepfer.de/DIY/Matrix_61.gif
Organist schrieb:> Nur so am Rande:> http://www.doepfer.de/DIY/Matrix_61.gif
Na bitte, da hast du deinen Schaltplan. Du siehst da auch, wie die
Dioden dort reinkommen.
Mach es genau so. An den Matrixleitungen kommen da dann auch keine
Schieberegister, sondern direkt Portpins.
> Am Besten hälst Du Dich aus solchen Foren fern, wenn Du nicht> kommunizieren kannst, oder willst.
Statt die Zeit für solche Ratschläge zu vergeuden solltest du einfach
mal anfangen...
Hobbyorganist schrieb:> Ich finde das Thema interessant, ich baue auch an einer Orgel und würde> gerne den Zweck dieses Schieberegisters verstehen.
Die Bauzeit scheint sich in die Länge zu ziehen! (2014)
Vielleicht hilft doch ein Blick auf MIDIBOX. Die haben eine Menge
fertiger Projekte mit WIKI. Für mich steht das hier an:
http://midibox.org/forums/gallery/image/3455-seq-productsheet-twojpg/