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?
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
das simpel. (als je weet hoe
)
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 ]