Hallo, ich bin hier völlig neu und muss mich nach 30 Jahren (Z80) erneut mit der Programmierung eines µP beschäftigen. Was habe ich vor? Ich baue eigendlich Gitarrenröhrenverstärker und nun möchte ich meine Kanalumschaltung gerne mit einer Midisteuerung verstehen. Kurz: Ich möchte 8 Relais über ProgChange via Midi ansteuern und alles was ich mache auch einem LCD-Display sichtbar machen. Was ich nun suche sind ähnliche Projekte und auch Programmierbeispiele in Bascom, um das ganze zu verstehen. Für ein paar Vorschläge und Hilfe wäre ich sehr dankbar. Gruß Germy
Um 8 Relais anzusteuern benötigst du kein Midi. Das geht mit 8 Transistoren oder besser einem Array von Transistoren (Vorwiderstand nicht vergessen). Programmchange ist nur bei bereits midifizierten Geräten angebracht. Wenn keine Notendaten oder Sysex übertragen werden ist das eher überdimensioniert Hier mit einem Relais : http://halvar.at/elektronik/kleiner_bascom_avr_kurs/last_anschliessen/ Und Frage, was ist denn Target für ein Typ (Attiny,ATMega)?
Ob ich eine Midi-Steuerung brauche oder nicht, würde ich gerne selbst entscheiden. Oder kannst Du genau abschätzen, was ich damit vor habe? Ich werde einen Atmega328 verwenden und werden am WE mal meinen Hardwareentwurf einstellen. Ich brauche ca. 8 Taster, ein LCD-Display und 8 Relaisausgänge. Ich würde nicht den Weg über einen AVR wählen, wenn er nicht unbedingt notwendig erscheint. Das ich eventuell mal ein Volumenpedal damit betreibe, lasse ich hier noch einmal offen. ich habe nur kiene Lust mit 10ardigen Kabel und Monsterbuchsen an meine Amps zu gehen. Nebenbei ist bei den hochwertigen Amps mittlerweile MIDI der Standard. Was ich suche sind Hardwarebeispiele und Softwareroutinen, die sich bewähr haben. Ich habe gelesen, dass sehr viel zu anfang Probleme mit dem auslesen des MIDI-Signals haben. Danke im Voraus.
Hi Volumenpedal sagt schn etwas mehr.Willst du möglicherweise über eines mehrere Amps steuern? Dann wären die Midi-Implikationen der Geräte die nötige Vorraussetzung um Code zu schreiben, Hardware zu entwickekln. Germer DR schrieb: > ich habe nur kiene Lust mit > 10ardigen Kabel und Monsterbuchsen an meine Amps zu gehen das sehe ich ebenso Eine kleine Zeichnung wie alles verschaltet werden soll wäre hilfreich Gruss Jo
Hi, vielleicht hilft dir das hier weiter: http://www.roboternetz.de/community/threads/47200-Midi-Ausgabe?highlight=Midi Nur mal zum grundsätzlichen Verständnis zum Verarbeiten von Midi-Befehlen mit Bascom. cu CBRler
Danke für die nützlichen Hinweise bisher. Ich habe mal etwas zusammengestellt. Wäre nett, wenn mal einer drüberschaut. Gruß Germy
Am Pullup vom Optokoppler gibts nen Kurzen bei 10 MHz gibts 1,2% Baudratenfehler, kannste mal nachschaun ob das passt, k.A..
Nachtrag: Übrigens, IC3 ist wohl ein Decoder und kein 74HC174. Kann so (D-FlipFlops)nicht funktionieren. IC4 Driver/Buffer steuert die Relais. Kann funktionieren. Kommt auf den Typ an.
Hi, ich habe mir alle Hinweise durch gesehen und danke dafür. Warum kann ich keinen Decoder wie den 74HC147 verwenden? Wird auch häufig an PICs als Tastaturdecoder genommen. Gut, wenn man zwei Tasten gleichzeitig drückt, gibt es Probleme, aber auch die bekommt man in Griff. Kennt jemand einen besseren Weg für eine Tastaturdecodierung? Habe mal den überarbeiteten Plan drangehängt. Gruß Germy
Aref gehört nicht an +5V. Den lässt man offen und wenn der ADC genutzt wird kommt da ein 100nF dran. Mehr nicht. Dein ISP wird nicht funktionieren. Mach da 1k Widerstände an die Ausgänge des 74147. D0,D1,D2,D3 vom LCD werden nicht an GND angeschlossen. Lass die offen. Da sind Pullup Widerstände im Display die einen passenden Pegel für die dann offenen Leitungen erzeugen. GND ist kein passender Pegel für diese Leitungen.
Also: Zwischen die Ausgänge des 74147 und dem ATMEGA 1K in die Signalleitungen. Ist ja auch logisch, da der 74147 an den Ausgängen auf hi liegt. Danke! Die Anschlüsse vom LCD habe ich aus einer funktionierenden Schltung übernommen. Nochmals, danke für den Hinweis. Wer noch einen anderen Vorschlag für einen Tastaturdecodierer hat, GERNE! Suche noch Software zum auswerten von Midi-Daten. Vielen Dank für die wertvollen Hinweise...
Probier doch mal das : http://obds.free.fr/midimon/ Ohne so einen - sozusagen - Sniffer für die Daten sieht nan ja nicht viel Beim Schreiben des Codes ist zu beachten was Midi so durchschleift und welche Sysex frei sind und nicht etwa andere Geräte ansteuern. Kann ja auch sein dass gar kein PC im Verbund ist. Dann sollte das LCD zuerst mal eingehende Daten anzeigen. Solch eine Programmierung ist einigermasen anspruchsvoll. Ich müsste mal in meinen Wälzer mit den kompletten Spezifikationen schauen. Da kommen viele Fragen auf: Steuerung über Programmchange, Sysex? Wie das alles in den uC kriegen? Eine fertige Biblothek verwenden? Wirklich in Bascom? Jo
Zum 'auswerten' von MIDI-Daten eignet sich ganz hervorragend MIDI-OX http://www.midiox.com/ Ist 'ne super Freeware und sehr mächtig...
Vielen Dank für die Tips. Empfange schon die ersten Bytes mit meinem Versuchsaufbau.....JuHu. Erste Ziel erreicht!!!! Bis auf ein paar Bissspuren in der Tischplatte ging alles gut. Schei... Fuses! Frage mich nun, was in BASCOM die beste Methode ist, die MIDI-Bytes zu filtern. Gruß Germy
Hi Für Bascom gabs mal eine Midi-Library, jetzt gekuckt, finde aber nichts mehr. Übrigens kommt es ja drauf an, ob nur wenige Midi-Daten schalten sollen. Die kann man auch zweckentfremden und PrgCha für Relais einsetzen. Kommt drauf an welches Gerät als Master steuert und/oder was der Client auswerten kann. Selber werde ich nun eine Midisteuerung für analoge Synths entwerfen. Erste Versuche mit Volume und Trigger sind grad im Laufen. Dabei greife ich zuerst mal auf Arduino mit Midi-Lib zurück, dann als zweites alles auf ATMEL pur. Ist dann auch mal lustig die performance der beiden unterschiedlichen Systeme zu messen. Grüsse Jo
So,
mit vielen Pausen und einiges an Kaffee habe ich jetzt ein Programm, was
aber leider nicht stabil läuft. warscheinlich voll mit Anfägnerfehlern
;-)
Der Midi_Empfang klapp eigentlich recht gut, doch irgendwann stürtz das
Display ab, obwohl die Schaltfunktioen weiterhin funktionieren und ich
kann den Fehler nicht finden. Man wird ja auch irgendwann blind für
seine eigene Dummheit...
Wer mag, kann ja mal drüberschauen.
---------------------------------------------------------------
' Firmware Ampwerk MIDI-Channel-Controller V1.0
' (c) Germer de Raad 2014
' ---------------------------------------------------------------
$regfile = "m328pdef.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 60
$framesize = 50
$baud = 31250
' ---------------------------------------------------------------
' Variablen und Konstanten
' ---------------------------------------------------------------
Relais1 Alias Portc.5 'Relais Namenvergabe
Relais2 Alias Portc.4
Relais3 Alias Portc.3
Relais4 Alias Portc.2
Relais5 Alias Portc.1
Relais6 Alias Portc.0
Plus Alias Pind.5 ' Schalter Namenvergabe
Minus Alias Pind.6
A Alias Pind.7
B Alias Pind.2
Dim Ac As String * 7 ' Variable für Ampkanal auf LCD
Dim Mute As String * 4 ' Variable für Mute auf LCD
Dim Fx As String * 6 ' Variable für FX on Off auf LCD
Dim Mi As String * 2 ' Variable für Midikanal auf LCD
Dim Ch As Byte
Dim Kb As Byte ' Eingabe für Midikanal
Dim Mc As Byte ' Fertiges Kanalbyte
Dim X As Bit ' 1. Byte
Dim B1 As Bit ' 2. Byte und folgende
Dim B2 As Bit
Dim B3 As Bit
Dim B4 As Bit
Dim B5 As Bit
Dim B6 As Bit
Dim B7 As Bit
Dim B8 As Bit
Dim B9 As Bit
Dim B10 As Bit
Dim B11 As Bit
Dim B12 As Bit
Dim B13 As Bit
Dim B14 As Bit
Dim B15 As Bit
Dim B16 As Bit
Dim B17 As Bit
Dim C As Bit ' 3. Byte
Dim Rxbyte As Byte
Dim I As Integer
' ---------------------------------------------------------------
' Anlauf nach Power On
' ---------------------------------------------------------------
Init:
' Port-Definitionen
' -----------------
Ddrc.5 = 1
Ddrc.4 = 1 'Relaisausgänge definieren
Ddrc.3 = 1
Ddrc.2 = 1
Ddrc.1 = 1
Ddrc.0 = 1
Portd.5 = 1 ' Tastereingänge definieren
Portd.6 = 1
Portd.7 = 1
Portd.2 = 1
' Anlauf-Variablen
' ----------------
I = 0
Ch = 1 ' Bei Start MIDI.Ch. 1
X = 0
C = 0
' Display initialisieren
' ----------------------
Config Lcd = 20 * 2 ' Display 20 x 2 initialisieren
Config Lcdpin = Pin , _
Db4 = Portb.3 , _
Db5 = Portb.4 , _
Db6 = Portb.5 , _
Db7 = Portb.0 , _
Rs = Portb.1 , _
E = Portb.2
Cursor Off
Cls
Locate 1 , 1 : Lcd "MIDI=" 'Feste Textanzeigen
Locate 2 , 1 : Lcd "Ch="
' UART initialisieren
' -------------------
On Urxc Intmidireceive ' Empfangsinterupt initialisieren
Enable Urxc
' Globale Interrupt-Freigabe
' --------------------------
Enable Interrupts
' ---------------------------------------------------------------
' Main-Program
' ---------------------------------------------------------------
Do
Waitms 100 'Bremse für Schleife
If Plus = 0 Then Ch = Ch + 1 'Midikanalwahl Plus_taster
If Ch > 16 Then Ch = 1 'Wenn >16 dann Kanal 1
If Minus = 0 Then Ch = Ch - 1 'Midikanalwahl Minus_taster
If Ch < 1 Then Ch = 16 'Wenn < 1 dann Kanal 16
Select Case Ch ' LCD anzeige Auswahl
Case 1 : Mi = "01"
Case 2 : Mi = "02"
Case 3 : Mi = "03"
Case 4 : Mi = "04"
Case 5 : Mi = "05"
Case 6 : Mi = "06"
Case 7 : Mi = "07"
Case 8 : Mi = "08"
Case 9 : Mi = "09"
Case 10 : Mi = "10"
Case 11 : Mi = "11"
Case 12 : Mi = "12"
Case 13 : Mi = "13"
Case 14 : Mi = "14"
Case 15 : Mi = "15"
Case 16 : Mi = "16"
End Select
Kb = Ch - 1 'Midikanal mit 1.Byte
Mc = &HB0 + Kb
Locate 1 , 6 : Lcd Mi ' Midikanal auf LCD zeigen
If A = 0 Then Gosub Proga1 ' Taster für Amp-Kanal A
If B = 0 Then Gosub Proga2
Locate 2 , 4 : Lcd Ac ' LCD Anzeige Ampkanal
Locate 2 , 13 : Lcd Hex(mc)
Loop
Return
' ---------------------------------------------------------------
' UART-Receive (MIDI-IN)
' ---------------------------------------------------------------
Intmidireceive:
If I = 1 Then
Rxbyte = Udr
If Rxbyte = Mc Then Gosub Kanal ' 1. Byte mit Midi-ch
vergleichen
If Rxbyte = &H28 Then Gosub A1 ' 2. Byte für CC vergleichen
If Rxbyte = &H29 Then Gosub A2 ' ------------
II-------------
If Rxbyte = &H2A Then Gosub A3
If Rxbyte = &H2B Then Gosub A4
If Rxbyte = &H2C Then Gosub A5
If Rxbyte = &H2D Then Gosub A6
If Rxbyte = &H2E Then Gosub A7
If Rxbyte = &H2F Then Gosub A8
If Rxbyte = &H30 Then Gosub A9
If Rxbyte = &H31 Then Gosub A10
If Rxbyte = &H32 Then Gosub A11
If Rxbyte = &H33 Then Gosub A12
If Rxbyte = &H34 Then Gosub A13
If Rxbyte = &H35 Then Gosub A14
If Rxbyte = &H36 Then Gosub A15
If Rxbyte = &H37 Then Gosub Z1
If Rxbyte = &H38 Then Gosub Z2
If Rxbyte = &H7F Then Gosub Onoff ' 3.Byte ist ein/aus bei
127(7F)
I = 0
Else
Incr I
End If
Return
Kanal: ' Nach Bytevergleich in Bit umwandeln
X = 1
Return
A1:
B1 = 1
Return
A2:
B2 = 1
Return
A3:
B3 = 1
Return
A4:
B4 = 1
Return
A5:
B5 = 1
Return
A6:
B6 = 1
Return
A7:
B7 = 1
Return
A8:
B8 = 1
Return
A9:
B9 = 1
Return
A10:
B10 = 1
Return
A11:
B11 = 1
Return
A12:
B12 = 1
Return
A13:
B13 = 1
Return
A14:
B14 = 1
Return
A15:
B15 = 1
Return
Z1:
B16 = 1
Return
Z2:
B17 = 1
Return
Onoff:
C = 1
If X = 1 And B1 = 1 And C = 1 Then Gosub Proga1 'Wenn alle Bytes
ok dann Prog1
If X = 1 And B2 = 1 And C = 1 Then Gosub Proga2
If X = 1 And B3 = 1 And C = 1 Then Gosub Proga3
If X = 1 And B4 = 1 And C = 1 Then Gosub Proga4
If X = 1 And B5 = 1 And C = 1 Then Gosub Proga5
If X = 1 And B6 = 1 And C = 1 Then Gosub Proga6
If X = 1 And B7 = 1 And C = 1 Then Gosub Proga7
If X = 1 And B8 = 1 And C = 1 Then Gosub Proga8
If X = 1 And B9 = 1 And C = 1 Then Gosub Proga9
If X = 1 And B10 = 1 And C = 1 Then Gosub Proga10
If X = 1 And B11 = 1 And C = 1 Then Gosub Proga11
If X = 1 And B12 = 1 And C = 1 Then Gosub Proga12
If X = 1 And B13 = 1 And C = 1 Then Gosub Proga13
If X = 1 And B14 = 1 And C = 1 Then Gosub Proga14
If X = 1 And B15 = 1 And C = 1 Then Gosub Proga15
If X = 1 And B16 = 1 And C = 1 Then Gosub Progz1
If X = 1 And B17 = 1 And C = 1 Then Gosub Progz2
X = 0
B1 = 0
B2 = 0
B3 = 0
B4 = 0
B5 = 0
B6 = 0
B7 = 0
B8 = 0
B9 = 0
B10 = 0
B11 = 0
B12 = 0
B13 = 0
B14 = 0
B15 = 0
B16 = 0
B17 = 0
C = 0
Locate 1 , 9 : Lcd Mute ' LCD-Anzeige Zusatzfunktionen
Locate 1 , 14 : Lcd Fx
Return
Proga1:
Relais1 = 1 'Programm für Ampkanal A
Relais2 = 0
Relais3 = 0
Relais4 = 0
Ac = "A "
Return
Proga2:
Relais1 = 0 'Programm für Ampkanal B
Relais2 = 1
Relais3 = 0
Relais4 = 0
Ac = "B "
Return
Proga3:
Relais1 = 0 'Programm für Ampkanal C
Relais2 = 0
Relais3 = 1
Relais4 = 0
Ac = "C "
Return
Proga4:
Relais1 = 0 'Programm für Ampkanal D
Relais2 = 0
Relais3 = 0
Relais4 = 1
Ac = "D "
Return
Proga5:
Relais1 = 1 'Programm für Ampkanal A+B
Relais2 = 1
Relais3 = 0
Relais4 = 0
Ac = "A+B "
Return
Proga6:
Relais1 = 1 'Programm für Ampkanal A+C
Relais2 = 0
Relais3 = 1
Relais4 = 0
Ac = "A+C "
Return
Proga7:
Relais1 = 1 'Programm für Ampkanal A+D
Relais2 = 0
Relais3 = 0
Relais4 = 1
Ac = "A+D "
Return
Proga8:
Relais1 = 0 'Programm für Ampkanal B+C
Relais2 = 1
Relais3 = 1
Relais4 = 0
Ac = "B+C "
Return
Proga9:
Relais1 = 0 'Programm für Ampkanal B+D
Relais2 = 1
Relais3 = 0
Relais4 = 1
Ac = "B+D "
Return
Proga10:
Relais1 = 0 'Programm für Ampkanal C+D
Relais2 = 0
Relais3 = 1
Relais4 = 1
Ac = "C+D "
Return
Proga11:
Relais1 = 1 'Programm für Ampkanal A+B+C
Relais2 = 1
Relais3 = 1
Relais4 = 0
Ac = "A+B+C "
Return
Proga12:
Relais1 = 1 'Programm für Ampkanal A+B+D
Relais2 = 1
Relais3 = 0
Relais4 = 1
Ac = "A+B+D "
Return
Proga13:
Relais1 = 1 'Programm für Ampkanal A+C+D
Relais2 = 0
Relais3 = 1
Relais4 = 1
Ac = "A+C+D "
Return
Proga14:
Relais1 = 0 'Programm für Ampkanal B+C+D
Relais2 = 1
Relais3 = 1
Relais4 = 1
Ac = "B+C+D "
Return
Proga15:
Relais1 = 1 'Programm für Ampkanal A+B+C+D
Relais2 = 1
Relais3 = 1
Relais4 = 1
Ac = "A+B+C+D"
Return
Progz1:
Toggle Relais5 'Programm für Zusatzfunktion ein/aus
Select Case Relais5
Case 1 : Mute = "Mute"
Case 0 : Mute = " "
End Select
Return
Progz2:
Toggle Relais6 'Programm für Zusatzfunktion ein/aus
Select Case Relais6
Case 1 : Fx = "FX On "
Case 0 : Fx = "FX Off"
End Select
Return
Gruß an alle
Germy
Hi, hab kaum Ahnung von Bascom, aber der Code ist lang. Da antworten vielleicht nicht viele... In Bascom gibts auch eine Möglichkeit zu Beginn alle Ports zu definieren. DDRC = &B00110111 1 definiert Ausgang und 0 Eingang. Genau wie das zu Anfang lässt sich das alles (Basic-Spagetti-Code) bestimmt noch optimieren. Schon mal überlegt den Status der 8 Relais in eine Variable einzulagern. Das könnte das Programm auch etwas minimieren. Soweit ich eben kurz mal in Bascom gelesen habe gibts auch den Befehl SET. Hier unter anderem zu finden : http://www.avr-praxis.de/forum/showthread.php?372-Bascom-Alias-Input-Output und beim netten Österreicher ist ja das LCD-Display: http://halvar.at/elektronik/kleiner_bascom_avr_kurs/lcd_textanzeige/ Kannst den ja mal anfragen, falls hier sowenig Leute mit Bascom Ahnung unterwegs sind - ich wette die kommen auch noch aus dem Bett. Kaffee.... Übringens stimmt der obige Schaltplan noch?
Also D0 bis D3 auf GND sollte eigentlich passen. Vom Reset auf GND würde ich noch einen 10nF Kondensator setzten, ist aber eher optional. Die Spannungsversorgung und deren Kondensatoren von IC 3 hab ich im Schaltplan nicht gefunden. Vielleicht solltest du anstatt des Decoders auch ein Schieberegister verwenden, damit hast du das gleichzeitige drücken mehrerer Taster im Griff. Christian_RX7
Danke für die Hinweise. Bascom ist hier leider nicht so verbreitet. Zum Schaltplan: Den Decoder habe ich rausgeschmissen. Einfach das nächstgrößere Teil, einen ATmega32 nehmen und die Welt ist schön. Preislich und vom Platzbedarf hält sich das die Waage. Derzeit bin ich ja noch im Versuchsstadium. Freue mich überhaupt, dass ich den Empfang von MIDI-Daten so gut in den Griff bekommen habe. Dazu habe ich auch einen kleinen MIDI-Fussschalter entworfen, der ebenfalls gut funktioniert. Der Tip mit MIDI-OX war Gold wert! Damit sieht man sofort und unkompliziert, was wirklich empfangen und gesendet wird. Den Rest bekomme ich auch noch in Griff und dann geht es an das Platinenlayout als kompakte universelle Einheit zum Einbau in Röhrenamps. Schönes WE und liebe Grüße aus dem Norden von Deutschland
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.


