HELP!: Assembler Code für ATTiny85 MIDI to CV/GATE interface.

hertz4

hertz4

..
Hallo,

auf der Suche nach einem simplen Midi to CV Interface bin ich auf Folgendes gestoßen:
https://github.com/mitxela/MidiMonotron

Schaltung aufgebaut, Chip mit dem Hex-File aus dem Repository programmiert,
funktioniert. ABER: Der CV-Ausgang springt beim Loslassen der Tasten wieder
auf 0. Zähneknirschen.

Also hab ich herausgefunden, wie ich die .asm-Datei kompiliert kriege, um den Code
dann trial&error-mäßig zu bearbeiten. (habe von Assembler keine Ahnung und es
würde Jahre brauchen, bis ich diesen Code verstehe)

Damit hab ich dann ca. 6 Stunden verbracht. Den Arpeggiator hab ich sofort erfolgreich
entfernt. Das war leicht.

Das CV-Problem jedoch leider nicht. Nach stundenlangem erfolgloen Abklappern der Befehle,
konnte ich zumindest die Funktion des CV-Outs so hinbekommen, wie ich es wollte,
indem ich in der letzten Sub "outputOff" drei Zeilen wiefolgt auskommentiert hab:

outputOff:
clr r16
; out OCR1A,r16

cbi PORTB,3
cbi PORTB,0
; ldi r16, 0b00011011
; out DDRB,r16

ret


Allerdings funktionierte dann das GATE nicht mehr richtig.
Weiß vielleicht jemand von euch, was man da machen kann?
Ich nehme an, dass es für eine derart kostengünstige und simple Lösung
breites Interesse in der DIY Community gibt.

mfG.
 
Assembler? Geil, jemand hat mich nach 1982 gebeamt und ich lese die 64er...:schwachz:
Sorry für off-topic, verziehe mich zur Strafe in die Ecke.:amen:
 
edit: bitte den Link kopieren und in die Adresszeile einfügen. Ich weiß wirklich nicht, was mit diesem Forum los ist, aber ich kann weder den Ursprungspost bearbeiten (Fehlermeldung, SPAMVERDACHT!), noch kann ich anständig Links einfügen.
 
Zb Hast du das laden des Timers auskommentiert
; out OCR1A,r16
Glaube nicht dass das gut ist ;-)
Denke auch, dass kann schon was mit dem Gate zu tun haben. Evtl wird dafür der Timer im PWM Mode betrieben oder einfach die gatelänge sonstwie gesteuert.
 
out OCR1A,r16 gibt auf dem PWM-Pin, der die analoge Steuerspannung ausgibt, beim NoteOFF eine Null aus,
wodurch die Steuerspannung wieder auf Null springt. Genau das soll vermieden werden.
Wenn dieser Befehl nicht ausgeführt wird, bleibt die Steuerspannung so, wie sie soll.
Allerdings kann dann das Gate nicht von derselben Note noch einmal getriggert werden.
Erst wenn man eine andere Note spielt.

Praktisch scheint der Befehl gleichzeitig Steuerspannung UND Gate zurückzusetzen.
Ich möchte allerdings nur das Gate zurücksetzen und nicht die Steuerspannung.

Wie bei einem normalen CV/GATE Interface.
 
Lösung gefunden! <3

Die Zeile out OCR1A,r16 muss tatsächlich entfernt werden.
Ebenso wie die beiden letzen Zeilen der outputOff-Routine.

Um das Gate-Problem zu lösen, müssen die Zeilen

in r16,OCR1A
cp r16,r19
breq setNoteEnd

in der SetNote-Subroutine entfernt werden.
Die Hilfe hab ich in einer Facebookgruppe bekommen.


Sobald ich das CV Interface auf einem brauchbaren Level habe,
poste ich den optimierten Code, den überarbeiteten Schaltplan (output buffer und Gedöns).
Vorher frag ich aber nochmal den Urheber, ob das für ihn so okay ist.

Jetzt mach ich drei Kreuze. <3

wünsche euch noch eine gute Nacht!
 
Freut mich das du damit klar kommst, je länger ich mir den Schaltplan und den Code dazu anschaue desto mehr Fragezeichen kommen auf.
Du willst das ja als Midi2CV incl. Gate einsetzen, oder? Ich sehe in dem Schaltplan nur einen gAte "Eingang" und der wird von dem DDRB=DataDirectionRegisterPortB auch als Input gesetzt, ungewöhnlich ist das sofort nach dem Setzen als Input ein Bit dorthin ausgegeben wird?
Aber vielleicht hast du da ja aufgeräumt, ich an deinen Stelle würde nur die Midischleife und die Ausgaberoutine mit den passenden Werten behalten und den Rest neu machen.

Aber meiner Meinung nach ist das auch die falsche MCU für so eine Anwendung, ATTyny85 hat keine UART und du musst die MidiBits pollen, mit einem Frequenzbestimmenden Bauteil (0,1uf) stelle ich mit das ein bisschen wackelig vor, außerdem kann man eine Onboard UART Interrupt gesteuert laufen lassen, aber ich hab noch kein OpenSource Midi-Projekt gesehen bei dem der MidiPort Interrupt driven ist.
 
Meine Elektroniker Lehre ist laaaaange her und ich habe bis jetzt nur recht wenig eigene Schaltungen mit Mikrocontroller gemacht. Aber generell nimmt man doch einfach einen Transistor oder einen Treiber IC um die Ausgänge des Mikrocontrollers nicht mehr als nötig zu belasten.
 
Das Ding nutzt Software-UART. Wenn ich's mitm Alphajuno als Midikeyboard anspiele, gibt's auch bei übertrieben viel Gewusel auf den Tasten keine Hänger. Für 'nen einfachen Monosynth ist die Schaltung ideal. Hab's jetzt auf Punktraster gelötet und es lief gleich
beim ersten Test. So simpel aufzubauen. Ick freu mir. Plane einen Analogen Modularsynth, der mit 5V läuft.
 
@JuBi:

PB3 ist GATE OUT,
PB0 ist TRIG OUT (für den retrigger input von Hüllkurven z.B.)
PB1 ist Keyboard CV
PB4 ist Pitch wheel CV OUT. Das ist cool. Damit kann man ja alles Mögliche modulieren.
 
@hertz4
mein Fehler, beim Atmel ist das DDRX Register genau anders herum wie bei Microchip, 0=1 und 1=0, hätte ich nicht gedacht :)
Funktioniert das mit dem PWM Ausgang korrekt, also erzeugt er die richtigen Töne in 1V/Okt ?
 
Sobald ich etwas zwischen den Fingern hab, das zuverlässig auf industriell-standardisiertes 1V/oct reagiert, sag ich bescheid.
Es gibt allerdings ein Video, in dem der Original-Coder damit sein Monotron steuert.

Ansehen: https://www.youtube.com/watch?v=MoWhCwxV-Dk


Wenn der Oszillator 'ne exponentiell ansteigende Steuerspannung frisst,
ist es nur eine Frage der Skalierung, ob n halbes oder n ganzes Volt je Oktave anliegen.

Morgen hab ich n bisschen Zeit, da bastel ich mal 'nen VCO, der sich mit den Steuerspannungen
vom microbrute und vom erebus gut vertragen hat. Würde mich wundern, wenn das nich klappen würde.
 
At line 140 is the main loop, which receives bytes and branches based on the status. There are several compares against binary data for noteon, noteoff, etc. The midi standard has the lowest four bits of the status byte represent the channel. So, if you add an offset to each of those constants you will change the channel number, e.g.

cpi r20, 0b10010000 +4
breq noteon

to listen to midi channel 5. Or, you could mask those bits right after the receiveByte in the main loop, and listen to all channels.
 


Neueste Beiträge

News

Zurück
Oben