All Activity

This stream auto-updates   

  1. Today
  2. Adding CS-line to AINSER8

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

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

    ok. And physically, did you check the cs lines with the oscillo? you should see a periodic pulse.
  6. 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 (tk@midibox.org) * 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. 
  7. 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
  8. 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.  
  9. Yesterday
  10. 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!
  11. 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? 
  12. 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... 
  13. MB6582 PIC troubleshooting

    RME Fireface should work. You can also change IDs through MIDI:   Select the ID in MIOS Studio as follows:    
  14. Last week
  15. 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?
  16. 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.
  17. 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.
  18. I'm trying to get a newly built MB6582 up and running and having some problems with the PIC software, I wonder if anyone can help. I've flashed the bootloader onto the PICs as per the instructions, and they verify OK. I'm now trying to get the software installed over MIDI. In MIOS studio I don't get any input when turning the MB6582 on. I've been through the MIDI troubleshooting, and everything seems fine apart from looping back the tx and rx pins on the PIC, where I don't see any loopback. I've checked all the joints and reflowed any that looked in any way suspect. Any ideas?
  19. Assign J5a/b core ports in .NGC

    Hi, i'd like to continue working on my keyboard controller project. Is there absolutely no way to set up the J5 ports as individual digital IO's in ngc? I'd like to avoid a cumbersome solution modifing the source code. If there is no easy way, then so be it.   May i ask if it's possible to simply do the following? I want to setup J5a to have 2 digital ins and two digital outs. // init pin 0 and 1 as digital ins (for tact switches) MIOS32_BOARD_J5_PinInit(0, MIOS32_BOARD_PIN_MODE_INPUT_PU); MIOS32_BOARD_J5_PinInit(1, MIOS32_BOARD_PIN_MODE_INPUT_PU); // init pin 2 and 3 as digital outs (for LEDs) MIOS32_BOARD_J5_PinInit(2, MIOS32_BOARD_PIN_MODE_OUTPUT_PP); MIOS32_BOARD_J5_PinInit(3, MIOS32_BOARD_PIN_MODE_OUTPUT_PP); I assume i'd then have J5a:A0..A1 configured as INs and J5a:A2..A3 as OUTs, right?   Thank you very much!  
  20. MIDIbox SEQ V4 Release + Feedback

    hi Everybody during some time now spend with my seq4 ,few times i got in situation when for example track 1 LFO was controlling cc21(filter cut off), and time it took to me to figure out "why is my damn filter cut off on track 1 is moving!?" and it made me think that it could be great to have some indication of it ,preferably in EDIT page   now looking on the lcd screens they already pretty packed with vital informations so my proposal is in EDIT page, instead of CATEGORY ,to use 8 lcd characters (counting from top most rightside of right screen) this way there is still one space from NOTE LENGTH   to indicate for example,ECHO(ON/OFF),HUMANIZER(ON if one of parameter is different then 0(note,vel/cc,length)),ROBO(ON/OFF), LIMITER(if Lower/Upper is different than 0),LFO(ON if wave type is different then 0),DUPLICATE(ON/OFF),MORPH(ON/OFF),SHUFFLE STYLE(ON if style different then 0)   my idea was to indicate with lower (if OFF),and upper(if ON) cases of first letters of each effect ,ECHO=E,e ,Humanizer=H,h and so on i feel this can save a lot of time running around here little example letters are not exactly in place,but just to visualise   thanks for your time bests.k    
  21. Adding Faders to MBSeqv4

    Ok, as usual, I was able to answer some of my questions. I see that there is a 3rd MIDI In/Out option for the Seq. And I assume I would use MidiBox NG. How do I make them talk together?
  22. Adding Faders to MBSeqv4

    Hey guys,  I have a spare core board, and I would like to add 16 10k faders to my MBSeq Ver 4+ to control the note steps using an AIN board. What software would I load on the core, and what are my options for connecting it to my MBSeq core? Is there a way to do it through ethernet, so I don't lose a midi in on the Seq?  Thanks, Justin
  23. One MB-6582, One Power Supply: a Tutorial

    good place to start thinking anyway. I think I need a good look at the schematic to understand why that would help.....
  24. One MB-6582, One Power Supply: a Tutorial

    Seems to me the bridge rectifier could be added back in without any issue, if that’s what causes the problem?
  25. One MB-6582, One Power Supply: a Tutorial

    ah, thanks -  well that's useful to know that it is possibly just a consequence of this set up rather than something I connected I shouldn't have. When I get the chance will try and trace why it happens, but it at least seems to be a reasonably trivial issue so far.
  26. Adding CS-line to AINSER8

    Hey @TK., I tried it without success. I copied the code from you into my firmware.  My NGC file looks like this: RESET_HW AINSER n=1 enabled=1 num_pins=1 cs=1 resolution=7bit AINSER n=2 enabled=1 num_pins=1 cs=2 resolution=7bit I have a potentiometer connected to the first analog input of the second and another one to the first input of the third module. The first module is not used at the moment.  If I "set debug on" in the terminal, I see movements if I turn the potentiometer which is connected to the second module. Anyway I can not see anything when I turn the pot which is connected to the third module. I've tried both PP and OD mode (with 1k pullup to 5V). I use PE6, which should lead to MIOS32_BOARD_J10_PinInit(14, MIOS32_BOARD_PIN_MODE_OUTPUT_OD) and case 2: return MIOS32_BOARD_J10_PinSet(14, value); Any ideas what I do wrong?
  27. Earlier
  28. MIOS32 File Browser

    Congrats!
  29. MIOS32 File Browser

    Thanks Peter, I got is working :)
  30. Load more activity