void dsd_555_mstbl_reset(node_description *node) { const discrete_555_desc *info = node->custom; struct dsd_555_mstbl_context *context = node->context; context->output_type = info->options & DISC_555_OUT_MASK; if ((context->output_type == DISC_555_OUT_COUNT_F) || (context->output_type == DISC_555_OUT_COUNT_R)) { discrete_log("Invalid Output type in NODE_%d.\n", node->node - NODE_00); context->output_type = DISC_555_OUT_SQW; } /* Use the supplied values or set to defaults. */ context->threshold = (info->threshold555 == DEFAULT_555_THRESHOLD) ? info->v555 *2 /3 : info->threshold555; context->trigger = (info->trigger555 == DEFAULT_555_TRIGGER) ? info->v555 /3 : info->trigger555; context->output_high_voltage = (info->v555high == DEFAULT_555_HIGH) ? info->v555 - 1.2 : info->v555high; context->output_is_ac = info->options & DISC_555_OUT_AC; /* Calculate DC shift needed to make squarewave waveform AC */ context->ac_shift = context->output_is_ac ? -context->output_high_voltage / 2.0 : 0; context->error = test_555(context->threshold, context->trigger, info->v555, node->node); context->trig_is_logic = (info->options & DISC_555_TRIGGER_IS_VOLTAGE) ? 0: 1; context->flip_flop = 0; context->cap_voltage = 0; node->output = 0; }
void dsd_555_astbl_reset(struct node_description *node) { const struct discrete_555_desc *info = node->custom; struct dsd_555_astbl_context *context = node->context; context->use_ctrlv = (node->input_is_node >> 4) & 1; context->wav_type = info->options & DISC_555_OUT_MASK; /* Use the supplied values or set to defaults. */ context->vHigh = (info->v555high == DEFAULT_555_HIGH) ? info->v555 - 1.2 : info->v555high; if ((DSD_555_ASTBL__CTRLV != -1) && !context->use_ctrlv) { /* Setup based on supplied static value */ context->threshold = DSD_555_ASTBL__CTRLV; context->trigger = DSD_555_ASTBL__CTRLV / 2.0; } else { /* use values passed in structure */ context->threshold = (info->threshold555 == DEFAULT_555_THRESHOLD) ? info->v555 *2 /3 : info->threshold555; context->trigger = (info->trigger555 == DEFAULT_555_TRIGGER) ? info->v555 /3 : info->trigger555; } context->is_ac = info->options & DISC_555_OUT_AC; /* Calculate DC shift needed to make squarewave waveform AC */ context->ac_shift = context->is_ac ? -context->vHigh / 2.0 : 0; context->error = test_555(context->threshold, context->trigger, info->v555, node->node); context->v555 = (info->options & DISC_555_ASTABLE_HAS_FAST_CHARGE_DIODE) ? info->v555 - 0.5: info->v555; context->flip_flop = 1; context->vCap = 0; context->step = 1.0 / Machine->sample_rate; /* Used to adjust the ratio depending on if it is the extra percent or energy */ context->x_init = 0; if (context->wav_type == DISC_555_OUT_ENERGY) context->x_init = context->step; /* Step to set the output */ dsd_555_astbl_step(node); }
void dsd_555_cc_reset(node_description *node) { const discrete_555_cc_desc *info = node->custom; struct dsd_555_cc_context *context = node->context; context->flip_flop=1; context->cap_voltage = 0; context->output_type = info->options & DISC_555_OUT_MASK; /* Used to adjust the ratio depending on if it is the extra percent or energy */ context->x_init = 0; if (context->output_type == DISC_555_OUT_ENERGY) context->x_init = discrete_current_context->sample_time; /* Use the supplied values or set to defaults. */ context->threshold = (info->threshold555 == DEFAULT_555_THRESHOLD) ? info->v555 *2 /3 : info->threshold555; context->trigger = (info->trigger555 == DEFAULT_555_TRIGGER) ? info->v555 /3 : info->trigger555; context->output_high_voltage = (info->v555high == DEFAULT_555_HIGH) ? info->v555 - 1.2 : info->v555high; context->output_is_ac = info->options & DISC_555_OUT_AC; /* Calculate DC shift needed to make squarewave waveform AC */ context->ac_shift = context->output_is_ac ? -context->output_high_voltage / 2.0 : 0; context->error = test_555(context->threshold, context->trigger, info->v555, node->node); /* There are 8 different types of basic oscillators * depending on the resistors used. We will determine * the type of circuit at reset, because the ciruit type * is constant. */ context->type = (DSD_555_CC__RDIS > 0) | ((DSD_555_CC__RGND > 0) << 1) | ((DSD_555_CC__RBIAS > 0) << 2); /* * TYPES: * Note: These are equivalent circuits shown without the 555 circuitry. * See the schematic in src\sound\discrete.h for full hookup info. * * DISCRETE_555_CC_TO_DISCHARGE_PIN * When the CC source is connected to the discharge pin, it allows the * circuit to charge when the 555 is in charge mode. But when in discharge * mode, the CC source is grounded, disabling it's effect. * * [0] * No resistors. Straight constant current charge of capacitor. * When there is not any charge current, the cap will bleed off. * Once the lower threshold(trigger) is reached, the output will * go high but the cap will continue to discharge due to losses. * .------+---> cap_voltage CHARGING: * | | dv (change in voltage) compared to dt (change in time in seconds). * .---. --- dv = i * dt / C; where i is current in amps and C is capacitance in farads. * | i | --- C cap_voltage = cap_voltage + dv * '---' | * | | DISCHARGING: * gnd gnd instantaneous * * [1] * Same as type 1 but with rDischarge. rDischarge has no effect on the charge rate because * of the constant current source i. * When there is not any charge current, the cap will bleed off. * Once the lower threshold(trigger) is reached, the output will * go high but the cap will continue to discharge due to losses. * .----ZZZ-----+---> cap_voltage CHARGING: * | rDischarge | dv (change in voltage) compared to dt (change in time in seconds). * .---. --- dv = i * dt / C; where i is current in amps and C is capacitance in farads. * | i | --- C cap_voltage = cap_voltage + dv * '---' | * | | DISCHARGING: * gnd gnd thru rDischarge * * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * !!!!! IMPORTANT NOTE ABOUT TYPES 3 - 7 !!!!! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * * From here on in all the circuits have either an rBias or rGnd resistor. * This converts the constant current into a voltage source. * So all the remaining circuit types will be converted to this circuit. * When discharging, rBias is out of the equation because the 555 is grounding the circuit * after that point. * * .------------. Rc Rc is the equivilent circuit resistance. * | v |----ZZZZ---+---> cap_voltage v is the equivilent circuit voltage. * | | | * '------------' --- Then the standard RC charging formula applies. * | --- C * | | NOTE: All the following types are converted to Rc and v values. * gnd gnd * * [2] * When there is not any charge current, the cap will bleed off. * Once the lower threshold(trigger) is reached, the output will * go high but the cap will continue to discharge due to rGnd. * .-------+------+------> cap_voltage CHARGING: * | | | v = vi = i * rGnd * .---. --- Z Rc = rGnd * | i | --- C Z rGnd * '---' | | DISCHARGING: * | | | instantaneous * gnd gnd gnd * * [3] * When there is not any charge current, the cap will bleed off. * Once the lower threshold(trigger) is reached, the output will * go high but the cap will continue to discharge due to rGnd. * .----ZZZ-----+------+------> cap_voltage CHARGING: * | rDischarge | | v = vi = i * rGnd * .---. --- Z Rc = rGnd * | i | --- C Z rGnd * '---' | | DISCHARGING: * | | | thru rDischarge || rGnd ( || means in parallel) * gnd gnd gnd * * [4] * .---ZZZ---+------------+-------------> cap_voltage CHARGING: * | rBias | | Rc = rBias * .-------. .---. --- vi = i * rBias * | vBias | | i | --- C v = vBias + vi * '-------' '---' | * | | | DISCHARGING: * gnd gnd gnd instantaneous * * [5] * .---ZZZ---+----ZZZ-----+-------------> cap_voltage CHARGING: * | rBias | rDischarge | Rc = rBias + rDischarge * .-------. .---. --- vi = i * rBias * | vBias | | i | --- C v = vBias + vi * '-------' '---' | * | | | DISCHARGING: * gnd gnd gnd thru rDischarge * * [6] * .---ZZZ---+------------+------+------> cap_voltage CHARGING: * | rBias | | | Rc = rBias || rGnd * .-------. .---. --- Z vi = i * Rc * | vBias | | i | --- C Z rGnd v = vBias * (rGnd / (rBias + rGnd)) + vi * '-------' '---' | | * | | | | DISCHARGING: * gnd gnd gnd gnd instantaneous * * [7] * .---ZZZ---+----ZZZ-----+------+------> cap_voltage CHARGING: * | rBias | rDischarge | | Rc = (rBias + rDischarge) || rGnd * .-------. .---. --- Z vi = i * rBias * (rGnd / (rBias + rDischarge + rGnd)) * | vBias | | i | --- C Z rGnd v = vBias * (rGnd / (rBias + rDischarge + rGnd)) + vi * '-------' '---' | | * | | | | DISCHARGING: * gnd gnd gnd gnd thru rDischarge || rGnd */ /* * DISCRETE_555_CC_TO_CAP * * When the CC source is connected to the capacitor, it allows the * current to charge the cap while it is in discharge mode, slowing the * discharge. So in charge mode it charges linearly from the constant * current cource. But when in discharge mode it behaves like circuit * type 2 above. * .-------+------+------> cap_voltage CHARGING: * | | | dv = i * dt / C * .---. --- Z cap_voltage = cap_voltage + dv * | i | --- C Z rDischarge * '---' | | DISCHARGING: * | | | v = vi = i * rGnd * gnd gnd discharge Rc = rDischarge */ /* Step to set the output */ dsd_555_cc_step(node); }