Jump to content

MidiBox Seq V4 E-Pin für weiter LCDs


Gidien
 Share

Recommended Posts

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

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by Gidien
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

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...