Forum: Mikrocontroller und Digitale Elektronik Midi mit Bascom und AVR


von Germer D. (germy)


Lesenswert?

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

von OAmp (Gast)


Lesenswert?

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)?

von Germer D. (germy)


Lesenswert?

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.

von OAmp (Gast)


Lesenswert?

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

von CBRler (Gast)


Lesenswert?

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

von Germer D. (germy)


Angehängte Dateien:

Lesenswert?

Danke für die nützlichen Hinweise bisher. Ich habe mal etwas 
zusammengestellt. Wäre nett, wenn mal einer drüberschaut.

Gruß Germy

von Weingut P. (weinbauer)


Lesenswert?

Am Pullup vom Optokoppler gibts nen Kurzen
bei 10 MHz gibts 1,2% Baudratenfehler, kannste mal nachschaun ob das 
passt, k.A..

von OAmp (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal midi-in
Eventuell externen Pullup schalten.

von OAmp (Gast)


Lesenswert?

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.

von Germer D. (germy)


Angehängte Dateien:

Lesenswert?

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

von holger (Gast)


Lesenswert?

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.

von Germer D. (germy)


Lesenswert?

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...

von OAmp (Gast)


Lesenswert?

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

von Michael W. (Gast)


Lesenswert?

Zum 'auswerten' von MIDI-Daten eignet sich ganz hervorragend MIDI-OX

http://www.midiox.com/

Ist 'ne super Freeware und sehr mächtig...

von Germer D. (germy)


Lesenswert?

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

von OAmp (Gast)


Lesenswert?

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

von Germy (Gast)


Lesenswert?

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

von OAmp (Gast)


Lesenswert?

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?

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

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

von Germy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.