consi_hh Posted April 17, 2008 Report Share Posted April 17, 2008 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 draufNun 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 ;) Quote Link to comment Share on other sites More sharing options...
nILS Posted April 17, 2008 Report Share Posted April 17, 2008 ...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. Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 17, 2008 Author Report Share Posted April 17, 2008 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) returnbeim kompiliere bekam ich folgende fehlermeldung C:\Dokumente und Einstellungen\consi\Eigene Dateien\midibox64_v2_4a\midibox64_v_4a>gpasm -p 18f452 main.asmmain.asm:553:Error [179] Unknown opcode "IFSET" Quote Link to comment Share on other sites More sharing options...
nILS Posted April 17, 2008 Report Share Posted April 17, 2008 IFSET ist ein Makro, dass scheinbar bei Dir nicht da ist. Ersetze das ganze durch sowas wie btfsc MIOS_PARAMETER2, 0return[/code]Das sollte das Problem beheben. Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 18, 2008 Author Report Share Posted April 18, 2008 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?? Quote Link to comment Share on other sites More sharing options...
nILS Posted April 19, 2008 Report Share Posted April 19, 2008 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 :-) Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 20, 2008 Author Report Share Posted April 20, 2008 Um das gaze in C zu machen muss ich also erstmal die "ain64_din128_dout128" anwendug raufladen. Oder hab ich da nen denkfehler?? Quote Link to comment Share on other sites More sharing options...
nILS Posted April 20, 2008 Report Share Posted April 20, 2008 Ich würde vorschlagen einfach das C Skeleton zu nehmen. Das ist schon alles drin und dran und drauf und Du brauchst nur Deinen Code einfügen, kompilieren, hochladen. Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 20, 2008 Author Report Share Posted April 20, 2008 dumme frage: wo find ich das denn?? ??? Quote Link to comment Share on other sites More sharing options...
TK. Posted April 20, 2008 Report Share Posted April 20, 2008 Unter http://www.ucapps.de/mios_download.htmlGruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 21, 2008 Author Report Share Posted April 21, 2008 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. Quote Link to comment Share on other sites More sharing options...
TK. Posted April 21, 2008 Report Share Posted April 21, 2008 Der MIDI-Kanal befindet sich in den unteren 4bit des Status-BytesMoegliche 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. Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 22, 2008 Author Report Share Posted April 22, 2008 Vielen Dank, hab schon ne menge gestern probiert aber darauf bin ich nicht gekommen ;) wobei es ja so nahe liegt ;) Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 23, 2008 Author Report Share Posted April 23, 2008 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 sendenMIOS_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();} } Quote Link to comment Share on other sites More sharing options...
nILS Posted April 23, 2008 Report Share Posted April 23, 2008 Dein if (pin 8 -15) soll was genau machen?! ???unsigned char meinLetzerDinPin = 12; // 12 Buttons an den ersten 12 Pinsif (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. Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 24, 2008 Author Report Share Posted April 24, 2008 ..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(); } } Quote Link to comment Share on other sites More sharing options...
consi_hh Posted April 29, 2008 Author Report Share Posted April 29, 2008 Soo, nen kleiner abschließender bericht: Nachdem ich mich nen bisschen in C eingearbeitet habe und von euch in die richtige Richtung gelenkt wurde klappts nu so wie es soll ;) Vielen dank nochmal... Quote Link to comment Share on other sites More sharing options...
nILS Posted April 29, 2008 Report Share Posted April 29, 2008 Magste das Ergebnis hier vielleicht auch noch posten? Kann durchaus jemand anderem viel Arbeit sparen ;) Quote Link to comment Share on other sites More sharing options...
consi_hh Posted May 4, 2008 Author Report Share Posted May 4, 2008 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(); }}}}}} } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.