1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

ATMEL89S8253, assembler

Discussion in 'Microcontrollers' started by siusia, Jun 21, 2017.

Tags:
  1. siusia

    siusia New Member

    Joined:
    Jun 21, 2017
    Messages:
    5
    Likes:
    0
    Hello,
    I need to write a program in assembler for a microcontroller ATMEL89S8253 as a college job. The microcontroller is connected to a DOS computer with rs232. The program is supposed to rely on autorepets, after pressing the button is to send many characters, but no more than 2 per second. I tried to use delays, but nothing works, please help me
     
  2. ci139

    ci139 Active Member

    Joined:
    Apr 12, 2012
    Messages:
    394
    Likes:
    34
    Last edited: Jun 21, 2017
  3. Jon Wilder

    Jon Wilder Active Member

    Joined:
    Oct 22, 2010
    Messages:
    859
    Likes:
    82
    Location:
    Fresno, CA
    Your code should look something like this. Baud rate values are assuming a 11.059MHz crystal and 9600bps.

    Code (text):

    #define   BUTTON   P1.0   ; change to port pin that button is on

       org   0x0000
       ajmp   START

       org   0x0023
    SerRx:   ; place serial interrupt handler here

       org   0x0100
    START:
       mov   TMOD,#0x21   ; timer 1 auto-reload mode (baud rate generator)
       setb   TR1       ; timer 1 run
       mov   TH1,#0xFA   ; 9600 w/11.059MHz xtal
       setb   PCON.SMOD1   ; double baud rate bit
       mov   SCON,#0x50   ; serial port mode 1 (8-bit UART)
       setb   TI       ; invoke tx complete

    MAIN:
       setb   BUTTON       ; P1.0 input
    PRESS:
       jb   BUTTON,MAIN   ; wait for button press
    RELEASE:
       jnb   BUTTON,RELEASE   ; wait for button release

    sendChar:
       jnb   TI,sendChar   ; wait for clear buffer
       clr   TI           ; acknowledge tx interrupt
       mov   SBUF,#0x41       ; send 'A'
       acall   delay2sec       ; 2 second wait
       ajmp   sendChar       ; send again (forever)

    delay2sec:
       push   ACC       ; store accumulator
       mov   A,R0       ; store R0 register
       push   ACC       ;
       mov   R0,#0x0D   ; load delay counter
       mov   TH0,#0x00   ; reset timer 0
       mov   TL0,#0x00   ;
       setb   TR0       ; timer 0 run
    delayReset:
       clr   TF0       ; clear timer 0 interrupt flag
    WAIT:  
       jnb   TF0,WAIT       ; wait for timer interrupt
       djnz   R0,delayReset   ; decrement delay counter
       clr   TR0       ; timer 0 stop
       pop   ACC       ; restore R0 register
       mov   R0,A       ;
       pop   ACC       ; restore accumulator
       ret           ; done

       end


     
     
    Last edited: Jul 17, 2017
    • Thanks Thanks x 1
  4. dave

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    -
    Likes:
    0


     
  5. siusia

    siusia New Member

    Joined:
    Jun 21, 2017
    Messages:
    5
    Likes:
    0

    Can you explain me this line? Because I have an ERROR here. Baud rate isn't working properly, I've tried this:
    mov a, pcon
    setb acc.7
    mov pcon, a
    and it doesn't work too.
     
  6. Ian Rogers

    Ian Rogers Super Moderator Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,151
    Likes:
    907
    Location:
    Rochdale UK
    ONLINE
    Have you included the correct file.. PMOD.SMOD1 isn't in the generic include file...

    Post your entire code..
     
  7. siusia

    siusia New Member

    Joined:
    Jun 21, 2017
    Messages:
    5
    Likes:
    0
    ; 10 MHz, 9600 baud rate
    Code (asm):
    ;#define   BUTTON   P1.0   ; change to port pin that button is on

           org   0
           ajmp   START

           org   23h
    SerRx:                   ; place serial interrupt handler here


        setb ren              
        setb ea              
        setb es                    


           org   100h

    START:
           mov   TMOD,#21h           ; timer 1 auto-reload mode (baud rate generator)
        setb   TR1               ; timer 1 run
           mov   TH1,#0fdh           ; 9600
         
    setb   PMOD.SMOD1         ; double baud rate bit  .SMOD1
           ;mov a, pcon           ;dodalam
           ;setb acc.7        ;dodalam
           ;mov pcon, a        ;dodalam
           mov   SCON,#050h            ;serial port mode 1 (8-bit UART)
           setb   TI                ;invoke tx complete

    MAIN:
           setb   P1.0                ;P1.0 input
    PRESS:
           jb   P1.0, MAIN            ; wait for button press
    RELEASE:
           jnb   P1.0, RELEASE            ; wait for button release

    sendChar:
           jnb   TI,sendChar            ; wait for clear buffer
           clr   TI                         ; acknowledge tx interrupt
            mov   SBUF,#33                   ; send 'A'
           acall   delay2sec            ; 2 second wait
           ajmp   sendChar                 ; send again (forever)

    delay2sec:
           push   ACC                 ; store accumulator
           mov   A,R0                ; store R0 register
           push   ACC                ;
            mov   R0,#00Dh             ; load delay counter #0x0D
           mov   TH0,#000h            ; reset timer 0
           mov   TL0,#000h            ;
           setb   TR0                ; timer 0 run
    delayReset:
           clr   TF0                ; clear timer 0 interrupt flag
    WAIT:   jnb   TF0, WAIT         ; wait for timer interrupt  DODAŁAM WAIT
           djnz   R0,delayReset            ; decrement delay counter
           clr   TR0                 ; timer 0 stop
           pop   ACC                 ; restore R0 register
           mov   R0,A                ;
           pop   ACC                 ; restore accumulator
        ret                        ; done
       end
     
     
  8. Ian Rogers

    Ian Rogers Super Moderator Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,151
    Likes:
    907
    Location:
    Rochdale UK
    ONLINE
    You need to include the header for your chip...

    #include<yourchip.h> Yon need to look it up in your documentation.

    If you omit this the generic #include<reg51.h> is used
     
  9. siusia

    siusia New Member

    Joined:
    Jun 21, 2017
    Messages:
    5
    Likes:
    0
    I use C51ASM program and I have an include file
    <code> ;*H***************************************************************************
    ; NAME: at89s8253.inc
    ;----------------------------------------------------------------------------
    ; PURPOSE: SFR Description file for AT89S8252/8253 products on C51ASM assembler
    ;*****************************************************************************

    $SAVE
    $NOLIST
    $NOMOD51

    ; PORT Registers
    P0 DATA 080H

    P0_7 BIT 087H
    P0_6 BIT 086H
    P0_5 BIT 085H
    P0_4 BIT 084H
    P0_3 BIT 083H
    P0_2 BIT 082H
    P0_1 BIT 081H
    P0_0 BIT 080H

    P1 DATA 090H

    P1_7 BIT 097H
    P1_6 BIT 096H
    P1_5 BIT 095H
    P1_4 BIT 094H
    P1_3 BIT 093H
    P1_2 BIT 092H
    P1_1 BIT 091H
    P1_0 BIT 090H
    SCK BIT 097H
    MISO BIT 096H
    MOSI BIT 095H
    SSB BIT 094H
    T2EX BIT 091H
    T2 BIT 090H

    P2 DATA 0A0H

    P2_7 BIT 0A7H
    P2_6 BIT 0A6H
    P2_5 BIT 0A5H
    P2_4 BIT 0A4H
    P2_3 BIT 0A3H
    P2_2 BIT 0A2H
    P2_1 BIT 0A1H
    P2_0 BIT 0A0H

    P3 DATA 0B0H

    P3_7 BIT 0B7H
    P3_6 BIT 0B6H
    P3_5 BIT 0B5H
    P3_4 BIT 0B4H
    P3_3 BIT 0B3H
    P3_2 BIT 0B2H
    P3_1 BIT 0B1H
    P3_0 BIT 0B0H
    RD BIT 0B7H
    WR BIT 0B6H
    T1 BIT 0B5H
    T0 BIT 0B4H
    INT1 BIT 0B3H
    INT0 BIT 0B2H
    TXD BIT 0B1H
    RXD BIT 0B0H

    ;------------------ Status register ---------------------
    PSW DATA 0D0H

    CY BIT 0D7H
    AC BIT 0D6H
    F0 BIT 0D5H
    RS1 BIT 0D4H
    RS0 BIT 0D3H
    OV BIT 0D2H
    UD BIT 0D1H
    P BIT 0D0H

    ;------------------ CPU registers ---------------------
    ACC DATA 0E0H
    B DATA 0F0H
    SP DATA 081H
    DPL DATA 082H
    DPH DATA 083H
    DP0L DATA 082H
    DP0H DATA 083H
    DP1L DATA 084H
    DP1H DATA 085H
    AUXR DATA 08EH

    ;------------------ TIMERS registers ---------------------
    TCON DATA 088H
    TF1 BIT 08FH
    TR1 BIT 08EH
    TF0 BIT 08DH
    TR0 BIT 08CH
    IE1 BIT 08BH
    IT1 BIT 08AH
    IE0 BIT 089H
    IT0 BIT 088H

    TMOD DATA 089H

    T2CON DATA 0C8H
    TF2 BIT 0CFH
    EXF2 BIT 0CEH
    RCLK BIT 0CDH
    TCLK BIT 0CCH
    EXEN2 BIT 0CBH
    TR2 BIT 0CAH
    C_T2 BIT 0C9H
    CP_RL2 BIT 0C8H

    T2MOD DATA 0C9H
    TL0 DATA 08AH
    TL1 DATA 08BH
    TL2 DATA 0CCH
    TH0 DATA 08CH
    TH1 DATA 08DH
    TH2 DATA 0CDH
    RCAP2L DATA 0CAH
    RCAP2H DATA 0CBH
    WDTRST DATA 0A6H
    WDTCON DATA 0A7H


    ;------------------- UART registers ------------------------
    SCON DATA 098H
    SM0 BIT 09FH
    FE BIT 09FH
    SM1 BIT 09EH
    SM2 BIT 09DH
    REN BIT 09CH
    TB8 BIT 09BH
    RB8 BIT 09AH
    TI BIT 099H
    RI BIT 098H

    SBUF DATA 099H
    SADEN DATA 0B9H
    SADDR DATA 0A9H

    ;-------------------- IT registers -----------------------
    IE DATA 0A8H
    IP DATA 0B8H
    IPH DATA 0B7H

    ; IE
    EA BIT 0AFH
    ET2 BIT 0ADH
    ES BIT 0ACH
    ET1 BIT 0ABH
    EX1 BIT 0AAH
    ET0 BIT 0A9H
    EX0 BIT 0A8H

    ; IP
    PT2 BIT 0BDH
    PS BIT 0BCH
    PT1 BIT 0BBH
    PX1 BIT 0BAH
    PT0 BIT 0B9H
    PX0 BIT 0B8H

    ;-------------------- OSC control registers ----------------------
    PCON DATA 087H
    CLKREG DATA 08FH

    ;-------------------- EEPROM Data registers-----------------------
    EECON DATA 096H

    ;-------------------- SPI registers ------------------------------
    SPDR DATA 086H
    SPSR DATA 0AAH
    SPCR DATA 0D5H



    $RESTORE
    </code>
     
    Last edited: Jun 27, 2017
  10. Ian Rogers

    Ian Rogers Super Moderator Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,151
    Likes:
    907
    Location:
    Rochdale UK
    ONLINE
    Looks like Jon's on some powder!!

    You are correct.. use PCON.SMOD1.. and not PMOD.SMOD1
     
    • Like Like x 1
  11. siusia

    siusia New Member

    Joined:
    Jun 21, 2017
    Messages:
    5
    Likes:
    0
    One more question, why there is 0x0D? Is it ok for 10 MHz?
     
    Last edited: Jun 27, 2017
  12. Jon Wilder

    Jon Wilder Active Member

    Joined:
    Oct 22, 2010
    Messages:
    859
    Likes:
    82
    Location:
    Fresno, CA
    Actually, it was for 11.0592MHz, which is the most common crystal frequency used with 9600bps. But even with that my math was off. R0 should be loaded with 0x1C, which is decimal 28. With a 11.059MHz crystal and timer 0 operating in 16-bit mode, it will interrupt 28 times in 2 seconds. Loading R0 makes it count interrupts until it reaches 28, in which 2 seconds will have lapsed.

    If you're using 10MHz, you will not be able to achieve the standard 2400, 4800, and 9600bps bit rates no matter which timer you use. You'll be so far off it will never communicate properly. I highly suggest going with a 11.0592MHz crystal for this.

    And yes Ian that was a typo on my part. PCON is the correct register for the double baud rate bit.
     
    Last edited: Jul 17, 2017
  13. Jon Wilder

    Jon Wilder Active Member

    Joined:
    Oct 22, 2010
    Messages:
    859
    Likes:
    82
    Location:
    Fresno, CA
    Timer 1 as baud rate generator -
    PCON.SMOD1 = 0

    TH1 Reload Value = 256 - ((Fosc / 384) / Baud)

    10MHz / 384 = 26041.6667
    26041.6667 / 9600 = 2.713
    256 - 2.713 = 253.287

    You'd have to go with either 253 or 254, which would result in baud rates of -

    253 would result in a baud rate of 8680.556bps
    254 would result in a baud rate of 13.020.833bps

    PCON.SMOD1 = 1

    TH1 Reload Value = 256 - ((Fosc / 192) / Baud)

    10MHz / 192 = 52083.333
    52083.333 / 9600 = 5.426
    256 - 5.426 = 250.574

    You'd have to go with either 250 or 251, which would result in baud rates of -

    250 would result in a baud rate of 8680.556bps
    251 would result in a baud rate of 10416.667bps

    Using timer 2 would result in a bit rate of -

    RCAP2H:RCAP2L Reload Value = 65536 - ((Fosc / 32) / Baud
    10000000 / 32 = 312500
    312500 / 9600 = 32.552
    RCAP2 = 65536 - 32.552 = 65503.448

    65503 would result in a bit rate of 9469.7bps
    65504 would result in a bit rate of 9765.625bps

    While using timer 2 MIGHT work, you'd have anywhere from a 1.3% - 1.7% BER (Bit Error Rate), which might work but I still question the reliability and the chances of frame errors. Why even deal with it when a crystal is dirt cheap and it's a commonly available crystal?

    Use a 11.0592MHz crystal and you'll have 0% BER.
     
    • Like Like x 1

Share This Page