Shop OBEX P1 Docs P2 Docs Learn Events
Porting Atmel C to PASM ... — Parallax Forums

Porting Atmel C to PASM ...

MacTuxLinMacTuxLin Posts: 821
edited 2012-05-31 01:33 in Propeller 1
Hello All,

After getting this chip (AT88SA102S) & mounted it on my board, I realised I had problems with this chip despite thoroughly reading the datasheet, which I later found it had missed out an important sleep_to_wake time that I discovered in the source code. But still, does not seems to solve the problem. Basically, I'm trying to get a response from the chip to ensure my timing are OK but it just did not initiate a t_start.

To access this chip, I need to send a Wake Token, followed by a Transmit Flag with a sleep_to_wake time in between & I ought to get a $11 in return. Please excuse the mess as they are still work-in-progress. I must have err somewhere.

As always, thanks a lot.
'------------------------------------------------------------------------------
' ### AT88SA102S ### - (New 29 May 2012)
' input:  declared inside
' output: 1 byte, suppose to reply from Wake Token signal
'------------------------------------------------------------------------------
_at_newWaketoken        mov     bitCnt, #8              ' read an 8-bit byte
                        
                        'Set pin as output
                        mov     dira, dataMask


                        mov     value, #$F0     ' Set value
                        mov     cnt, cnt
                        add     cnt, #9


                        '-----------------------------------------------------------------------
                        'Send Wake Signal
                        '-----------------------------------------------------------------------
:_at_sendWakeAgain      waitcnt cnt, write_t_szhilo
                        or      dira, dataMask  'Low
                        waitcnt cnt, write_t_szhilo
                        andn    dira, dataMask  'High
                        shr     value, #1 wc
                        waitcnt cnt, write_t_szhilo
                        muxnc   dira, dataMask            ' low/high
                        waitcnt cnt, write_high_short
                        andn    dira,dataMask            ' low/high
                        djnz    bitCnt, #:_at_sendWakeAgain
                        
                        '* Sleep-Wake Delay (30 May 2012), found this in Atmel's code for AT88SA102S
                        waitcnt cnt, sleepWake_Delay


                        '-----------------------------------------------------------------------
                        'Send Transmit Flag
                        '-----------------------------------------------------------------------
                        mov     value, #$88
                        mov     bitCnt, #8
                        
:_at_newTransmit        waitcnt cnt, write_t_szhilo
                        or      dira, dataMask  'Low
                        waitcnt cnt, write_t_szhilo
                        andn    dira, dataMask  'High
                        shr     value, #1 wc
                        waitcnt cnt, write_t_szhilo
                        muxnc   dira, dataMask            ' low/high
                        waitcnt cnt, write_high_short
                        andn    dira,dataMask            ' low/high
                        djnz    bitCnt, #:_at_newTransmit
                        waitcnt cnt, #0


                        'Set pin as input
                        andn    dira, dataMask


                        '-----------------------------------------------------------------------
                        'Read byte from AT88SA
                        '-----------------------------------------------------------------------
                        mov     bitCnt, #8              ' read an 8-bit byte
                        mov     shiftCnt, #32           ' get shift count
                        sub     shiftCnt, bitCnt
                        mov     cnt, cnt
                        add     cnt, #9

:_at_newReadBlock       waitcnt cnt, readByte_LH  'readByte_HighLong
:_at_newReadBitLow      test    dataMask, ina wz        ' Should be Low
              if_nz     jmp     #:_at_newReadBitLow     ' Waiting for start signal (low) from IC   <--- !!!! STUCK HERE !!!!
                 
                        add     cnt, readByte_LH
:_at_newReadBitHigh     test    dataMask, ina wc
              if_nc     jmp     #:_at_newReadBitHigh
                        add     cnt, readByte_LH
                        test    dataMask, ina wz
                        ror     value, #1
                        waitcnt cnt, readByte_HighLong


                        'Check to make sure it is High
:_at_newReadMakeSure    test    dataMask, ina wc
              if_nc     jmp     #:_at_newReadMakeSure     

                        djnz    bitCnt, #:_at_newReadBlock
                        shr     value, shiftCnt

                        'Reset pin as output 
                        mov     dira, dataMask          ' Bring up again
                        

_at_newWaketoken_ret
_at_new_ret             ret



'-------------------- constant values -----------------------------------------
wake_whi                long    12_000           '3.2ms, Min is 2.5ms but since _delay is multiple of 4 so use 3.2ms
t_timeout               long    40_000          'Min is 45 msec


'--- New --- (29 May 2012)  
wake_low                long    6_400           'Try 80 usec, min is 60 usec in datasheet
wake_high               long    200_000         'Try 2.5 msec, min is 2.5msec in datasheet


write_t_szhilo          long    347             '4.34 usec (t_start, t_zhi, t_zlo) all shares the same value.
write_high_long         long    2_425           't_bit - t_start - t_zhi = 30.32 usec
write_high_short        long    2_079           't_bit - t_start - t_zhi - t_zlo = 25.98 usec


readByte_LH             long    480             'Both Low & High is 6 usec (typ value), min 4.6 usec, max 8.6 usec
readByte_HighLong       long    2_880           '36us ,Read from 102s remaining time after last low in logic 0


sleepWake_Delay         long    135_040         '2_000 usec - 8-bytes * 39 usec = 1_688 usec = 135_040 ticks        


              


I'm trying to port the same flow as these shown over to PASM (full source attached)

    //##########################################################################
    // Setup the communication timer
    //
    TCCR1B &= ~(_BV(CS12) | _BV(CS10)); // clock source disabled


    // Clear the counter registers
    //
      TCNT1 = 0;         


    // Clock source enabled. We use a pre-scaler value of 64
    //
    TCCR1B |= (_BV(WGM12) | _BV(CS11) | _BV(CS10));  


    // Clear the timer compare flag.
    //
    TIFR1 |= (1 << OCF1A); 


    // Set the timer to time the entire packet process 
    //   (Wake+WakeDelay+Transmit+Command+MacOut+ExecutionDelay+Transmit+TurnaroundDelay+Transmit+DigestOut)
    //
    OCR1A = MAX_MAC_TIME;    


    //##########################################################################
    // Send the wake token
    //
    SendByte(WAKE_TOKEN);


    //##########################################################################
    // Mandatory sleep->wake delay (not in spec)
    //
    while (TCNT1 < SLEEP_TO_WAKE_TIME)
        ;


    //##########################################################################
    // Send transmit flag
    //
    SendByte(FLAG_CLIENT_TRANSMIT);


    //##########################################################################
    // Get the wakup "SYNC" packet
    //
    if (!ReceivePacket())
    {
        //#######################################################################
        // Send the command flag + command payload + transmit
        //
        for (index = 0; index < sizeof(cmd_MAC); index++)
            SendByte(cmd_MAC[index]);


        //#######################################################################
        // Wait tExec, send transmit flag
        //
        while (TCNT1 < MAC_COMMAND_TEXEC_WAIT)
            ;


        SendByte(FLAG_CLIENT_TRANSMIT);


        //#######################################################################
        // We can now wait here until the chip responds or the overall timer
        // fires.  
        //
        returnVal = ReceivePacket();
    }


    //##########################################################################
    // Send Sleep flag
    //    
    SendByte(FLAG_SLEEP);
    return returnVal;
c
c
11K
sa10.c 10.7K

Comments

  • pedwardpedward Posts: 1,642
    edited 2012-05-30 13:08
    As an aside, I wrote a SHA-256 algorithm in PASM, so if that's all you are using this for, you could simply reuse that code. It's the code that was written for the P2 ROM code.
  • pedwardpedward Posts: 1,642
    edited 2012-05-30 13:09
    Have you put a scope or logic analyzer on the lines to see if the timing is correct, per the constants? You could use the Prop itself as a LA with 1 COG doing the timing analysis and dumping the data over a serial connection. MY experience has been that when you write "correct" code, the culprit is in the hardware and you have to rewrite your code to compensate.
  • MacTuxLinMacTuxLin Posts: 821
    edited 2012-05-31 01:33
    That's right, I'll probe the Atmel board ... Thanks pedward.
Sign In or Register to comment.