All Activity

This stream auto-updates   

  1. Today
  2. Yesterday
  3. MB6582 Control Surface troubleshooting

    I've narrowed it down to the direction buttons to the right of the screen, the menu and shift buttons and the lfo waveform select button, all of which are in a similar area of the control surface. They all seem to select a function related to the modulation matrix when I press them, although each a different one.  Using the utility in the button troubleshooting guide I can see they are all outputting midi notes, although I found it hard to interpret this as a number of buttons across the control surface seem to output the same midi note, including some that are working fine with the mb6582 software.    I tried again swapping out some of the shift registers from the SID modules on cores I'm not currently using for SIDs. That didn't change the behaviour which suggests to me the shift registers themselves are OK.  I couldn't understand how to use the shift register tool. I get I need to test voltage across some pins but not sure which ones as I'm not knowledgeable enough to quite understand the instructions.  Lots of checking joints, cleaning and checking for any shorts but still not getting there. So close to a fully functioning mb6582 yet so far! :)
  4. Troubleshooting midiphy SEQ v4+

    Hi Peter, I wish I had found the problem sooner; I had to delay work on my kit for awhile because of other demands on my spare time. Hopefully I found it early enough that you can contact most other affected customers before they begin soldering. Mistakes do indeed happen--I completely understand. After over 20 years in the music-tech business, and shipping over 40 software and hardware products, I have also handled many mistakes.  Thanks for your help. You have a good day, too! Warm regards, --Adam
  5. Troubleshooting midiphy SEQ v4+

    @studio nebula Wow, very well spotted and thanks for finding and reporting the problem as soon as you did! It was correlated with our move to the new ENIG PCB process - will contact you shortly via email on how to proceed. What we will do: * check the other ENIG PCBs for this special problem (we don't believe others are affected, but we will check anyways) * contact everyone affected buying the core board since the switch to the new manufacturing process (about a month ago). * submit an express PCB manufacturing job and send the replacement boards free of charge to you and the other affected customers, as soon as we have the replacements in hand. Thus you will also get another "core main board", that you can use as a backup, as only the breakaway USB part is affected. * say "sorry" with a "free shipping" flag to everyone affected, thus you won't pay for shipping whatever you order, whenever you order next. From my main job as a consultant i learned that mistakes happen all the time, the difference is how you handle them, we hope to do the best here. Have a good day and best regards! Peter
  6. Troubleshooting midiphy SEQ v4+

    Hah! Okay then. Thanks for the confirmation. I will move on to other parts of the kit and await a replacement for the USB PCB. Maybe I will check for +5V/GND shorts on the other PCBs before I start soldering them.  Thanks-- --Adam
  7. Troubleshooting midiphy SEQ v4+

    Ha, you're right, the +5V plane is connected on this revision. Don't worry, we'll sort you out with a replacement. Peter will be in touch.
  8. Troubleshooting midiphy SEQ v4+

    Those are the first locations I checked since obviously they're the most likely to be shorted by a solder bridge. Here's the photo; thanks for looking at it for me. It's possibly worth mentioning that I have a lot of experience with this sort of work. I'm used to hand-soldering 0603s and TQFP100 packages. Obviously there's a mistake somewhere, though. I understand that nobody's board would work if +5 and GND are connected, but you're showing me an image which appears to show that they are connected. Hence my confusion. 
  9. 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...
  10. 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
  11. 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.
  12. 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?
  13. 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.
  14. Adding CS-line to AINSER8

  15. 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€.)  
  16. 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?  
  17. Adding CS-line to AINSER8

    Invert?! What do you mean with that?
  18. 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.
  19. 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
  20. Last week
  21. Adding CS-line to AINSER8

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

    Yes. I did. I see the pulses on the CS line. 
  23. 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!
  24. Adding CS-line to AINSER8

    ok. And physically, did you check the cs lines with the oscillo? you should see a periodic pulse.
  25. 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. 
  26. 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
  27. 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.  
  28. 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!
  29. Load more activity