Shop OBEX P1 Docs P2 Docs Learn Events
Cascading 5-MC14489s - issues? — Parallax Forums

Cascading 5-MC14489s - issues?

xanatosxanatos Posts: 1,120
edited 2012-09-09 00:04 in General Discussion
Hi there,

I'm cascading 5 MC14489 5-Digit LED controllers. The first three banks work like a charm... The last two display "L" when the other 3 are displayijng "FALL", and nothing when the other three are displaying the other two phrases (POOL and bALL).

See video: http://www.youtube.com/watch?v=WQFeHp_97Uo

Code below... why would the first three banks display correctly, but not the last two?

Note that each 14489 is only using 4 of 5 digits. I have designated segs0 as a common blank character (See the SHIFTOUT command) for the unused display position.

The first three displays are controlled by segs 1-4, 5-8, 9-12 (see VARs).

Currently the rest of the program code is circumvented by a GOTO that just makes everything display the POOL bALL FALL intro display, so nothing after that figures in other than the subroutines.

' =========================================================================
'
'   File....... PoolBallFalls-0.bsx
'   Purpose.... Pool Ball Falls Museum Exhibit for 42 Design
'   Author..... (c) David Xanatos, Xanatos.com and Xanatronics
'   E-mail..... [email]Xanatos@xanatos.com[/email]
'   Started.... 2012/08/11
'   Updated.... 2012/08/11
'
'   {$STAMP BS2sx}
'   {$PBASIC 2.5}
'
' -----[ I/O Definitions ]-------------------------------------------------

Cend1                               PIN     0      ' I  Count enable/disable signals to 4066.13
Cend4                               PIN     1       ' I  4066.12
Cend2                               PIN     2       ' I  4066.5
Cend3                               PIN     3       ' I  4066.6
Clock                               PIN     4       ' I  14489.11
Enable                              PIN     5       ' I  14489.10
DataIO                              PIN     6       ' I  14489.12
startButton                         PIN     7       ' E
Solenoids                           PIN     8       ' E
ballsLoaded                         PIN     9       ' E  LOW when all 5 balls loaded
Rend5                               PIN     10      ' E
Rend4                               PIN     11      ' E
Rend3                               PIN     12      ' E
Rend2                               PIN     13      ' E
Rend1                               PIN     14      ' E  Run End signals from microswitches in PBF ball exit tube.
flowCount                           PIN     15      ' I  CT505.3

' -----[ Constants ]-------------------------------------------------------

#SELECT $STAMP
  #CASE BS2, BS2E, BS2PE
    T2400       CON     396
    T9600       CON     84
    T19K2       CON     32
  #CASE BS2SX, BS2P
    T2400       CON     1021
    T9600       CON     240
    T19K2       CON     110
  #CASE BS2PX
    T1200       CON     3313
    T2400       CON     1646
    T4800       CON     813
    T9600       CON     396
    T19K2       CON     188
    T38K4       CON     84
#ENDSELECT

' MC14489 characters ' decode mode
Ltr_A                               CON     $0A     ' Hex
Ltr_b                               CON     $0B     ' Hex
Ltr_C                               CON     $0C     ' Hex
Ltr_c2                              CON     $01     ' Special
Ltr_d                               CON     $0D     ' Hex
Ltr_E                               CON     $0E     ' Hex
Ltr_F                               CON     $0F     ' Hex
Ltr_H                               CON     $02     ' Special
Ltr_h2                              CON     $03     ' Special
Ltr_J                               CON     $04     ' Special
Ltr_L                               CON     $05     ' Special
Ltr_n                               CON     $06     ' Special
Ltr_O                               CON     $00     ' Hex
Ltr_o2                              CON     $07     ' Special
Ltr_P                               CON     $08     ' Special
Ltr_r                               CON     $09     ' Special
Ltr_S                               CON     $05     ' Hex
Ltr_U                               CON     $0A     ' Special
Ltr_u2                              CON     $0B     ' Special
Ltr_Y                               CON     $0C     ' Special
Blank                               CON     $00     ' Special or No
ULine                               CON     $08     ' No
Dash                                CON     $0D     ' special
Equal                               CON     $0E     ' Special
DegSym                              CON     $0F     ' Special
Colon                               CON     %011    ' No
DegSym2                             CON     %100    ' No

' -----[ Variables ]-------------------------------------------------------

task                                VAR     Nib         ' Current task - selects via BRANCH which program section to run

cwv                                 VAR     Word        ' 5 words to hold the count data
cww                                 VAR     Word
cwx                                 VAR     Word
cwy                                 VAR     Word
cwz                                 VAR     Word
cwv0                                VAR     cwv.BYTE0   ' Byte alias for first Byte, for SERIN
cwd                                 VAR     Word        ' Word to hold duration of header pulse
ps                                  VAR     Byte        ' Byte to hold current state of CT515 pins
bs                                  VAR     ps          ' Alias for ps.  bs just shows ball status and can be overwritten by ps when the runs are done.

config                              VAR     Byte        ' configuration register
display                             VAR     config.BIT0 ' 0 = off, 1 = on
dPnts                               VAR     Nib         ' decimal point control

segs20                              VAR     Nib         ' segs - bank 1 (right)  cwz
segs19                              VAR     Nib
segs18                              VAR     Nib
segs17                              VAR     Nib

segs16                              VAR     Nib         ' segs - bank 2 cwy
segs15                              VAR     Nib
segs14                              VAR     Nib
segs13                              VAR     Nib

segs12                              VAR     Nib         ' segs - bank 3 cwx
segs11                              VAR     Nib
segs10                              VAR     Nib
segs9                               VAR     Nib

segs8                               VAR     Nib         ' segs - bank 4 cww
segs7                               VAR     Nib
segs6                               VAR     Nib
segs5                               VAR     Nib

segs4                               VAR     Nib         ' segs - bank 5 (left) cwv
segs3                               VAR     Nib
segs2                               VAR     Nib
segs1                               VAR     Nib

segs0                               VAR     Nib

x                                   VAR     Nib         ' Test Counter
' -----[ Initialization ]--------------------------------------------------

  'CONFIG INFO 14889:
  'Bit0 – Display control; 0 = off, 1 = on
  'Bit1 – Bank 1 mode; 0 = Hex decode, 1 = Set by Bit6
  'Bit2 – Bank 2 mode; 0 = Hex decode, 1 = Set by Bit6
  'Bit3 – Bank 3 mode; 0 = Hex decode, 1 = Set by Bit6
  'Bit4 – Bank 4 mode; 0 = Hex decode, 1 = Set by Bit7
  'Bit5 – Bank 5 mode; 0 = Hex decode, 1 = Set by Bit7
  'Bit6 – 0 = No decode, 1 = Special decode (for Banks 1 – 3)
  'Bit7 – 0 = No decode, 1 = Special decode (for Banks 4 – 5)

GET 0, task
BRANCH task, [Init_Sys,Main]

Init_Sys:
  config = %00000000     ' This just turns the display off.
  GOSUB Set_Cfg
  PAUSE 500
  segs0 = %0000

Reset:
  HIGH Enable            ' deselect 14489s
  INPUT flowCount        ' CT505
  LOW Cend1
  LOW Cend2
  LOW Cend3
  LOW Cend4
  'LOW Cend5             ' Not needed
  LOW Solenoids          ' Make sure solenoids are off so balls don't drop through...

Welcome:                 ' Displays POOL bALL FALL
  segs1 = Ltr_L
  segs2 = Ltr_O
  segs3 = Ltr_O
  segs4 = Ltr_P

  segs5 = Ltr_L
  segs6 = Ltr_O
  segs7 = Ltr_O
  segs8 = Ltr_P

  segs9 = Ltr_L
  segs10 = Ltr_O
  segs11 = Ltr_O
  segs12 = Ltr_P

  segs13 = Ltr_L
  segs14 = Ltr_O
  segs15 = Ltr_O
  segs16 = Ltr_P

  segs17 = Ltr_L
  segs18 = Ltr_O
  segs19 = Ltr_O
  segs20 = Ltr_P

  dPnts = %1000

  GOSUB Set_Digits
  PAUSE 20
  config = %11100111     ' This sets the decode mode on each display, and turns the display on.
  GOSUB Set_Cfg

  PAUSE 1000



  segs1 = Ltr_L
  segs2 = Ltr_L
  segs3 = Ltr_A
  segs4 = Ltr_b

  segs5 = Ltr_L
  segs6 = Ltr_L
  segs7 = Ltr_A
  segs8 = Ltr_b

  segs9 = Ltr_L
  segs10 = Ltr_L
  segs11 = Ltr_A
  segs12 = Ltr_b

  segs13 = Ltr_L
  segs14 = Ltr_L
  segs15 = Ltr_A
  segs16 = Ltr_b

  segs17 = Ltr_L
  segs18 = Ltr_L
  segs19 = Ltr_A
  segs20 = Ltr_b

  dPnts = %1000

  GOSUB Set_Digits
  config = %11001111
  GOSUB Set_Cfg

  PAUSE 1000

  segs1 = Ltr_L
  segs2 = Ltr_L
  segs3 = Ltr_A
  segs4 = Ltr_F

  segs5 = Ltr_L
  segs6 = Ltr_L
  segs7 = Ltr_A
  segs8 = Ltr_F

  segs9 = Ltr_L
  segs10 = Ltr_L
  segs11 = Ltr_A
  segs12 = Ltr_F

  segs13 = Ltr_L
  segs14 = Ltr_L
  segs15 = Ltr_A
  segs16 = Ltr_F

  segs17 = Ltr_L
  segs18 = Ltr_L
  segs19 = Ltr_A
  segs20 = Ltr_F

  dPnts = %1000
  GOSUB Set_Digits

  PAUSE 3000

  config = %00000000     ' This just turns the display off.
  GOSUB Set_Cfg

  GOTO Welcome

' -----[ Program Code ]----------------------------------------------------

Main:

DO:LOOP UNTIL ballsLoaded = 1
' When ballsLoaded goes HIGH (?), signal used to light START BUTTON via hardware (direct from ballsLoaded input- use a 2N2222)

DO:LOOP UNTIL startButton = 1

GOSUB zeroCT             ' Zero the counter
HIGH Cend1               ' Enable the 4066 lines so all counters get the count pulses
HIGH Cend2
HIGH Cend3
HIGH Cend4
'HIGH Cend5              ' Not needed - 555 is hardwired to counter "5" (doesn't go through 4066)

HIGH Solenoids           ' Fire the Solenoids

bs = %00000000

DO

  IF Rend1 = 0 THEN
    LOW Cend1            ' Disable the counter channels as the run ends
    bs.BIT0 = 1
  ENDIF
  IF Rend2 = 0 THEN
    LOW Cend2            ' These will set the Cend value low, despite the Rend value returning to HIGH
    bs.BIT1 = 1
  ENDIF
  IF Rend3 = 0 THEN
    LOW Cend3            ' This means that the Rend values can't be expected to be all 0 when Rend 5 comes in.
    bs.BIT2 = 1
  ENDIF
  IF Rend4 = 0 THEN
    LOW Cend4
    bs.BIT3 = 1
  ENDIF
  IF Rend5 = 0 THEN      ' **** NOTE!!!!  Rend 5 MUST BE the track that ALWAYS IS LAST! Else 5's time will be long.
    bs.BIT4 = 1
  ENDIF

  IF bs = %00011111 THEN EXIT

LOOP


GOSUB Get_Counts

  dPnts = %1101       ' Sets DP to be after the first digit in each display (may need to edit/hardwire in case the 4 digit
                      ' span and the 5 digit 14489 control cause the DPs to shift)
  segs1 = cwz DIG 0   ' ALSO:  order (cwv to cwz) may need to be reversed... not sure.
  segs2 = cwz DIG 1
  segs3 = cwz DIG 2
  segs4 = cwz DIG 3

  segs5 = cwy DIG 0
  segs6 = cwy DIG 1
  segs7 = cwy DIG 2
  segs8 = cwy DIG 3

  segs9 = cwx DIG 0
  segs10 = cwx DIG 1
  segs11 = cwx DIG 2
  segs12 = cwx DIG 3

  segs13 = cww DIG 0
  segs14 = cww DIG 1
  segs15 = cww DIG 2
  segs16 = cww DIG 3

  segs17 = cwv DIG 0
  segs18 = cwv DIG 1
  segs19 = cwv DIG 2
  segs20 = cwv DIG 3

  config = %00000000     ' turn off display
  GOSUB Set_Cfg
  GOSUB Set_Digits
  config = %00000001
  GOSUB Set_Cfg

  PAUSE 15000

  GOSUB zeroCT

GOTO Main

END

' -----[ Subroutines ]-----------------------------------------------------

Set_Cfg:
  Enable = 0 ' enable 14489s
  SHIFTOUT DataIO, Clock, MSBFIRST, [config,0,0,config,0,0,config,0,0,config,0,0,config]      ' send config register
  'SHIFTOUT DataIO, Clock, MSBFIRST, [config,0,0,config,0,0,config,0,0,config,0,0,config]      ' send config register
  Enable = 1                                      ' disable 14489
  RETURN

Set_Digits:
  Enable = 0                                      ' enable 14489s
  SHIFTOUT DataIO, Clock, MSBFIRST, [dPnts\4, segs20\4, segs19\4, segs18\4, segs17\4, segs0\4, dPnts\4, segs16\4, segs15\4, segs14\4, segs13\4, segs0\4, dPnts\4, segs12\4, segs11\4, segs10\4, segs9\4, segs0\4, dPnts\4, segs8\4, segs7\4, segs6\4, segs5\4, segs0\4, dPnts\4, segs4\4, segs3\4, segs2\4, segs1\4, segs0\4]
  'SHIFTOUT DataIO, Clock, MSBFIRST, [0,0,dPnts\4, segs16\4, segs15\4, segs14\4, segs13\4, segs0\4, dPnts\4, segs12\4, segs11\4, segs10\4, segs9\4, segs0\4, dPnts\4, segs8\4, segs7\4, segs6\4, segs5\4, segs0\4, dPnts\4, segs4\4, segs3\4, segs2\4, segs1\4, segs0\4]
  Enable = 1                                      ' disable 14489s
  RETURN

Get_Counts:
  LOW flowCount                        ' Get attention of CT515-1
  PAUSE 10
  INPUT flowCount                      ' Pullup resistor pulls the pin high
  PULSIN flowCount,0,cwd               ' Header pulse duration - use this line ONLY when using the cwv0\10 line below.
  SERIN flowCount,T9600,100,noData,[ps,STR cwv0\10]
  PAUSE 50
  DEBUG DEC cwv, " ", DEC cww, " ", DEC cwx, " ", DEC cwy, " ", DEC cwz, CR

RETURN

noData:
  DEBUG "ND1", CR
  GOTO Main
RETURN

zeroCT:
    LOW flowCount                        ' Get attention of CT515-1
    PAUSE 10
    INPUT flowCount                      ' Pullup resistor pulls the pin high
    PAUSE 200
    cwv = 0
    cwd = 0
    PAUSE 200
RETURN

See video: http://www.youtube.com/watch?v=WQFeHp_97Uo

Thanks for your help!

Dave

Comments

  • jmgjmg Posts: 15,183
    edited 2012-09-08 17:55
    xanatos wrote: »
    Code below... why would the first three banks display correctly, but not the last two?

    How does it 'know' they are the last two ? - If you swap the order, does it stay the last two, or follow the same chip ?
    Usually with this type of problem, you divide and swap, to uncover the important pivot issue.
    Drop the clock speed is another simple variation.
  • xanatosxanatos Posts: 1,120
    edited 2012-09-08 18:10
    I can swap the chips with no effect- it's the code for sure. See photo of the PC Board... all the 14489s are on identical (cloned) trace patterns.

    DSC00331.JPG


    Additionally, the 14489s are daisy-chained. The DataOut from one chip feeds the DataIn on the next, that's how it "knows" it's a given position. The two display banks that are not displaying correctly are the two at the end of the chain. Only the first (right-most) 14489 display bank is actually fed from the BS2sx. These chips are basically shift registers with 7-segment-decoded outputs. They are fed with the BS2's SHIFTOUT command (see the subroutine SetDigits). The config register is also possibly incorrect, but I can't figure out why it would be correct for the first three digit banks but not the last two...

    Dave
    1000 x 750 - 136K
  • kwinnkwinn Posts: 8,697
    edited 2012-09-08 19:20
    Did you swap out the middle chip to see if the data coming out of it is bad? If this is not the case I would look at all the connections and solder joints to verify they are correct and good.
  • xanatosxanatos Posts: 1,120
    edited 2012-09-08 19:48
    The MC14489 is an oddball chip in it's data requirements. The bitstream for cascaded devices varies with each device. I have attached here a PDF of the requirements as specified by Motorola for a 5-device cascade (which I am using). In short, it specified 13 bytes for the configuration register, and 15 bytes for the digit data. My code does conform properly to the format specified where N=5 (see chart, page 2 of the reduced PDF).

    Hoping this may be useful...

    Dave
  • jmgjmg Posts: 15,183
    edited 2012-09-08 19:53
    xanatos wrote: »
    I can swap the chips with no effect- it's the code for sure.
    If you are sure it is not hardware, you can try the simplest moving test pattern, slowly clocked like once a second.
    ie You want to check you can light every segment, one at a time.
    If they were direct drive, for example, a single ON bit would shift one segment over on each clock.
  • xanatosxanatos Posts: 1,120
    edited 2012-09-08 19:57
    kwinn wrote: »
    Did you swap out the middle chip to see if the data coming out of it is bad? If this is not the case I would look at all the connections and solder joints to verify they are correct and good.

    Let me just say now, for the record, that I love you kwinn! :-)

    I swapped the last "good" chip in the chain with the first "bad" chip in the chain, expecting, basically, nothing. And lo & behold, now all five displays are functioning perfectly. How the "bad" chip could be working perfectly in another socket is a mystery to me, which I will explore in the morning. Bad socket maybe? The solder joints are impeccable, inspected under a magnifying glass and tested with a meter. Somehow just unseating the thing & reseating it, maybe.

    In any case, two wonderful things have resulted in the past six hours of digging at this: 1. It is now working! and 2: I now know more about the MC14489 than any human should ever have to know.

    Thanks again kwinn!

    Dave

    PS., jmg, you were on the right track too, but when I swapped on your suggestion, I swapped the two chips at either end of the chain. So you get props too :-)
  • jmgjmg Posts: 15,183
    edited 2012-09-08 22:43
    xanatos wrote: »
    I swapped the last "good" chip in the chain with the first "bad" chip in the chain, expecting, basically, nothing. And lo & behold, now all five displays are functioning perfectly.

    You might want to swap a few more times, (including back how it was) to see if it is a pairing issue, or a clearly-one-device issue.
    If you have more, try them too.
    You want to ensure it is not a marginal issue, that only just works.
  • kwinnkwinn Posts: 8,697
    edited 2012-09-09 00:04
    My thinking when I gave the advice was that you could have a bad output circuit on the middle chip, a bad wire bond between the chip and the pin, a bad connection between the chip pin and the socket, a bent pin on the IC, a bad solder joint, or even a cracked trace. I have seen all of these problems over the years. With bent pins, bad connections and the rest you could put the scope probe on all these areas, see perfect signals, and find that everything was working. The pressure of the scope probe was enough to fix the bad contact for a while.

    On some instruments a PM started with pulling out all the boards, tightening all the Y connector pins on the motherboard, removing and reinserting every socketed chip, cleaning the pcb contacts, and replacing the board in the chassis. A very relaxing zen like exercise, but pretty boring when you had 10 - 20 boards with 30 - 40 socketed chips on each board.
Sign In or Register to comment.