Niet van plan het warm water opnieuw uit te vinden stel ik hier deze vraag...

Ik zou asynchroon een string moeten kunnen versturen over de seriele poort van een 8051 µC (AT89S8252 in eerste instantie). Zeer concreet zou ik als testprogramma bvb het volgende willen :

1. gebaseerd op timer2 stuur ik iedere 100ms de string "123"
2. gelijkertijd stuur ik voor iedere ontvangen byte de string "456" door.

programmeertaal mag A51 of C51 zijn.
Ik ben er zeker van dat ik niet de eerste ben die gelijkaardige functionaliteit moet programmeren. Toch vind ik hierover zo goed als niets op het internet.

Heeft er toevallig iemand zoiets liggen?

das simpel. (als je weet hoe :p )

bon. je moet je uart configureren voor de juiste baudrate


PL/M-51 COMPILER   03/18/:6            PAGE   1
DOS 5.0 (038-N) PL/M-51 V1.2
COMPILER INVOKED BY:  C:\8051\PLM51.EXE A.PLM ROM(LARGE)
             
   1   1      a: do ;
              $nolist
              $code
   5   1      declare v24spd literally '250' ;        /* baudrate = 115k at 22.1 mhz        */
   6   2        int1_server: procedure interrupt 1;  /* uart receive */
   7   2            RI=0; /* clear recieve interrutp */
   8   3            do while not TI;
   9   3            end;
  10   2            TI=0;
  11   2            Sbuf0 ='4';
  12   3            do while not TI;
  13   3            end;
  14   2            TI=0;
  15   2            Sbuf0 ='5';
  16   3            do while not TI;
  17   3            end;
  18   2            TI=0;
  19   2            Sbuf0 ='6';
  20   1        end int1_server;
  21   2        int2_server :procedure interrupt 2; /* timer2*/
  22   3            do while not TI;
  23   3            end;
  24   2            TI=0;
  25   2            Sbuf0 ='1';
  26   3            do while not TI;
  27   3            end;
  28   2            TI=0;
  29   2            Sbuf0 ='2';
  30   3            do while not TI;
  31   3            end;
  32   2            TI=0;
  33   2            Sbuf0 ='3';
  34   1        end int2_server;
  35   1        PCON = 80h;                     /* Disable divider                      */
  36   1        TMOD = 22h;                     /* Auto reload timer 1                  */
  37   1        TH1  = V24SPD;                  /* high byte                            */
  38   1        Tl1  = V24SPD;                  /* high byte                            */
  39   1        SCON0 = 52h;                    /* Init serial port                     */
  40   1        TR1 = 1 ;
  41   1        enable;   /* interrupts on */
  42   2        do while 1;
                   /* niks . alles is interrupt driven */    43   2        end;
  44   1      end a

PL/M-51 COMPILER   03/18/:6            PAGE   3


              ; PROCEDURE INT1_SERVER (START)
                                     
0000  C298              CLR   RI         ; STATEMENT # 7
0002          WHILE?1:
0002  209902            JB    TI,WEND?2  ; STATEMENT # 8
0005  80FB              SJMP  WHILE?1    ; STATEMENT # 9
0007          WEND?2:
0007  C299              CLR   TI         ; STATEMENT # 10
0009  759934            MOV   SBUF0,#34H ; STATEMENT # 11
000C          WHILE?3:
000C  209902            JB    TI,WEND?4  ; STATEMENT # 12
000F  80FB              SJMP  WHILE?3    ; STATEMENT # 13
0011          WEND?4:
0011  C299              CLR   TI         ; STATEMENT # 14
0013  759935            MOV   SBUF0,#35H ; STATEMENT # 15
0016          WHILE?5:
0016  209902            JB    TI,WEND?6  ; STATEMENT # 16
0019  80FB              SJMP  WHILE?5    ; STATEMENT # 17
001B          WEND?6:
001B  C299              CLR   TI         ; STATEMENT # 18
001D  759936            MOV   SBUF0,#36H ; STATEMENT # 19
0020  22                RET              ; STATEMENT # 20
; PROCEDURE INT1_SERVER (END)

; PROCEDURE INT2_SERVER (START)
0021          WHILE?7: 
0021  209902            JB    TI,WEND?8  ; STATEMENT # 22
0024  80FB              SJMP  WHILE?7    ; STATEMENT # 23
0026          WEND?8:
0026  C299              CLR   TI         ; STATEMENT # 24
0028  759931            MOV   SBUF0,#31H ; STATEMENT # 25
002B          WHILE?9:
002B  209902            JB    TI,WEND?10 ; STATEMENT # 26
002E  80FB              SJMP  WHILE?9    ; STATEMENT # 27
0030          WEND?10:
0030  C299              CLR   TI         ; STATEMENT # 28
0032  759932            MOV   SBUF0,#32H ; STATEMENT # 29
0035          WHILE?11:
0035  209902            JB    TI,WEND?12 ; STATEMENT # 30
0038  80FB              SJMP  WHILE?11   ; STATEMENT # 31
003A          WEND?12:
003A  C299              CLR   TI         ; STATEMENT # 32
003C  759933            MOV   SBUF0,#33H ; STATEMENT # 33
003F  22                RET              ; STATEMENT # 34
; PROCEDURE INT2_SERVER (END)
                                     
0040  758780            MOV   PCON,#80H ; STATEMENT # 35
0043  758922            MOV   TMOD,#22H ; STATEMENT # 36
0046  758DFA            MOV   TH1,#0FAH ; STATEMENT # 37
0049  758BFA            MOV   TL1,#0FAH ; STATEMENT # 38
004C  759852            MOV   SCON0,#52H ; STATEMENT # 39
004F  D28E              SETB  TR1 ; STATEMENT # 40
0051  D2AF              SETB  0A8H.7 ; STATEMENT # 41
0053          WHILE?13:
0053  80FE              SJMP  WHILE?13 ; STATEMENT # 43
0055          WEND?14:
; PROCEDURE A (END)

2 IS THE HIGHEST USED INTERRUPT

MODULE INFORMATION:                (STATIC+OVERLAYABLE)
    CODE SIZE                      = 0055H        85D
    CONSTANT SIZE                  = 0000H         0D
    DIRECT VARIABLE SIZE           =   00H+00H     0D+  0D
    INDIRECT VARIABLE SIZE         =   00H+00H     0D+  0D
    BIT SIZE                       =   00H+00H     0D+  0D
    BIT-ADDRESSABLE SIZE           =   00H+00H     0D+  0D
    AUXILIARY VARIABLE SIZE        = 0000H         0D
    MAXIMUM STACK SIZE             = 0011H        17D
    REGISTER-BANK(S) USED:           0
    341 LINES READ
    0 PROGRAM ERROR(S)
END OF PL/M-51 COMPILATION

[Bericht gewijzigd door free_electron op ]