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,129


    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.

  2. #2
    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

  3. #3
    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

  4. #4
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,129


    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

  5. #5
    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

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


    Did you find this post helpful? Yes | No

    Default

    Thanks again. You are #1!

    Ioannis

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