reducing shiftout clock freq and PS2/PC interfacing ....


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Default

    Hi all , I have some experience with PS/2 and PIC since I made interfacing between keyboard or barcode reader PS/2 and PIC microcontrollers, you may take these considrations in your work:

    1) PS/2 have two signals to communicate with it , clock and data
    2) clock generated and data sends at every falling edge of the clock
    3) each character represented with 33 bits ( make code , break code , make code)
    4) each 11 bits is consist of ( 1 start bit , 8 data bits , 1 parity bit , 1 stop bit)
    5) low level of clock duration is about 50 microsecond

    you can search on google for PS/2 keyboard interface for more specification

    I don't know the way how you use optical wireless but if you attach the schematic will be better

  2. #2


    Did you find this post helpful? Yes | No

    Exclamation

    hello iugmoh

    thanks GOD to find someone to help

    ok lets see from your points what I might have a problem with is points : 2,5

    2) clock generated and data sends at every falling edge of the clock

    ok I read this befor in a document some where but the question is how can this point implemented is there any speacial instruction that can make an affect on the clock generated from shiftout instruction ?

    OR

    does the shiftout already takes this point in the consideration ??!! oh boy this one !

    5) low level of clock duration is about 50 microsecond

    hmmm there I think it can be between 30 - 50 us but the problem how can I achive this if I use an osc = 4MHz and shiftout gives freq of clock = 50kHz

    which means low level of clock duration is about 10 microsecond , true ?!!

    so how did you solve those problems ? ( using the PICBasic )

    or should I use other IC's to help me in !!

    thanks and waiting for your replay and to see your experiance on that.

    thanks again

  3. #3
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185


    Did you find this post helpful? Yes | No

    Default

    I am sure this link is somewhere in this forum.

    http://www.computer-engineering.org/ps2protocol/
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  4. #4


    Did you find this post helpful? Yes | No

    Unhappy

    hello sayzer

    actually I know this protocolle befor the problem how can I emplement it and make an "A"
    appears on the notepad or microsoftword using pic 16f877A

    I used shiftout ...., ..... , 5 [% 010100110/11]

    but it not working how can I control the clock frequency I want it between 10 - 16.7 KHz !

    please give me some help.

  5. #5
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185


    Did you find this post helpful? Yes | No

    Default

    May be it would be much better if you write your own routine.

    You can control Clock and Data lines with more accuracy and thus play with Clock frequency as you like.

    Example:

    Code:
    <font color="#000000">        
            Temp = <font color="#FF0000"><b>$15      </b></font><font color="#000080"><i>' Send &quot;q&quot; as an example.
            
            </i></font>DatTime = <font color="#FF0000"><b>10    </b></font><font color="#000080"><i>' Data Pause Time.
            </i></font>ClkTime = <font color="#FF0000"><b>50    </b></font><font color="#000080"><i>' Clock Pause time.
            
            </i><b>OUTPUT </b></font>TxCLK    <font color="#000080"><i>' Before you send anything, assign the pins as output pins.
            </i><b>OUTPUT </b></font>TxDAT
    
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime
            TxDAT = STARTBit      <font color="#000080"><i>' Start bit is always zero.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime
            TxDAT = Temp.<font color="#FF0000"><b>0        </b></font><font color="#000080"><i>' Bit 0.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
    
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime
            TxDAT = Temp.<font color="#FF0000"><b>1        </b></font><font color="#000080"><i>' Bit 1.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime
            TxDAT = Temp.<font color="#FF0000"><b>2        </b></font><font color="#000080"><i>' Bit 2.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime
            TxDAT = Temp.<font color="#FF0000"><b>3        </b></font><font color="#000080"><i>' Bit 3.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime
            TxDAT = Temp.<font color="#FF0000"><b>4        </b></font><font color="#000080"><i>' Bit 4.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime
            TxDAT = Temp.<font color="#FF0000"><b>5        </b></font><font color="#000080"><i>' Bit 5.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime        
            TxDAT = Temp.<font color="#FF0000"><b>6        </b></font><font color="#000080"><i>' Bit 6.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime        
            TxDAT = Temp.<font color="#FF0000"><b>7        </b></font><font color="#000080"><i>' Bit 7.
            </i><b>PAUSEUS </b></font>DatTime        
            TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime        
            TxDAT = Parity        <font color="#000080"><i>' Parity Bit.
            </i><b>PAUSEUS </b></font>DatTime       <font color="#000080"><i>' You must calculate Parity bit_ 
            </i></font>TxCLK = <font color="#FF0000"><b>0               </b></font><font color="#000080"><i>'in somewhere before putting it here. 
            </i><b>PAUSEUS </b></font>ClkTime
    
        
            TxCLK = <font color="#FF0000"><b>1
            </b></font><font color="#000080"><b>PAUSEUS </b></font>DatTime        
            TxDAT = StopBit       <font color="#000080"><i>' Stop bit is always 1. 
            </i><b>PAUSEUS </b></font>DatTime           <font color="#000080"><i>' Have a variable named StopBit and make it 1.
            </i></font>TxCLK = <font color="#FF0000"><b>0
            </b></font><font color="#000080"><b>PAUSEUS </b></font>ClkTime
            
            <font color="#000080"><b>INPUT </b></font>TxCLK           <font color="#000080"><i>' when you are done with sending a byte, 
            </i><b>INPUT </b></font>TxDAT              <font color="#000080"><i>'assign the pins as input pins.
    
        
    </i></font>

    This routine works fine.
    But I am having issues with different computers.
    Thus, you will have to play with Data and Clock pauses.
    Also, you will have to have a Delay between each "SEND".
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  6. #6


    Did you find this post helpful? Yes | No

    Unhappy what is wrong with those computers !!

    ok actually I tried your code with little midifications :

    as follow:


    device 16f877a


    INPUT portb.1 ' when you are done with sending a byte,
    INPUT portb.0 'assign the pins as input pins.
    input portd.2
    StopBit var bit
    StartBit var bit
    Parity var bit
    Temp var byte
    DatTime var byte
    ClkTime var byte




    stopbit = 1
    startbit = 0
    Parity = 0 'for q parity=0

    Temp = $15 ' Send "q" as an example.

    DatTime = 10 ' Data Pause Time.
    ClkTime = 50 ' Clock Pause time.

    main:

    if portd.2=1 then sendQ
    goto main



    end

    sendQ:

    OUTPUT portb.1 ' Before you send anything, assign the pins as output pins.
    OUTPUT portb.0

    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = STARTBit ' Start bit is always zero.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime

    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.0 ' Bit 0.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.1 ' Bit 1.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.2 ' Bit 2.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.3 ' Bit 3.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.4 ' Bit 4.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.5 ' Bit 5.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.6 ' Bit 6.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Temp.7 ' Bit 7.
    PAUSEUS DatTime
    portb.1 = 0
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = Parity ' Parity Bit.
    PAUSEUS DatTime ' You must calculate Parity bit_
    portb.1 = 0 'in somewhere before putting it here.
    PAUSEUS ClkTime


    portb.1 = 1
    PAUSEUS DatTime
    portb.0 = StopBit ' Stop bit is always 1.
    PAUSEUS DatTime ' Have a variable named StopBit and make it 1.
    portb.1 = 0
    PAUSEUS ClkTime

    INPUT portb.1 ' when you are done with sending a byte,
    INPUT portb.0 'assign the pins as input pins.


    goto main




    ______________________________

    and it still not working ,nothing appears on the screan and if I used the 5V supply from the PC , the PC became freezing and nothing will work , if I used an auxiliarysupply the character " q " will not appear also as in the first case but the computer will not freezing !

    now:

    1) I thought it might be the DataTime and ClkTime values so I think to chnge them to dataTime = 18 , ClkTime=37 by using those values the period of logic one = 37us and logic zero period = 37us ( for the clock ) !! then the T=74us -> f=1/T =13.513KHz in the required range. but I didn't try it yet

    2) the second reason I was thinking about (it may look crazy - but I get missed of reasons)
    ok what I think:
    in all the cases ever the PS/2 cable that we are use was goten from a mouse " a mouse
    PS/2 cable - green - " was conntected to our Pic microcontroller !!



    so do you think that one of those might be the reason of making the PC freezing and the character not appears.




    AMAZING THAT AN ENGINEERES CAN'T MAKE A HARDWARE TO SHOW A SINGLE CHARACTER ON THE COMPUTER NOTEPAD

    and this is still the first step on my project .

    by the way thanks sayzer for your tring and for your help !! waitting to see your replay and what Ideas do you have in your mind !

  7. #7
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    As noted in Post #2, to get a key to be read by a PS/2 port, you have to send a MAKE and a BREAK scan code.
    Looking at your code, I only see 8 data bits, some timing, etc. being sent.
    Sayzer gave you good code to work with, but that's only half the battle.
    And besides, shiftout should work just fine, as long as you send the right codes (see first line of this post)...

    Also, you can shorten that up by quite a bit: (yes, here I go with my colons again!)

    Code:
    device 16f877a
    input portb.1:input portb.0:input portd.2:stopbit var bit:startbit var bit
    parity var bit:temp var byte:dattime var byte:clktime var byte
    tempbit var bit:stopbit=1:startbit=0:parity=0:Temp=$15:DatTime=10
    ClkTime=50
    main:     if portd.2=0 then main
    output portb.1:output portb.0:tempbit=startbit:gosub sendbit:tempbit=temp.0
    gosub sendbit:tempbit=temp.1:gosub sendbit:tempbit=temp.2:gosub sendbit
    tempbit=temp.3:gosub sendbit:tempbit=temp.4:gosub sendbit:tempbit=temp.5
    gosub sendbit:tempbit=temp.6:gosub sendbit:tempbit=temp.7:gosub sendbit
    tempbit=parity:gosub sendbit:tempbit=stopbit:gosub sendbit
    INPUT portb.1:INPUT portb.0:goto main
    sendbit:     portb.1=1:pauseus dattime:portb.0=tempbit:pauseus dattime:portb.1=0
                    pauseus clktime:return
    END

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