Evtl. funktioniert es auch mit einer Aenderung in mb64_button.inc. Dort gibt es bspw. die Funktion “MB64_BUTTON_Toggle”, welche (wenn sich der Taster im Toggle Modus befindet) eine LED beim ersten druecken ein- und beim naechsten druecken ausschaltet. Hier koennte man abhaengig von der Button Nummer auch verschiedene Flags des MB64_BUTTON_VALUES_SR0 arrays gleichzeitig setzen/loeschen
Falls Dir die Assemblerprogrammierung zu kompliziert wird (ich gebe zu, an diesen Stellen habe ich zuviel optimiert ;-), koenntest Du die Steuerungslogik immer noch mit C realisieren, muesstest dabei jedoch auf die speziellen Features der MB64 Applikation verzichten, denn die vertraegt sich nicht mit C
Den optimierten Assembler-Code will ich mir eher nicht reinziehen:) Aber da gibts doch eine Variante nur mit 64 Reglern und bis zu 128 Buttons und LEDs… Mehr will ich ja eigentlich nicht.
Da könnte man doch am Ende der Funktion USER_DIN_NotifyToggle die entsprechenden Abfragen viel leichter einbauen, oder?
Gibts eigentlich eine Funktionsreferenz für die Assembler-Befehle?? Ich hab mir mal die Datenblätter des PIC18F452 gesaugt, aber da fehlen viele Befehle…
Den optimierten Assembler-Code will ich mir eher nicht reinziehen:) Aber da gibts doch eine Variante nur mit 64 Reglern und bis zu 128 Buttons und LEDs… Mehr will ich ja eigentlich nicht.
Da könnte man doch am Ende der Funktion USER_DIN_NotifyToggle die entsprechenden Abfragen viel leichter einbauen, oder?
Du meinst das C-Beispiel (ain64_din128_dout128_v2_0)?
Da lässt sich das natürlich leichter einbauen. Aber es fehlen dir dann natürlich alle Features der MB64.
Gibts eigentlich eine Funktionsreferenz für die Assembler-Befehle?? Ich hab mir mal die Datenblätter des PIC18F452 gesaugt, aber da fehlen viele Befehle…
Da sind eigentlich alle Befehle drin (Kapitel 20 und 20.1). Welche vermisst Du denn?
Ich hab das Ganze jetzt in C gemacht. Meine Lösung sieht folgendermaßen aus:
void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam
{
if(pin_value==0x00) //nur beim Herunterdrücken der Taster reagieren
{
// Midi Events senden
MIOS_MIDI_TxBufferPut(0x90); // Note Event at channel #1
MIOS_MIDI_TxBufferPut(pin); // just forward the pin number (0..127)
MIOS_MIDI_TxBufferPut(0x7f); // Velocity = 0x7f when button pressed
// verknüpfte Buttons 1-32
if(pin < 33)
{
MIOS_DOUT_SRSet(1, 0x00); //löschen der ersten 32 LEDs
MIOS_DOUT_SRSet(2, 0x00);
MIOS_DOUT_SRSet(3, 0x00);
MIOS_DOUT_SRSet(4, 0x00);
MIOS_DOUT_PinSet1(pin); //Setzen der zugehörigen LED
}
// die übrigen Buttons toggeln die LEDs
else
{
if(MIOS_DOUT_PinGet(pin)==0) // LED aus -> LED an
MIOS_DOUT_PinSet1(pin);
else // LED an -> LED aus
MIOS_DOUT_PinSet0(pin);
}
}
}
Compilieren tuts schon mal, aber ich habs noch nicht getestet, da mein Controller noch nicht ganz fertig ist…
Frage: Stimmt meine Zählweise bei den Buttons + LEDs und den Registern ??? (pin von 1 ab und die Shift-Register bei MIOS_DOUT_SRSet auch ab 1)