This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

assembler in c, UART

Hi i have got code for an assembler software UART in c51.
normally putchar() is of type unsigned char but with the assembler code how do i do this?

void putc()
{
#pragma asm
  * Transmit character in A via TXD line
  *
  putc  CLR     TXD             Drop line for start bit
        MOV     R0,#BITTIM      Wait full bit-time
        DJNZ    R0,*            For START bit
        MOV     R1,#8           Send 8 bits
  putc1 RRC     A               Move next bit into carry
        MOV     TXD,C           Write next bit
        MOV     R0,#BITTIM      Wait full bit-time
        DJNZ    R0,*            For DATA bit
        DJNZ    R1,putc1        write 8 bits
        SETB    TXD             Set line high
        RRC     A               Restore ACC contents
        MOV     R0,#BITTIM      Wait full bit-time
        DJNZ    R0,*            For STOP bit
        RET
  *
#pragma endasm
}

Parents Reply Children
  • my UARTS have failed....granted my fault most probably but im learning.

    What does that mean? that when your code does not work, instead of fixing it, you try another approach?

    That, dear friend, is the road to abject failure.

    Erik

  • ok i have done that but it is still not working?

    void putc(unsigned char c)
    {
    #pragma asm
    * Transmit character in A via TXD line
    *
            MOV     DPTR,#c?441
            MOV     A,R7
            MOVX    @DPTR,A
    putc    CLR     TXD             Drop line for start bit
    
            MOV     R0,#BITTIM      Wait full bit-time
            DJNZ    R0,*            For START bit
            MOV     R1,#8           Send 8 bits
    putc1   RRC     A               Move next bit into carry
            MOV     TXD,C           Write next bit
            MOV     R0,#BITTIM      Wait full bit-time
            DJNZ    R0,*            For DATA bit
            DJNZ    R1,putc1        write 8 bits
            SETB    TXD             Set line high
            RRC     A               Restore ACC contents
            MOV     R0,#BITTIM      Wait full bit-time
            DJNZ    R0,*            For STOP bit
            RET
    *
    #pragma endasm
    }
    
    

    these are the new lines that were created:

            MOV     DPTR,#c?441
            MOV     A,R7
            MOVX    @DPTR,A
    

  • my UARTS have failed
    .......
    but it is still not working

    What do you connect to? if it is a 232 port (PC) is your MAX232(equivalent) working? if it is a modem (at TTL level or 232) do you know that in that case many are documented and labelled so tx connect to tx?

    Tell the whole story, till that is known discussing your code is immaterial.

    Erik

  • no it is not hardware,im using the max232. i have only one working board, the other i was previously working and does not work with the same code that works on the other. the UART really seems to have failed and thus need a software version to show in a presentation next week :-s

  • if you blew the Rx or Tx pins you can not use them for a soft UART either.

    the UART really seems to have failed and thus need a software version to show in a presentation next week

    is saving $5 more impportant than meeting the deadline?

    GO SPEND $5 and get a new chip instesd of mucking around with this.

    Erik

  • "i have only one working board, the other i was previously working and does not work with the same code that works on the other."

    you really need to fix the underlying problem here - throwing in more untried and untested software into an already unreliable system is a really bad idea!!

    "need a software version to show in a presentation next week"

    On a deadline like that, now is most certainly not the time to start mucking about with software uarts!

    You cannot buy extra time - but you can buy a new chip!

  • "ok i have done that"

    No, you haven't - you still have inline assembler in your 'C' source.

    Go back and follow the 5 steps.

    Read: http://www.keil.com/support/docs/1671.htm

    Is this something you really want to be starting from scratch with only a week until your presentation...?!

    :-0

  • "im using the max232"

    You're using a MAX232 and you've still managed to blow up the UART?!

    The MAX232 should protect against most abuse - so if you've blown the UART you must have done something pretty drastic!!

    :-0

    If that's the case, it's even less likely that the rest of the chip is undamaged...

  • An excellent method of killing a UART despite the use of a MAX232 is to kill it _with_ the MAX232 - just reverse inputs and outputs on the MAX232 ;)

  • You must have a very twisted mind...

  • No not with #pragma asm

    create a file containg only this:

    void putc(unsigned char c)
    {

    }

    when you compile it as previously directed the compiler will generate an empty c calable asm subroutine.

    rename the file to .A51
    remove the origional from the project.
    add your ASM code to the new empty ASM subroutine
    Add the new A51 file to you project then done.