Gidien Posted January 8, 2016 Report Share Posted January 8, 2016 Moin, moin, ich versuche seit ein paar Tagen 2 4x40 LCDs mit Midibox Seq V4 ans laufen zu bringen. Leider ohne Erfolg. Ich weiß alle Menüs sind nur für 2 Lines geschrieben, das kann auch so bleiben. Aber ich möchte die Software erweitern und einige Controllerfunktionen für Bitwig implementieren. Dafür benötige ich mehr Platz auf dem Display. Ich habe als Core ein STM32F3Discovery. Leider weiß ich nicht so genau, wo die zwei weiteren E-Pin auf dem Core angeschossen werden. In der seq_lcd.c steht: The 2x80 screen is buffered and can be output over multiple LCDs * (e.g. 2 * 2x40, but also 4 * 2x20) Um die beiden 4x40 LCD zu betreiben , benötige ich 4 E-Pins wie für die 4 * 2x20 Konfiguration) Also habe ich erstmal die seq_lcd.c erstmal angepasst. // can be overruled in mios32_config.h #ifndef LCD_NUM_DEVICES # define LCD_NUM_DEVICES 4 #endif #ifndef LCD_COLUMNS_PER_DEVICE # define LCD_COLUMNS_PER_DEVICE 20 #endif Die Folge ist, das ersten 40 Zeichen in 20er Blöcke auf beide LCD in den oberen Reihen geschrieben werden, die letzen 40 Zeichen aber nicht. Die beiden zusätzlichen E-Pins sind an J10B D0 und D1 angeschlossen. Wenn ich die app_lcd.c richtig gelesen habe, sind die Pins D0 - D7 auf J10B für weitere E-Pins vorgesehen. Sind die Anschlüsse dort richtig ??? Gruß Gidien Quote Link to comment Share on other sites More sharing options...
TK. Posted January 9, 2016 Report Share Posted January 9, 2016 Hallo Gidien, MIOS32 wird standardmaessig nur die beiden ersten LCDs initialisieren. Du muesstest also in SEQ_LCD_Init() noch folgendes einbauen (habe das gerade dementsprechend im SVN repository geaendert): s32 SEQ_LCD_Init(u32 mode) { u8 dev; // first two LCDs already initialized in main.c // for the case that more than two LCDs have been configured: for(dev=2; dev<LCD_NUM_DEVICES; ++dev) { MIOS32_LCD_DeviceSet(dev); MIOS32_LCD_Init(0); } // switch back to first LCD MIOS32_LCD_DeviceSet(0); return 0; // no error } Quote Die beiden zusätzlichen E-Pins sind an J10B D0 und D1 angeschlossen. Wenn ich die app_lcd.c richtig gelesen habe, sind die Pins D0 - D7 auf J10B für weitere E-Pins vorgesehen. Sind die Anschlüsse dort richtig ??? Ja, das sind die richtigen Pins Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
Gidien Posted January 9, 2016 Author Report Share Posted January 9, 2016 Danke Thorsten, die LCDs scheinen nun initialisiert zu werden, aber anzeigen tun sie noch nichts. Scheint als wenn die Funktion s32 APP_LCD_Data(u8 data) durch lcd_testmode == 1 verlassen wird, wenn mios32_lcd_device >= 2 ist. Gruß Gidien Quote Link to comment Share on other sites More sharing options...
TK. Posted January 9, 2016 Report Share Posted January 9, 2016 Die Anzahl der LCDs setzt man im Bootloader, das muesstest Du noch nachholen falls noch nicht geschehen. Siehe auch: http://www.ucapps.de/midibox_ng_manual_lcd.html In der Bootloader Update Application folgende Kommandos ausfuehren: set lcd_type CLCD set lcd_num_x 4 set lcd_num_y 1 set lcd_width 20 set lcd_height 2 store Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
Gidien Posted January 9, 2016 Author Report Share Posted January 9, 2016 (edited) 2 hours ago, TK. said: Leider keine Veränderung , Immer wenn mios32_lcd_device >= 2 ist, springt er aus der function APP_LCD_Data(u8 data) über : if( lcd_testmode ) return -1; // direct access disabled in testmode Ich habe einen Breakpoint bei return -1 gesetzt. Das Programm hält dort immer wenn lcd device >=2 ist , obwohl lcd_testmode == 0 ist. Thread [1] (Suspended: Breakpoint hit.) 8 APP_LCD_Data() app_lcd.c:782 0x08050392 7 MIOS32_LCD_PrintChar() mios32_lcd.c:451 0x080464fc 6 SEQ_LCD_Update() seq_lcd.c:270 0x080414d6 5 SEQ_UI_LCD_Update() seq_ui.c:2741 0x080115d6 4 SEQ_UI_LCD_Handler() seq_ui.c:2619 0x08011b50 3 SEQ_TASK_Period1mS_LowPrio() app.c:499 0x0801047e 2 TASK_Period1mS_LowPrio() tasks.c:171 0x08010a66 1 <symbol is not available> 0x00000000 2969-data-evaluate-expression lcd_testmode 2969^done,value="0 '\\000'" (gdb) 2970-data-evaluate-expression mios32_lcd_device 2970^done,value="2 '\\002'" (gdb) Nur mit dem Bootloader werden alle LCDs angesprochen und sind Ready!. Edited January 9, 2016 by Gidien Quote Link to comment Share on other sites More sharing options...
TK. Posted January 9, 2016 Report Share Posted January 9, 2016 Die Breakpoints werden bei dem optimierten Code nicht immer zuverlaessig funktionieren. Dahinter steht ja: // check if if display already has been disabled if( !(display_available & (1ULL << mios32_lcd_device)) ) return -1; welchen Wert hat display_available? Ich wuerde 15 (hexadezimal 0xf) erwarten. Evtl. macht es Sinn, den Breakpoint in SEQ_LCD_Update() zu setzen, bspw. an der Stelle wo MIOS32_LCD_DeviceSet aufgerufen wird - und ab da mal durchsteppen. Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
Gidien Posted January 10, 2016 Author Report Share Posted January 10, 2016 display_available available ist leider nur 3. Das wäre dann nur für zwei Displays richtig? Sollte hier gesetzt werden, richtig? s32 APP_LCD_Init(u32 mode) // enable display by default display_available |= (1ULL << mios32_lcd_device); Weiß leider nicht wie ich die Init Phase debuggen kann. Gruß Gidien Quote Link to comment Share on other sites More sharing options...
Gidien Posted January 10, 2016 Author Report Share Posted January 10, 2016 OK nach APP_LCD_INIT ist Display_available 15 , aber dann scheint APP_LCD_PollUnbusy diesen wieder auf 3 zu setzen. if( APP_LCD_PollUnbusy(10000) < 0 ) { // disable display display_available &= ~(1ULL << mios32_lcd_device); Leider habe ich keine Ahnung warum. Quote Link to comment Share on other sites More sharing options...
TK. Posted January 10, 2016 Report Share Posted January 10, 2016 Ich habe eine Vermutung: J10B wird ja beim STM32F4 core fuer die optionalen DIN Clock Outputs verwendet, die stehen nun natuerlich im Konflikt mit den LCD Pins (die ja urspruenglich nicht in der Firmware vorgesehen waren). Ich habe nun seq_cv, seq_hwcfg und seq_file_hw so geaendert, dass die Pins nicht initialisiert werden sollten, wenn im MBSEQ_HW.V4 File "J5_ENABLED" auf 0 gesetzt wurde. Probiere es mal aus: hole Dir die aktuellen Sourcen aus dem Repository, aendere den Wert fuer J5_ENABLED in Deinem MBSEQ_HW.V4 file auf der SD Karte, und tippe dann "reset" im MIOS Terminal. Danach sollten die LCDs eigentlich funktionieren. Falls nicht, muesste man ueberpruefen, ob die Pins noch irgendwo anders gesetzt, und nicht ueber die neue Variable "seq_hwcfg_j5_enabled" gegated werden. Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
Gidien Posted January 10, 2016 Author Report Share Posted January 10, 2016 Nice, danke nun funktioniert alle vier LCD's. Danke für die schnelle Hilfe. Quote Link to comment Share on other sites More sharing options...
Gidien Posted January 10, 2016 Author Report Share Posted January 10, 2016 Ich hätte da noch eine andere Frage. Ich habe als Datawheel Encoder einen mit Taster. Betätige ich diesen Taster, zeigt Mios Studio , dass dieser SR Pin nicht hinterlegt ist. Kann ich irgendwo diesen Encoder Button mit einer Funktion hinterlegen? Wenn ja, wo sollte ich das am besten machen? Ist es möglich, dies nur für einen Doppelklick zu ermöglichen, um eine Fehlbedienung zu verhindern? Ok sind doch mehrere Fragen. Ich würde diesen Button gerne nutzen, um in mein Bitwig Menü zu gelangen. Quote Link to comment Share on other sites More sharing options...
TK. Posted January 10, 2016 Report Share Posted January 10, 2016 Am einfachsten waere es wohl, wenn Du eine bereits vorhandene Funktion, die Du nicht benoetigst, kannibalisierst. Bspw. den "BUTTON_MIXER". Die Pin-Zuweisung wuerdest Du in Deinem MBSEQ_HW.V4 File eintragen (suche dort nach BUTTON_MIXER) Diese wird dann die SEQ_UI_Button_Mixer() Funktion in seq_ui.c aufrufen... ab dort kannst Du dann weitermachen ;-) Alternativ eine neue Button-Funktion einbauen, doch das waere umstaendlicher - Du koenntest bspw. nach einem geeigneten Stichwort greppen, so weisst Du, welche Files zu aendern sind. Hier ein Beispiel: MacMini2:midibox_seq_v4 TK$ grep -i track_transpose core/* core/seq_file_hw.c: } else if( strcasecmp(parameter, "TRANSPOSE") == 0 || strcasecmp(parameter, "TRACK_TRANSPOSE") == 0 ) { core/seq_file_hw.c: seq_hwcfg_button.track_transpose = din_value; core/seq_file_hw.c: } else if( strcasecmp(parameter, "TRANSPOSE") == 0 || strcasecmp(parameter, "TRACK_TRANSPOSE") == 0 ) { core/seq_file_hw.c: seq_hwcfg_led.track_transpose = dout_value; core/seq_hwcfg.c: .track_transpose = ((( 0 -1)<<3)+ 0), core/seq_hwcfg.c: .track_transpose = ((( 0 -1)<<3)+ 0), core/seq_hwcfg.c: .track_transpose = ((( 0 -1)<<3)+ 0), core/seq_hwcfg.h: u8 track_transpose; core/seq_hwcfg.h: u8 track_transpose; core/seq_ui.c: if( pin == seq_hwcfg_button.track_transpose ) core/seq_ui.c: SEQ_LED_PinSet(seq_hwcfg_led.track_transpose, ui_page == SEQ_UI_PAGE_TRKTRAN); In SEQ_UI_Button_FootSwitch siehst Du, wie man einen Doppelklick realisiert. Best Regards, Thorsten. Quote Link to comment Share on other sites More sharing options...
Gidien Posted January 12, 2016 Author Report Share Posted January 12, 2016 Danke Thorsten, Für einen echten Doppelklick musste ich folgende Teil so verändern. if( depressed ) { // if footswitch time passed between pressed and depressed is less than fs_time_delay miliseconds, clear track. if( ( MIOS32_TIMESTAMP_GetDelay(fs_time_control) < fs_time_delay ) && ( fs_time_control != 0 ) ) { SEQ_UI_Button_Clear_Track(0); } else { // store pressed timestamp fs_time_control = MIOS32_TIMESTAMP_Get(); } } Vorher wurde nur die Zeit zwischen drücken und loslassen gemessen. Jetzt nimmt er die Zeit zwischen zweimal drücken (Doppelklick). Mal sehen über welche Schwierigkeiten ich noch so stolpere. Ich werde sicherlich noch ein paar weitere Fragen haben. 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.