Slave PIC to be used like CD4021 chip


Closed Thread
Results 1 to 18 of 18

Hybrid View

  1. #1
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,140


    Did you find this post helpful? Yes | No

    Default

    Thank you all for the tips. Well, Darrel, it is more than a starting point. It is almost done! Thanks a lot. Also, yes 64 bit is OK. I stuck on 65 for some reason...

    Soon I will post the results.

    Ioannis

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Exclamation

    Just made a couple changes. I used the same loop var in the interrupt handler. DOH!
    Changed it to X, was I.

    Also turned off the upper A/D ports.
    ANSELH = 0

    2 less bugs anyways.
    <br>
    DT

  3. #3
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,140


    Did you find this post helpful? Yes | No

    Default

    One more bug. On the main the first If/Then needs a gosub.

    I have to admit that your writing style is very clever. Especially I liked the handling of AD inputs with the OR statement. Very clever indeed!

    Thanks again!

    Ioannis

    Edit: Another bug would be the channel selection of A/D module. Since the 883 does not have 5,6 and 7 channel available, it cannot be used as it is the program. Of course it works as is for the bigger cousins 884 and 887.
    Last edited by Ioannis; - 10th September 2008 at 21:18.

  4. #4
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Ioannis View Post
    One more bug. On the main the first If/Then needs a gosub.
    Ahhh, yes it does. Good catch.

    Another bug would be the channel selection of A/D module. Since the 883 does not have 5,6 and 7 channel available, it cannot be used as it is the program. Of course it works as is for the bigger cousins 884 and 887.
    DOH!

    I wish they'd make the datasheets individually. A separate one for each of the 882/883/884/886/887. Instead of jamming a whole series in one sheet so you have to pick out the differences on your own.

    OK, there's still more than 8 A/D's in there, I'll have to find a workaround.
    Unless you beat me to it.
    <br>
    DT

  5. #5
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default Update

    Moved pins away from the RB1 - RB3 (AN8 - AN10).

    Added GOSUB you found.

    Modified A/D channel selection.

    Sure wish I had one of these chips. BTW, will you be using a different chip?
    Code:
    '****************************************************************
    '*  Name    : Shift4021.pbp                                     *
    '*  Author  : Darrel Taylor                                     *
    '*  Date    : 9/9/2008                                          *
    '*  Version : 1.1                                               *
    '*  Notes   : Target = 16F883, Internal 8mhz OSC                *
    '*  Thread  : Slave PIC to be used like CD4021 chip             *
    '*     http://www.picbasic.co.uk/forum/showthread.php?t=9544    *
    '****************************************************************
    @    __config _CONFIG1, _INTOSCIO & _WDT_OFF & _LVP_OFF & _CPD_OFF
    DEFINE OSC 8
    
    Clear
    
    PloadPin  VAR PORTB.0      ; Parallel Load (INT)
    ClkPin    VAR PORTB.4      ; Serial Clock
    SerInPin  VAR PORTB.5      ; Serial Input Pin
    SerOutPin VAR PORTB.6      ; Serial Output Pin
    
    ADbuff    VAR BYTE[8]      ; Buffers the A/D readings
    ShiftReg  VAR BYTE[8]      ; The 64-bit shift register
    
    I         VAR BYTE         ; Index variables
    X         VAR BYTE
    BitIdx    VAR BYTE
    ADidx     VAR BYTE
    ADchannel VAR BYTE         ; Actual AD ch being used (5,6,7 missing)
    ClkState  VAR BIT          ; for locating clk edges
    DataBit   VAR BIT          ; Serial In read on falling edge
    
    INTE      VAR INTCON.4     ; Aliases
    INTF      VAR INTCON.1
    GoDone    VAR ADCON0.1
    
    ;---------------------------------------------------------------------------
    Initialize:
        OSCCON = %01110001         ; Internal 8Mhz OSC
        INPUT PloadPin             ; Input(default), just to make sure
        INPUT ClkPin               
        INPUT SerInPin                 
        LOW   SerOutPin            ; start with output LOW
        ADCON0 = %10000001         ; FOSC/32, CH0, ADON
        ANSELH = %00000111         ; Turn off upper A/D ports (8,9,10 used)
        INTF = 0                   ; clear INT flag
        INTE = 1                   ; enable INT interrupt
        ON INTERRUPT goto ParallelLoad
    ;---------------------------------------------------------------------------
    Main:
        if !GoDone then GOSUB NextAD   ; conversion complete, get results
        IF ClkPin then                 ; wait for Rising edge
            if !ClkState then
                ClkState = 1 
                GOSUB NextBit          ;   Rising edge found, shift data
            endif
        else                           ; wait for falling edge
            if ClkState then
                ClkState = 0
                DataBit = SerInPin     ;   falling edge found, read input
            endif
        endif
    GOTO Main
    
    ; ---- Cycle thru each A/D channel, one at a time --------------------------
    NextAD:
        ADbuff(ADidx) = ADRESH             ; save A/D result
        ADidx = ADidx + 1                  ; point to next A/D channel
        if ADidx = 8 then ADidx = 0        ; circle around
        ADchannel = ADidx
        if ADidx > 4 then 
            ADchannel = ADchannel + 3      ; correct for missing AN 5,6,7
        endif   
        ADCON0 = %10000001 | (ADchannel << 2)  ; Set the A/D ch.
        for I = 1 to 5                     ; Acquisition time
            @ NOP
        NEXT I
        GoDone = 1                         ; Start A/D conversion
    RETURN
    
    DISABLE
    ; ---- Parallel Load -- copy A/D buffer to Shift register ------------------
    ParallelLoad:
        For X = 0 to 7                     ; Copy A/D results
            ShiftReg(X) = ADbuff(X)
        NEXT X
        SerOutPin = ShiftReg.0(63)         ; put MSB on Pin
        BitIdx = 63                        ; start shifting from MSB
        DataBit = SerInPin                 ; read input bit
        INTF = 0                           ; clear the interrupt flag
    RESUME
    
    ; ---- Put next bit on the output pin --------------------------------------
    NextBit:
        ShiftReg.0(BitIdx) = DataBit        ; replace bit with the input data
        BitIdx = BitIdx - 1                 ; point to next bit
        if BitIdx.7 = 1 then BitIdx = 63    ; circle back to beginning
        SerOutPin = ShiftReg.0(BitIdx)      ; put data on output Pin
    return
    DT

  6. #6
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,140


    Did you find this post helpful? Yes | No

    Default

    Thank Darrel. You tempted me to use the new 88x series as I am used to the old 87x ones. But I had a look over the 16F690 and I think is the best for the job and cheaper too. It has the RS-Flip Flop also for anyone willing to do Touch sensors for buttons.

    Thanks for the efforts very much.

    Ioannis

  7. #7
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    16F690!

    Dang it, don't have one of those either.
    I really need to expand my inventory.

    Looks like it'll do the job for sure.
    Hope it all works out.

    DT

Similar Threads

  1. ShiftOut. Using PIC as Slave device.
    By TonyA in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 16th March 2010, 19:10
  2. Reading a slave USB with a pic
    By pcaccia in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 25th October 2008, 12:00
  3. Camera with PIC chip
    By The Master in forum Off Topic
    Replies: 5
    Last Post: - 1st July 2008, 14:28
  4. PIC chip resetting. Very weird
    By The Master in forum Off Topic
    Replies: 0
    Last Post: - 28th October 2007, 17:07
  5. Use pic as slave in I2C
    By robert0 in forum General
    Replies: 2
    Last Post: - 3rd February 2006, 19:26

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts