0
\$\begingroup\$

I have a 8bit value on the output of ADC. I need to show this number on 3 seven segment displays. How to do it? I'm working in Multisim 11.0.

You can see a scheme of ADC that I have:

enter image description here

Two blue schemes on the right converts BCD to value on the displays and it works correct while value less then 9. But when it is bigger, displays show wrong value.

P.S.: This Question has as one of the answers the link to the DM9368 Data Sheet, but is seems that there is no such scheme in Multisim.

P.P.S.: In fact, I need only 6 bits if number to display values from 0 to 64.

\$\endgroup\$

closed as unclear what you're asking by Bence Kaulics, PeterJ, Daniel Grillo, placeholder, Peter Smith Jun 4 '16 at 13:19

Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.

  • 2
    \$\begingroup\$ Why are you trying to do this in multisim? \$\endgroup\$ – Brendan Simpson Jun 2 '16 at 20:20
  • 2
    \$\begingroup\$ The 7447 converts BCD to seven-segment. So before you connect to the 7447's you need to convert the ADC output to BCD. \$\endgroup\$ – The Photon Jun 2 '16 at 20:39
  • 3
    \$\begingroup\$ Your question is not clear. Are you asking how to SIMULATE displaying a 2^6 or 2^8 value on three 7-segment displays? Or are you asking how to DESIGN and IMPLEMENT this function? There are modern chips that implement the function of BCD to 7-segment encoding and display driving. Even simpler would probably be to use a micro-controller (Arduino, et.al.) Please clarify your question. \$\endgroup\$ – Richard Crowley Jun 2 '16 at 20:42
1
\$\begingroup\$

Since the output of your ADC is binary and you need BCD to drive the BCD to 7- segment display drivers, you'll need a binary to BCD converter between the ADC output and the seven-segment drivers.

One way to do the conversion in hardware is to load the ADC output into an 8 bit binary down counter and, at the same time, clear three BCD up counters.

Then, using the same clock for all of the counters, simultaneously clock all the counters. When the binary counter counts down to zero, stop the clock/disable the counters and - VOILA! - the ADC's output, in BCD, will be held in the up counters' Q outputs.

Like this:

enter image description here

\$\endgroup\$
  • \$\begingroup\$ You're welcome. A caveat: You may want to watch the End Of Convert (EOC) signal from the ADC, convert its leading edge into a short pulse and start the counters when it goes true. \$\endgroup\$ – EM Fields Jun 4 '16 at 0:05
  • \$\begingroup\$ EM Fields, That is problem... There is no 74hc40103 scheme in multisim. Is there some other variants? \$\endgroup\$ – Henry1996 Jun 4 '16 at 6:21
  • \$\begingroup\$ @Henry1996: Sure; you can use a couple of HC191's. Matter of fact, you can build the whole thing out of 191's \$\endgroup\$ – EM Fields Jun 4 '16 at 9:32
  • \$\begingroup\$ @Henry1996: Ooops... You can't build it all out of 191s since 191s are binary. But, 190s are BCD so you could build the up-counter using them. Sorry... \$\endgroup\$ – EM Fields Jun 4 '16 at 17:32
0
\$\begingroup\$

The way you've designed it, you're giving 4 bits to one display and 4 bits to the other display. That's great if you're trying to display your value in hexidecimal. (...which assumes the 7447 LED driver chip supported symbols AbCdEF.)

Otherwise you're going to need another IC which inputs 8-bit digital value and either gives you 3-digit BCD (2,4,4 wires) or can directly drive the LED segments (3x7 wires). If your number will never exceed 63, you do not need to physically wire the 3rd digit.

Alternately you might find another display module which inputs 8 bits and displays a 2-3-digit unsigned decimal value.

\$\endgroup\$
0
\$\begingroup\$

If you want to convert binary to decimal, you're going to have to do a divide in one form or another. This could be successively, like counting, or outright dividing.

While it is possible to string together enough dedicated digital logic chips to achieve what you want, a microcontroller is the simplest solution for most cases. One way to generate decimal digits is to keep dividing a number by 10. The remainder from each division are the digit values in least to most significant order. Note that this works regardless of how large the original number is.

In the special case of the input value only being 0-255, various shortcuts are possible. One brute force but simple approach is to use a lookup table. Since you only have 256 possible input values, it doesn't need to be large. The lookup table could result in the 4-bit BCD values for each digit. Since the highest digit can only be 0,1,2, you actually only need 2 bits for its BCD value. That means a 8-bit in 10-bit out lookup table solves this problem very simply.

Or, the table could even result in the 7-segment values for each digit directly. That would require a minimum of 21 bits per table entry. Even if you ended up using 32 bits per table entry for convenience, that's still only 1024 bytes of program memory. That's a "small" amount of memory for a modest modern microcontroller.

\$\endgroup\$
0
\$\begingroup\$

Simplest method, perhaps, is 3 28C64 EEPROMs (plus 20 resistors)

One for each digit, feed them all the same 8 bits. For 6 bits 0..64 you only need 2 EEPROMS and 14 resistors. If you have a clock you could biplex the displays and use a single EEPROM and 7 resistors.

Easy enough to write a C program (or Python or whatever you like) to spit out the hex code for programming the EEPROMs and you'd need a compatible EEPROM programmer. You could expand this idea up to 13 bits with 4 displays, 4 EEPROMs and 28 resistors.

By the way, if you ever build the circuit shown in your question you'll burn out the displays and/or the 7447s. You must have series resistors, one per segment if you want it to work properly.

Of course, in reality, most of us would use a small part of a microcontroller program to do this.

\$\endgroup\$

Not the answer you're looking for? Browse other questions tagged or ask your own question.