All Activity

This stream auto-updates   

  1. Past Hour
  2. Troubleshooting midiphy SEQ v4+

    Please check the locations I mentioned and post a photo of your soldering. Don't worry, the pours are not connected otherwise nobody's board would work...
  3. Today
  4. Troubleshooting midiphy SEQ v4+

    Thanks. I can post a photo later today, but I'm looking at the PCB artwork you posted, and I am confused because it appears that the +5V and AGND nets are connected together in several places by the copper pour? Thanks-- --Adam
  5. MB6582 Control Surface troubleshooting

    Thank you, I hadn't spotted that guide so will work through it now. They are activating, but seem to be selecting something to do with modulation. When I press menu a column and row of the matrix flashes and it toggles through some modulation pages. Shift also. Filter mode seems to be working now. I thought it might be diodes or switches in the matrix section not right so have checked and re flowed all those joints too.
  6. MB6582 Control Surface troubleshooting

    it sounds like you've done a bit of this, but there is a button/encoder troubleshooting guide here in case you didn't find it already: and a link to a MIOS program to find shift register problems... what are the buttons doing instead of what they should? Or just not operating?
  7. Adding CS-line to AINSER8

    Ah, no. It's SMD soldered. So, traces are given.  But I double-checked the schematic and all looks well. Here is the excerpt from the PCB layout: Pin 6 of the connector comes from PE6 of the STM. The rest is the same as on the other MCP.
  8. Adding CS-line to AINSER8

  9. Sell my SEQ4V

    I'd like to sell my SEQ4V because it's one size too big for me. Except for the motherboard everything was done by myself. Mainboard is a LPC1769. The extension for the buffered outputs and Midi 3/4 are made on a bread board. The lower part is made of 3mm Plexi screwed on 19" carrier rails with wooden side parts. The device, power supply and the documents what was still made are delivered. I would like to sell it for 350€ + shippingI ( Shipping within Germany 8€, within the EU 18€.)  
  10. MB6582 Control Surface troubleshooting

    Almost there with this build, so close now thanks to everyone's help directly and in the many existing posts I have trawled. The next issue I have is a few of the buttons on the control surface are not doing what they should: Shift Menu Filter Mode I think some of the buttons on the side of the screen also. I went through schematics in another thread of the switch matrix and figured out it's JD8 and JD5 cables and associated areas on the main board that are associated with the switches. I've tried swapping around shift registers (I don't have spares), and also checking the solder joins around JD8 and JD5 as well as the switches themselves. No change to behaviour. The control surface to main board connections are solid. Also checked diode orientation on the CS board. All looks OK. Could the transistors have died? Any other pointers for troubleshooting this?  
  11. Adding CS-line to AINSER8

    Invert?! What do you mean with that?
  12. Troubleshooting midiphy SEQ v4+

    Can you post a picture of the soldering? The most likely place is on either of the two USB connectors. This is the bottom of the board with the +5V and 0V connections highlighted.
  13. Troubleshooting midiphy SEQ v4+

    Okay, this is sad, but my construction efforts have run into problems at the first test point: loading the firmware onto to the MCU. Eventually I figured out that there's a short between +5V and GND on the USB PCB itself. I finally isolated it to this PCB by disconnecting the ribbon cable between the two PCBs. I've also removed the TVS diode, figuring that it might be the most likely place for a solder short. I've examined my solder joints with a magnifier and microscope(!) and have found nothing. Could I obtain either a schematic or the PCB artwork for this PCB? It would help with locating the problem if I knew which traces are +5V and which are GND. I'm assuming that +5V is on the first two conductors of the ribbon cable and GND is the last two conductors, based on the silkscreen notations near the ribbon cable connector. The next thing I'm going to have to do is start removing parts one by one, which is unfortunate since removing things like the USB connectors will not be easy. Thanks-- --Adam
  14. Yesterday
  15. Adding CS-line to AINSER8

    Did you invert the 2 last modules?  
  16. Adding CS-line to AINSER8

    Yes. I did. I see the pulses on the CS line. 
  17. name not valid

    Sorry to rescue this ancient topic but I'm also facing this exact issue from time to time, is anyone impacted by it yet? Not really sure about my SD card, I'm pretty sure it was formatted under FAT32.   Thanks all!
  18. Adding CS-line to AINSER8

    ok. And physically, did you check the cs lines with the oscillo? you should see a periodic pulse.
  19. Adding CS-line to AINSER8

    No. As I don't use any other app and I stated above that I want to use it in NG TK surely took care of it. This is ainser.c: // $Id$ //! \defgroup AINSER //! //! AINSER module driver //! //! \{ /* ========================================================================== * * Copyright (C) 2011 Thorsten Klose ( * Licensed for personal non-commercial use only. * All other rights reserved. * * ========================================================================== */ ///////////////////////////////////////////////////////////////////////////// // Include files ///////////////////////////////////////////////////////////////////////////// #include <mios32.h> #include "ainser.h" ///////////////////////////////////////////////////////////////////////////// // Local variables ///////////////////////////////////////////////////////////////////////////// static u8 num_used_modules = AINSER_NUM_MODULES; static u8 ainser_enable_mask; static u8 ainser_muxed_mask; static u8 num_used_pins[AINSER_NUM_MODULES]; static u16 ain_pin_values[AINSER_NUM_MODULES][AINSER_NUM_PINS]; static u16 previous_ain_pin_value; static u8 ain_deadband[AINSER_NUM_MODULES]; ///////////////////////////////////////////////////////////////////////////// // Local Prototypes ///////////////////////////////////////////////////////////////////////////// static s32 AINSER_SetCs(u8 module, u8 value); ///////////////////////////////////////////////////////////////////////////// //! Initializes AINSER driver //! Should be called from Init() during startup //! \param[in] mode currently only mode 0 supported //! \return < 0 if initialisation failed ///////////////////////////////////////////////////////////////////////////// s32 AINSER_Init(u32 mode) { s32 status = 0; int module, pin; // currently only mode 0 supported if( mode != 0 ) return -1; // unsupported mode #if AINSER_SPI_OUTPUTS_OD // pins in open drain mode (to pull-up the outputs to 5V) status |= MIOS32_SPI_IO_Init(AINSER_SPI, MIOS32_SPI_PIN_DRIVER_STRONG_OD); #else // pins in push-poll mode (3.3V output voltage) status |= MIOS32_SPI_IO_Init(AINSER_SPI, MIOS32_SPI_PIN_DRIVER_STRONG); #endif // extra CS pin #if AINSER_NUM_MODULES >= 3 MIOS32_BOARD_J10_PinInit(14, MIOS32_BOARD_PIN_MODE_OUTPUT_OD); #endif // SPI Port will be initialized in AINSER_Update() num_used_modules = AINSER_NUM_MODULES; #if AINSER_NUM_MODULES > 8 # error "If more than 8 AINSER_NUM_MODULES should be supported, the ainser_enable_mask variable type has to be changed from u8 to u16 (up to 16) or u32 (up to 32)" #endif #if AINSER_NUM_MODULES > 8 # error "If more than 8 AINSER_NUM_MODULES should be supported, the ainser_muxed_mask variable type has to be changed from u8 to u16 (up to 16) or u32 (up to 32)" #endif for(module=0; module<AINSER_NUM_MODULES; ++module) { num_used_pins[module] = AINSER_NUM_PINS; // ensure that CS is deactivated AINSER_SetCs(module, 1); AINSER_EnabledSet(module, 1); AINSER_MuxedSet(module, 1); AINSER_NumPinsSet(module, AINSER_NUM_PINS); AINSER_DeadbandSet(module, MIOS32_AIN_DEADBAND); // clear all values for(pin=0; pin<AINSER_NUM_PINS; ++pin) { ain_pin_values[module][pin] = 0; } previous_ain_pin_value = 0; } return status; } ///////////////////////////////////////////////////////////////////////////// //! \return the number of modules which are scanned ///////////////////////////////////////////////////////////////////////////// s32 AINSER_NumModulesGet(void) { return num_used_modules; } ///////////////////////////////////////////////////////////////////////////// //! Sets the number of modules which should be scanned //! \return < 0 on error (e.g. unsupported number of modules) ///////////////////////////////////////////////////////////////////////////// s32 AINSER_NumModulesSet(u8 num_modules) { if( num_modules >= AINSER_NUM_MODULES ) return -1; num_used_modules = num_modules; return 0; // no error } ///////////////////////////////////////////////////////////////////////////// //! \return the enable mask for modules which should be scanned ///////////////////////////////////////////////////////////////////////////// s32 AINSER_EnabledGet(u8 module) { if( module >= AINSER_NUM_MODULES ) return 0; return (ainser_enable_mask & (1 << module)) ? 1 : 0; } ///////////////////////////////////////////////////////////////////////////// //! Sets the enable mask for modules which should be scanned ///////////////////////////////////////////////////////////////////////////// s32 AINSER_EnabledSet(u8 module, u8 enabled) { if( module >= AINSER_NUM_MODULES ) return -1; // invalid module if( enabled ) ainser_enable_mask |= (1 << module); else ainser_enable_mask &= ~(1 << module); return 0; // no error } ///////////////////////////////////////////////////////////////////////////// //! \retval 0 if 1-to-8 multiplexers disabled for the given module //! \retval 1 if 1-to-8 multiplexers enabled for the given module (default) ///////////////////////////////////////////////////////////////////////////// s32 AINSER_MuxedGet(u8 module) { if( module >= AINSER_NUM_MODULES ) return 0; return (ainser_muxed_mask & (1 << module)) ? 1 : 0; } ///////////////////////////////////////////////////////////////////////////// //! Enables/disables the 1-to-8 multiplexer handling.\n //! Use muxed=0 for AINSER8 module, and muxed=1 for AINSER64 module (default) ///////////////////////////////////////////////////////////////////////////// s32 AINSER_MuxedSet(u8 module, u8 muxed) { if( module >= AINSER_NUM_MODULES ) return -1; // invalid module if( muxed ) ainser_muxed_mask |= (1 << module); else ainser_muxed_mask &= ~(1 << module); return 0; // no error } ///////////////////////////////////////////////////////////////////////////// //! \return the number of AIN pins per module which are scanned ///////////////////////////////////////////////////////////////////////////// s32 AINSER_NumPinsGet(u8 module) { if( module >= AINSER_NUM_MODULES ) return 0; // invalid module (return 0 pins) return num_used_pins[module]; } ///////////////////////////////////////////////////////////////////////////// //! Sets the number of AIN pins per module which should be scanned //! \return < 0 on error (e.g. unsupported number of pins) ///////////////////////////////////////////////////////////////////////////// s32 AINSER_NumPinsSet(u8 module, u8 num_pins) { if( module >= AINSER_NUM_MODULES ) return -1; // invalid module if( num_pins > AINSER_NUM_PINS ) return -2; num_used_pins[module] = num_pins; return 0; // no error } ///////////////////////////////////////////////////////////////////////////// //! \return the deadband which is used to notify changes //! \return < 0 on error ///////////////////////////////////////////////////////////////////////////// s32 AINSER_DeadbandGet(u8 module) { if( module >= AINSER_NUM_MODULES ) return 0; // invalid module (return 0) return ain_deadband[module]; } ///////////////////////////////////////////////////////////////////////////// //! Sets the difference between last and current pot value which has to //! be achieved to trigger the callback function passed to AINSER_Handler() //! \return < 0 on error ///////////////////////////////////////////////////////////////////////////// s32 AINSER_DeadbandSet(u8 module, u8 deadband) { if( module >= AINSER_NUM_MODULES ) return -1; // invalid module ain_deadband[module] = deadband; return 0; // no error } ///////////////////////////////////////////////////////////////////////////// //! \return the AIN pin value of the given module and pin //! \return < 0 if wrong module or pin selected! ///////////////////////////////////////////////////////////////////////////// s32 AINSER_PinGet(u8 module, u8 pin) { if( module >= AINSER_NUM_MODULES ) return -1; if( pin >= AINSER_NUM_PINS ) return -1; return ain_pin_values[module][pin]; } ///////////////////////////////////////////////////////////////////////////// //! \return the previous value of the pin which has triggered the NotifyChanged hook.\n //! Only valid when function is called from this hook! ///////////////////////////////////////////////////////////////////////////// s32 AINSER_PreviousPinValueGet(void) { return previous_ain_pin_value; } ///////////////////////////////////////////////////////////////////////////// //! This function should be periodically called to scan AIN pin changes. //! //! A scan of a single multiplexer selection takes ca. 50 uS on a LPC1769 with MIOS32_SPI_PRESCALER_8 //! //! Whenever a pin has changed, the given callback function will be called.\n //! Example: //! \code //! void AINSER_NotifyChanged(u32 pin, u16 value); //! \endcode //! \param[in] _callback pointer to callback function //! \return < 0 on errors ///////////////////////////////////////////////////////////////////////////// s32 AINSER_Handler(void (*_callback)(u32 module, u32 pin, u32 value)) { // the mux_ctr -> pin mappin is layout dependend //const u8 mux_pin_map[8] = {0, 1, 2, 3, 4, 5, 6, 7 }; //const u8 mux_pin_map[8] = {1, 4, 3, 5, 2, 7, 0, 6 }; // reversed pins const u8 mux_pin_map[8] = {6, 3, 4, 2, 5, 0, 7, 1 }; // order of MUX channels static u8 mux_ctr = 0; // will be incremented on each update to select the next AIN pin static u8 first_scan_done = 0; static u16 link_status_ctr = 0; s32 status = 0; // init SPI port for fast frequency access // we will do this here, so that other handlers (e.g. AOUT) could use SPI in different modes // Maxmimum allowed SCLK is 2 MHz according to datasheet // We select prescaler 64 @120 MHz (-> ca. 500 nS period) status |= MIOS32_SPI_TransferModeInit(AINSER_SPI, MIOS32_SPI_MODE_CLK0_PHASE0, MIOS32_SPI_PRESCALER_64); // determine next MUX selection int next_mux_ctr = (mux_ctr + 1) % 8; // link LED will flash with PWM effect ++link_status_ctr; const u32 pwm_period = 20; // *1 mS -> 20 mS const u32 pwm_sweep_steps = 100; // *20 mS -> 2000 mS u32 pwm_duty = ((link_status_ctr / pwm_period) % pwm_sweep_steps) / (pwm_sweep_steps/pwm_period); if( (link_status_ctr % (2*pwm_period*pwm_sweep_steps)) > pwm_period*pwm_sweep_steps ) pwm_duty = pwm_period-pwm_duty; // negative direction each 20*25 ticks u32 link_status = ((link_status_ctr % pwm_period) > pwm_duty) ? 1 : 0; // loop over connected modules int module; u32 module_mask = 1; for(module=0; module<num_used_modules; ++module, module_mask <<= 1) { if( !(ainser_enable_mask & module_mask) ) continue; u8 muxed = ainser_muxed_mask & module_mask; // loop over channels int chn; for(chn=0; chn<8; ++chn) { // CS=0 status |= AINSER_SetCs(module, 0); // retrieve conversion values // shift in start bit + SGL + MSB of channel selection, shift out dummy byte MIOS32_SPI_TransferByte(AINSER_SPI, 0x06 | (chn>>2)); // shift in remaining 2 bits of channel selection, shift out MSBs of conversion value u8 b1 = MIOS32_SPI_TransferByte(AINSER_SPI, chn << 6); // shift in mux_ctr + "Link LED" status to 74HC595, shift out LSBs of conversion value u8 b2 = MIOS32_SPI_TransferByte(AINSER_SPI, ((chn == 7 ? next_mux_ctr : mux_ctr) << 5) | link_status); // CS=1 (the rising edge will update the 74HC595) AINSER_SetCs(module, 1); // store conversion value if difference to old value is outside the deadband u16 pin = muxed ? (mux_pin_map[mux_ctr] + 8*(7-chn)) : (7-chn); // the mux/chn -> pin mapping is layout dependend u16 value = (b2 | (b1 << 8)) & 0xfff; previous_ain_pin_value = ain_pin_values[module][pin]; int diff = value - previous_ain_pin_value; int abs_diff = (diff > 0 ) ? diff : -diff; if( !first_scan_done || abs_diff > ain_deadband[module] ) { ain_pin_values[module][pin] = value; // notify callback function // check pin number as well... just to ensure if( first_scan_done && _callback && pin < num_used_pins[module] ) _callback(module, pin, value); } } } // select MUX input mux_ctr = next_mux_ctr; // one complete scan done? if( next_mux_ctr == 0 ) first_scan_done = 1; return 0; // no error } ///////////////////////////////////////////////////////////////////////////// // Internal function to set CS line depending on module ///////////////////////////////////////////////////////////////////////////// static s32 AINSER_SetCs(u8 module, u8 value) { switch( module ) { case 0: return MIOS32_SPI_RC_PinSet(AINSER_SPI, AINSER_SPI_RC_PIN_MODULE1, value); // spi, rc_pin, pin_value case 1: return MIOS32_SPI_RC_PinSet(AINSER_SPI, AINSER_SPI_RC_PIN_MODULE2, value); // spi, rc_pin, pin_value case 2: return MIOS32_BOARD_J10_PinSet(14, value); #if AINSER_NUM_MODULES > 3 # error "CS Line for more than 3 modules not prepared yet - please enhance here!" #endif } return -1; } //! \} and in mios32_config.h I set #define AINSER_NUM_MODULES 3 So, it should be exactly the same as in TKs branch. 
  20. Adding CS-line to AINSER8

    Hi Chris, Do you test it without the NG with a regular app first? Can you share the code you change in MIOS32, whole AINSER files? Best Bruno
  21. Adding CS-line to AINSER8

    Dear @TK., could you help on this? I have no clue why this is not working at my side but at yours.  
  22. Last week
  23. MB6582 Control Surface troubleshooting

    So thanks to Jepyang who messaged me I sorted this out, I'd installed the wrong hex file and not the MB6582 one. Thanks Jepyang!
  24. Thanks to latigid on I now have a working MB6582 base board. I can control it through MIDI and it's outputting some great sounds and the synth engine all seems to be working great. The LCD is also fine, however having some trouble with the control surface and wondered if anyone had any more ideas for me to try. I get LEDs on, and the pots control things on the LCD, but they don't seem to control the functions they should, and jump around the navigation when turned, with some LEDs seemingly randomly turning on and off with them. Very few of the buttons seem to work, but one or two do, again performing random functions. I've done a very thorough check of soldering, a couple of bad joints seemed to affect the behaviour but still quite random. Reading threads on here I wondered if the shift registers were at fault. I don't have any spares, but I did try swapping some of them from the SID section of the board (in unused SID slots) to the control surface section but that made no difference. I figured this is unlikely to be the problem if swapping around doesn't make any difference - I wouldn't have damaged all of them I don't think. Any other ideas for things I can try? 
  25. MB6582 PIC troubleshooting

    Thank you, jumper 11 was the issue! Software all sorted now, at least on the first PIC. Now just trying to get the control surface working... 
  26. MB6582 PIC troubleshooting

    RME Fireface should work. You can also change IDs through MIDI:   Select the ID in MIOS Studio as follows:    
  27. MB6582 PIC troubleshooting

    Thanks for the ideas! I did forget to put the opto couplers in to start with but in now. I guess they could be bad but not sure how to know for sure. I do need to order a few more parts for the feedback knobs so could add a replacement to the order to be sure.  I've tried two midi interfaces. And RME fireface 400 and a native instruments machine. Both worked fine with loopback. I could try another computer I guess.  I thought the IDs for the PICs were set later, but have to admit to finding that confusing. Do you have to set the IDs when flashing the bootloader? I thought it was when installing the software to subsequent PICs to the master one with MIOS studio.  I looked at the resources for changing IDs but it didn't make much sense if I can't detect the PICs in MIOS studio in the first place. Have I misunderstood how this works?
  28. Adding Faders to MBSeqv4

    I'm not sure if CC is implemented for note steps. The encoders are also responsible for the UI in general. It would also be a lot of data to poll/update.  But yes, _NG with AINSER would be the right direction. You can also get high-speed UART by removing the optocouplers. The connection is more fragile of course.
  29. MB6582 PIC troubleshooting

    Sometimes you forget to socket the optocouplers, or they are faulty somehow.  Could be an incompatible MIDI interface (is it on the blacklist?). Are you aware of the different device IDs for the PICs? They need to be configured in MIOS Studio.
  30. Load more activity