Jump to content

schwierigkeiten mit der programmierung meiner midibox


consi_hh
 Share

Recommended Posts

Hallo zusammen, nachdem ich meine midibox im Februar fertiggestellt hab, versuche ich mich in die assembler programmierung einzuarbeiten um meine Dout´s zu schalten.  Leider ohne erfolg,  entweder haut es beim kompilieren nicht hin oder meine box macht später was ganz anderes. Momentan läuft mbox64 drauf

Nun nochmal wie ich es gern hätte:

Variante 1 :  Beim erste mal drücken eines buttons wird "note on" gesendet, Led geht an - beim 2.mal drücken wird wieder "note on" gesendet und die led geht aus.

Ich hab es so versucht wie es in diesem fall:

http://www.midibox.org/forum/index.php?PHPSESSID=5dfc2ee33bcf034d33c5c8429b719cf8&topic=2423.0 beschrieben wurde, das hat er aber nicht kompiliert. ich glaube er hatte sich an dem befehl "ifset" gestört.

Variante 2: Ich habe ein block von 10 Tasten jeweils mit led. Wenn ich eine taste drücke wird "note on" gesendet led geht an. Wenn ich eine andere taste drücke geht die led der vorherigen taste aus, die neue sendet "note on" und die led leuchtet. 

Hab da schonmal verschieden sachen versucht aber nix gescheites hinbekommen..

Kann mir jemand von euch helfen der von der programmierung mehr ahnung hat als ich?  ich bin da mehr handwerklich begabt ;)

Link to comment
Share on other sites

...versuche ich mich in die assembler programmierung einzuarbeiten um meine Dout´s zu schalten....

C-Skeleton versucht? So kommst Du um das vllt ein wenig abstrakt und abschreckend wirkende ASM herum ;)

Variante 1 :  Beim erste mal drücken eines buttons wird "note on" gesendet, Led geht an - beim 2.mal drücken wird wieder "note on" gesendet und die led geht aus.

Soweit nicht weiter kompliziert.

ich glaube er hatte sich an dem befehl "ifset" gestört.

"Ich glaube" hilft beim Fehler finden nicht so richtig doll. Kopiere doch bitte die Ausgaben des Compilers und Deinen Source Code hier her.

Link to comment
Share on other sites

C-Skeleton versucht? So kommst Du um das vllt ein wenig abstrakt und abschreckend wirkende ASM herum
 

Habe ich, jedoch fand ich die möglichkeit über die vmidibox änderungen vorzunehmen ganz schön ohne den code ändern zu müssen.

Soweit nicht weiter kompliziert.

Das hab ich hier im Forum auch schonmal gelesen, habs aber nicht hinbekommen!

"Ich glaube" hilft beim Fehler finden nicht so richtig doll. Kopiere doch bitte die Ausgaben des Compilers und Deinen Source Code hier her.

in der main.asm hab ich folgendes geändert, so hatte ich es in dem oben verlinkten post gelesen:

;; --------------------------------------------------------------------------

;;  This function is called by MIOS when an button has been toggled

;;  Input:

;;    o Button number in WREG and MIOS_PARAMETER1

;;    o Button value MIOS_PARAMETER2:

;;      - 1 if button has been released (=5V)

;;      - 0 if button has been pressed (=0V)

;; --------------------------------------------------------------------------

USER_DIN_NotifyToggle

      ;; exit if button has been depressed

      IFSET  MIOS_PARAMETER2, 0, return

      ;; store button number in TMP1

      movff  MIOS_PARAMETER1, TMP1

      ;; toggle LED which corresponds to the button number

      movf    TMP1, W                ; button/LED number in TMP1

      call    MIOS_DOUT_PinGet        ; get LED status

      xorlw  0xff                    ; invert status

      movwf  MIOS_PARAMETER1        ; store new status in MIOS_PARAMETER1

      movf    TMP1, W                ; button/LED number in TMP1

      call    MIOS_DOUT_PinSet        ; set new LED value (expects value in MIOS_PARAMETER1)

      return

beim kompiliere bekam ich folgende fehlermeldung

C:\Dokumente und Einstellungen\consi\Eigene Dateien\midibox64_v2_4a\midibox64_v

_4a>gpasm -p 18f452 main.asm

main.asm:553:Error [179] Unknown opcode "IFSET"

Link to comment
Share on other sites

Dankeschön,  kompilieren tuts, allerdings läuft es nicht so wie es soll. Habe nur das "ifset" durch dein vorschlag ergänzt. jetzt geben die buttons keine noten mehr aus ud die LED´s leuchten auch nur kurz in dem moment wo ich draufdrücke.

Ist es nicht einfach möglich den toggle modus de ich z.B. über die vmidibox eistellen kann so abzuädern das er nur "note on" befehle bei jeder betätigung des tasters sendet??

Link to comment
Share on other sites

Der ASM Quellcode, den Du gepostet hast kümmert sich auch ausschließlich um die LEDs und macht rein garnix mit MIDI, daher kann ich Dein Problem leider nicht nachvollziehen.

Ich würde Dir empfehlen das mal mit dem C-Skeleton zu versuchen, dass wird Dir deutlich leichter fallen, da es weniger kryptisch ist. Sowas in der Art sollte da funktionieren:

void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam
{
if (pin_value == 1)
return;

MIOS_DOUT_PinSet(pin, MIOS_DOUT_PinGet(pin) ^ 0xFF);

MIOS_MIDI_BeginStream();

MIOS_MIDI_TxBufferPut(0x90);
MIOS_MIDI_TxBufferPut(0x3C + pin);
MIOS_MIDI_TxBufferPut(0x64 + pin);

MIOS_MIDI_EndStream();
}[/code]

Ungetestet, im Forum geschrieben, aber wer weiß, vllt. geht's ja :-)

Link to comment
Share on other sites

Vielen Dank, das hat mir schonmal weitergeholfen jetzt hauts mit den LEDs hin ;) 

... hab nun noch ne frage bezüglich der pots.

Ich hab insgesamt 11 Fader die die jeder auf einem channel ein volume control senden sollen.

So sieht mein Code jetzt aus:

void AIN_NotifyChange(unsigned char pin, unsigned int pin_value) __wparam

{

 

  MIOS_MIDI_TxBufferPut(0xb0);

  MIOS_MIDI_TxBufferPut(07); 

  MIOS_MIDI_TxBufferPut(MIOS_AIN_Pin7bitGet(pin));   

Wie stell ich das jetzt ein das sie alle auf unterschiedlichen midichanels senden?? das 0xB0 gibt ja an CC auf Channel 1, hab es nur nicht so ändern können das er z.B. je nach Pin ne anderen Channel hat.

Link to comment
Share on other sites

Der MIDI-Kanal befindet sich in den unteren 4bit des Status-Bytes

Moegliche Werte: 0xb0 (fuer Kanal 1) bis 0xbf (fuer Kanal 16)

Das koennte man auch so schreiben: "0xb0 + kanal_von_0_gezaehlt"

wobei "kanal_von_0_gezaehlt" ein Wert zwischen (dezimal) 0 und 15 sein sollte.

In Deinem Anwendungsfall (11 Fader, pin == 0..10) koenntest Du den Kanal wie folgt bestimmen:

[tt]

  MIOS_MIDI_TxBufferPut(0xb0 + pin);

  MIOS_MIDI_TxBufferPut(07); 

  MIOS_MIDI_TxBufferPut(MIOS_AIN_Pin7bitGet(pin));   

[/tt]

Gruss, Thorsten.

Link to comment
Share on other sites

So ich bin nen stück weiter, habe jetzt die taster und LED´s des ersten shiftregisters gekoppelt so das immer nur eine LED leuchtet, alle anderen buttons togglen die led`s.

Wie bekomme ich es nun hin das ich zum bsp die led´s des 2. shiftregisters sozusagen zusammenfasse?

ich müsste dann ja vorgeben Pin 8-15, wie kann ich das lösen ?  "If(pin 8 -15)" klappt nicht! ;)

So sieht mein code jetzt aus:

void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam

{

// Midi Events senden

MIOS_MIDI_BeginStream();

MIOS_MIDI_TxBufferPut(0x90);

MIOS_MIDI_TxBufferPut(pin);     

MIOS_MIDI_TxBufferPut(pin_value ? 0x00 : 0x7f);

if(pin < 8 )

{

MIOS_DOUT_SRSet(0, 0x00);

MIOS_DOUT_PinSet1(pin);  

}

else

{if (pin_value == 1)

return;

MIOS_DOUT_PinSet(pin, MIOS_DOUT_PinGet(pin) ^ 0xFF);

MIOS_MIDI_BeginStream();

MIOS_MIDI_TxBufferPut(0x90);

MIOS_MIDI_TxBufferPut(0x3C + pin);

MIOS_MIDI_TxBufferPut(0x64 + pin);

MIOS_MIDI_EndStream();

}

}

Link to comment
Share on other sites

Dein if (pin 8 -15) soll was genau machen?! ???


unsigned char meinLetzerDinPin = 12;
// 12 Buttons an den ersten 12 Pins

if (pin < meinLetzterDinPin) {
    // alles klar, es ist einer der ersten 12 pins/buttons also entsprechende LED anmachen
    MIOS_DOUT_PinSet1(pin);
} else {
    // ...
}

// ...
[/code]

Dein Code wird übrigens hier deutlich lesbarer, wenn Du den code-Tag statt des quote-Tags verwendest.

Link to comment
Share on other sites

..das mit dem code-tag wusste ich nicht..  nu weiß ich bescheid.

Dann versuch ich mal zu erkläre was ich vorhab...  ich habe auf meiner midibox blöcke mit jeweils 8 Tastern und zugehöriger LED.

Mit dem code den ich gepostet hatte funktioniert es so, das von den ersten 8 Tastern jeweils nur die LED leuchtet, deren Taster ich gedrückt habe bis ich den nächsten drücke.

Nun möchte ich mit den tastern 9-16 genauso verfahren, sie sollen aber unabhägig von den ersten 8 sein.

Ich dachte mir das so in etwa:

void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam
{


// Midi Events senden
MIOS_MIDI_BeginStream();
MIOS_MIDI_TxBufferPut(0x90);	
MIOS_MIDI_TxBufferPut(pin);      
MIOS_MIDI_TxBufferPut(pin_value ? 0x00 : 0x7f); 	


if(pin < 8)                  // Die ersten 8 Pins      
{
MIOS_DOUT_SRSet(0, 0x00);	//dOUT sr 0 soll alle LED`s ausschalten
MIOS_DOUT_PinSet1(pin);		// Led des betätigten Buttons geht an  
}

if(pin 8 - 15)              // Pin 8 - 15    [color=red]allerdigs weiß ich nicht wie ich das schreiben soll[/color]
{
MIOS_DOUT_SRSet(1, 0x00);	//dOUT sr 1 soll alle LED`s ausschalten
MIOS_DOUT_PinSet1(pin);		// Led des betätigten Buttons geht an    
}

else
{if (pin_value == 1)                        //alle anderen taster togglen die zugehörige LED
return;

MIOS_DOUT_PinSet(pin, MIOS_DOUT_PinGet(pin) ^ 0xFF);

MIOS_MIDI_BeginStream();

MIOS_MIDI_TxBufferPut(0x90);
MIOS_MIDI_TxBufferPut(0x3C + pin);
MIOS_MIDI_TxBufferPut(0x64 + pin);

MIOS_MIDI_EndStream();
}

}

Link to comment
Share on other sites

Klar, hier das ergebnis, ich denke man kann sicherlich och ne menge optimieren, aber fürt mich reicht es und es tut was es soll ;)   

Hier der code :

void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam
{


// Midi Events senden
MIOS_MIDI_BeginStream();
MIOS_MIDI_TxBufferPut(0x90);	
MIOS_MIDI_TxBufferPut(pin);      
MIOS_MIDI_TxBufferPut(pin_value ? 0x00 : 0x7f); 	


if(pin < 4)             	// bei button 0-3 soll nurletzte gedrückte led leuchten
{
MIOS_DOUT_PinSet0(0x00);
MIOS_DOUT_PinSet0(0x01);
MIOS_DOUT_PinSet0(0x02);
MIOS_DOUT_PinSet0(0x03);	
MIOS_DOUT_PinSet1(pin);		  
}
else
{if(pin >=4 && pin <=7)    	// bei button 4-7 soll nurletzte gedrückte led leuchten
{
MIOS_DOUT_PinSet0(0x04);
MIOS_DOUT_PinSet0(0x05);
MIOS_DOUT_PinSet0(0x06);
MIOS_DOUT_PinSet0(0x07);	
MIOS_DOUT_PinSet1(pin);	
}
else
{if(pin >=8 && pin <=15)    	// bei button 8-15 soll nurletzte gedrückte led leuchten
{
MIOS_DOUT_SRSet(1, 0x00);	
MIOS_DOUT_PinSet1(pin);	
}
else
{if(pin >39 && pin <50)		// bei button 40 - 49 nurletzte gedrückte led leuchten
{
MIOS_DOUT_SRSet(5, 0x00);	
MIOS_DOUT_PinSet0(0x30);
MIOS_DOUT_PinSet0(0x31);
MIOS_DOUT_PinSet1(pin);	
}
else
{if(pin >=56 && pin <=57)	// led von button 56 - 57 soll nur leuchten wenn button gedrückt
{
MIOS_DOUT_PinSet(pin, MIOS_DOUT_PinGet(pin) ^ 0xFF);	
}
else
{if(pin ==58)	// Button 58 soll alle LED´s ausschalten
{
MIOS_DOUT_SRSet(0, 0x00);
MIOS_DOUT_SRSet(1, 0x00);
MIOS_DOUT_SRSet(2, 0x00);
MIOS_DOUT_SRSet(3, 0x00);
MIOS_DOUT_SRSet(4, 0x00);
MIOS_DOUT_SRSet(5, 0x00);
MIOS_DOUT_SRSet(6, 0x00);
MIOS_DOUT_SRSet(7, 0x00);
}
else                           //alle anderen buttons  sollen die leds togglen
{if (pin_value == 1) 
return;

MIOS_DOUT_PinSet(pin, MIOS_DOUT_PinGet(pin) ^ 0xFF);

MIOS_MIDI_BeginStream();

MIOS_MIDI_TxBufferPut(0x90);
MIOS_MIDI_TxBufferPut(0x3C + pin);
MIOS_MIDI_TxBufferPut(0x64 + pin);

MIOS_MIDI_EndStream();
}}}}}}

}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...