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.