Передача строки символів:
Str2Send: DB “Hello world!”
DB 1Bh ; Символ закінчення строки для передачі
SendString:
push DPH
push DPL
push acc
mov DPTR,#Str2Send
CLR a
LoopStr1:
MOVC a,@a+DPTR
CJNE a,#1Bh,NextSend
JMP StopSend
NextSend:
CALL Send1B
INC DPTR
CLR a
JMP LoopStr1
StopSend:
pop acc
pop DPL
pop DPH
RET
Send1B:
JNB TI,$
CLR TI
MOV SBUF,a
RET
Recive1B:
JNB RI,$
CLR RI
MOV a,SBUF
RET
Схемотехніка rs232 в стенді
677 ;-------------Init RS232 --== for ADuC841 (/831)-----------
011E 120DE3 678 call IniRS831 ; iнiц.RS232 for ADuC831 -----
679 ; call IniRS841 ;(IniRS232) iнiцiал. порта RS232 & TC3
680 ; call CTSOn ; CtS0 = 0(DD16:Q5)-> HandShake = On
0121 120DFE 681 call IniTC01 ; iнiцiалiзацiя таймерiв TC0 & TC1
682 ; call IniTC2 ; #30h:16-bit AutoReload, Stop, ф-цiя ТАЙМ.
0124 120E1C 683 call IniTIC ; +SetTIC iнiц.TIC+Устан.ЧАС TIC<-з RTC/FRAM
0127 120E33 684 call Intrr ; iнiц. переривань, приоритетiв + дозволи INT
685
012D D2C0 690 setb WDWR ; дозвiл запису в WDCON сторож. таймеру
012F 75C062 691 mov WDCON,#62h ; сторож. таймер на 2,048 сек.+ WDE=ДОЗВIЛ
2897 ;============= ПIДПРОГРАМИ:= RS232, CAP, ACP =====================
2898 ;******** Драйвери послiдовного каналу для V= 57600 бод ********
2899 ;(F_кварца=11 мГц, t_кв =90.91 нс, t_циклу =1.091 мкс; T_9600бод=104 мкс)
2900 ; F_кварца=11059,2 kГц, T_кв =90.42 нс, t_Mциклу =1.085 мкс
2901 ; T_1бiту: T_9600бод=104 мкс, T_57600бод~=17 мкс
2902 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~IniRS232~~~=========
2903 ;==== IНIЦIАЛIЗАЦIЯ РОБОТИ ПОСЛIДОВНОГО ПОРТA =========
2904 ; Opys РЕГIСТРA керування режимами UART => SCON:
2905 ;SM0,SM1=00: реж.0= Shift ---------------------------------
2906 ;SM0,SM1=01: реж.1=8 бiт,T/C |SM0|SM1|SM2|REN|TB8|RB8|TI |RI |
2907 ;SM1,SM0=11: реж.3=9 бiт,T/C ---------------------------------
0DE3 2908 IniRS831: ;iнiцiалiзацiя RS232 спецiально для ADuC831 -------
2909 ; mov SCON,#01000000b ;реж.роботи RS232 = 1(8 бiт)
0DE3 759E82 2910 MOV T3CON,#82h ; 81h/20h = 115200
0DE6 759D20 2911 MOV T3FD,#20h ; 82h/20h = 57600
0DE9 759852 2912 MOV SCON,#52h ;реж.RS232 = 1(8 бiт, без парн., 1стоп,)
0DEC 22 2913 RET
2914 ;==== for ADuC841 -----
0DED 2915 IniRS841: ; for ADu841
2916 ; mov SCON,#01000000b ;реж.роботи RS232 = 1(8 бiт)
0DED 759E83 2917 MOV T3CON,#83h ; 81h/20h = 115200
0DF0 759D20 2918 MOV T3FD,#20h ; 82h/20h = 57600
0DF3 759852 2919 MOV SCON,#52h
0DF6 22 2920 RET
2921
2922 ;IniRS812: ;??? iнiц. RS232 для ADuC812 ----
2923 ; частота передачi по RS232 (!if TC1) F = (F_bq)/32*(FFFFh-RCAP2H,L)
2924 ; mov a,#250 ; задати дiльник для T/C1:=(256-250)=6 9600бод
2925 ; mov TH1,a ; F = 9 600 бод (a=255-> 57 600 бод)
2926 ;RS232Go:
0DF7 C298 2927 clr RI
0DF9 D29C 2928 setb REN ; дозволити прийом по послiдов. каналi
0DFB D299 2929 setb TI ; дозвiл передачi
0DFD 22 2930 RET
2932 ;======== IНIЦIАЛIЗАЦIЯ РОБОТИ ТАЙМЕРIВ TC0 i TC1 =============
0DFE 2933 IniTC01: ; ----------------------------------------
2934 ; Реж.таймерiв 0,1 TMOD: |Gat1|TC1|m1.1|m0.1||Gat0|TC0|m1.0|m0.0|
2935 ; ----------------------------------------
0DFE C28E 2936 clr TR1
0E00 758911 2937 mov TMOD,#00010001b ; T/C0 = реж. 1, _T/C1 = реж. 1
0E03 758801 2938 mov TCON,#00000001b ; Int0 - по фронту \_
2939 ;Кер. cпоживанням PCON: ---------------------------------
2940 ; |SMOD| x | x | x |GF1|GF0|PD |IDL|
2941 ; ---------------------------------
0E06 438780 2942 orl PCON,#80h ; SMOD=1-> без дiльника (подвiйна шв. на Tx,Rx)
2943 ; =0-> з дiльником OSC:2
2944 ; setb TR0 ; ПУСК таймера 0 (Вiдлiк сист. часу!!??)
2945 ; setb ET0 ; дозволити переривання вiд TC0
0E09 22 2946 RET
2947
2948 ;===== IНIЦIАЛIЗАЦIЯ РОБОТИ ТАЙМЕРА2 ===============================
2949 ;Для RS232-ADu812 викор.таймер2:-----------------------------------
2950 ; T2CON: |TF2|EXF2|RCLK|TCLK|EXEN2|TR2|CNT2|CAP2|
2951 ; ----------------------------------------
0E0A 75C830 2952 IniTC2: mov T2CON,#00110000b ; 16-bit AutoReload, Stop, ф-цiя ТАЙМ.(TC2)
0E0D 75CD00 2953 mov TH2,#0 ; Oчистити
0E10 75CC00 2954 mov TL2,#0 ; Tаймер 2
0E13 75CAFA 2955 mov RCAP2L,#Low(65530) ; перiод перезавантаження (delta=6)
0E16 75CBFF 2956 mov RCAP2H,#High(65530) ; (AutoReload) Таймера 2 на 57600 bod
0E19 D2CA 2957 setb TR2 ; ПУСК таймера 2
0E1B 22 2958 RET
565 ;---------------- Init ACP & CAP == for ADuC841 (/uC831)-------
566 ;Adu812 mov ADCCON1,#7Ch ; норм.реж.АЦП,& max time(14,5мкс+acq_time)
567 ;for ADu831:
0074 75EFAC 568 mov ADCCON1,#0ACh ;ExtUref,реж.АЦП, 4Mclk+4clk acq_time (~7mks)
569 ; mov ADCCON1,#08Ch ;(CCh) норм. реж.АЦП, 16Mclk+4clk acq_time
570 ;for ADu841:
571 ; mov ADCCON1,#0ECh ;ExtUref,реж.АЦП, 4Mclk+4clk acq_time (~7mks)
0077 75D808 572 mov ADCCON2,#8 ; # каналу=8?; ADCI,DMA,CCONV,SCONV=0
573
007A 75FD0D 574 MOV DACCON,#00Dh ; DAC0,1 on, 12bit, asynchronous
575 ; call LKodUout ; Загр. код в ЦАП (з Flash=PtrUout=0Ah=Uout)
576 ; поч. знач. ЦАП ~0600h +-> в копiю ЦАП
577 ; ..для уникнення перезаряду при включ.
621 ;------------ Init I2C-iнтерфейс ------------
00BE 75F800 622 MOV SPICON,#0 ; SPI =заборона, I2C = On
00C1 75E8A8 623 MOV I2CCON,#0A8h
624 ; MOV RTCSlv,#0D0h
00C4 756103 625 MOV BYTECNT,#3
00C7 C270 626 CLR NoACKI2C
00C9 C271 627 clr BusyI2C ; I2C Busy flag
00CB C272 628 clr ERRI2C ; I2C Error flag
00CD 121116 629 call I2CSTOP ; MDE=1,MDO=0,MCO=1,MDO=1,Busy=1
3273 ;======== ВЕКТОР ОБРОБКИ ПЕРЕРИВАНЬ ПОСЛIДОВНОГО ПОРТУ ===========
3274 ;a)Пров. наявнiсть команди, посланоi ПК по посл. каналу (RS232),
3275 ; вiдiслати пiдтвердження; б) прийняти або послати байт.
00C0 3276 Start1B equ 0C0h
00A5 3277 Start2B equ 0A5h
00D0 3278 EndFrmB equ 0D0h
3279
0022 3280 LngtSend equ 34 ;19 Довж.БУФ.посилки без служб. байт + CRC
0045 3281 LstAdSBf equ SendBuf+37 ;22 Адр.кiнця БУФ.посилки в ПЕОМ (з служ.бай.)
3282
000D 3283 LngtRecv equ 13 ; Довж.БУФ.прийому без служб.байт + CRC
0020 3284 LstAdRBf equ RecivBuf+16; Адр. кiнця БУФ.прийому з ПЕОМ
3285
0F69 3286 Int_RS232: ; обробка вiд TI, RI
0F69 C0D0 3287 push PSW
0F6B C0E0 3288 push acc
0F6D E5F0 3289 mov a,b ; b -> в стек
0F6F C0E0 3290 push acc
0F71 C000 3291 push 0 ; r0 -> в стек
0F73 C001 3292 push 1 ; r1 -> в стек
0F75 C002 3293 push 2 ; r2 -> в стек
0F77 309918 3294 jnb TI,Go2RI ; якщо не TI - перейти на аналiз RI
0F7A C299 3295 clr TI ; очистити флаг посилки
3296 ; cpl RdUSB ; для контролю перiоду Int_RS232
0F7C 307513 3297 jnb OnBoard,Go2RI ; if NOT SelectBoard (доступ = Off..)
0F7F 306E10 3298 jnb NextSec_fl,Go2RI ; ще нема наступного часового iнтервалу:->
3299 ; передача чергового байта з буфера
0F82 A818 3300 mov r0,SendPtr
0F84 E2 3301 movx a,@r0 ; взяти наступ-й байт для передачi
0F85 F599 3302 mov SBUF,a ; посилкa байта з (A)
0F87 08 3303 inc r0
0F88 E8 3304 mov a,r0 ; збiльшити вказiвник буф. передачi
0F89 B44504 3305 cjne a,#LstAdSBf,Next2Send ;Адр.кiнця Send_БУФ.в ПЕОМ (+служ.бай.)
0F8C C26E 3306 clr NextSec_fl ; END Посилки наступного часового iнтервалу
0F8E 7420 3307 mov a,#SendBuf ; вказiвник буф. передачi (TxD) на поч.
0F90 3308 Next2Send:
0F90 F518 3309 mov SendPtr,a ; запам'ятати вказiвник буф. передачi
3310
0F92 3311 Go2RI: ; ====== Прийом команди/даних з RS232 -------------
3312 ;- Прийом командного кадру (16 байт / 12 iнформ.)
3313 ;|C0|5A|Com|SubC|N_l|N_h|Ad_ll|Ad_h|U_l|U_h|fl1|fl2|p3l|p3h|CRD|D0|
3314 ;=- Aналiз RTSpc: 1= запит на передачу з ПЕОМ в СУ з RS232 ---
3315 ; jnb RtSIn,RxCkl ; якщо немаe RTS(-12v='1')-продовжити Xon/Xoff
0F92 309857 3316 jnb RI,EndInt232 ; якщо не RI - вихiд з Int_RS232
0F95 C298 3317 clr RI
0F97 E599 3318 mov a,SBUF
0F99 A919 3319 mov r1,RecivPtr
3320
0F9B B91008 3321 cjne r1,#RecivBuf,doNex1RI ; нi-> перевiр. на синхро-2 (=5Ah ?)
0F9E B4C012 3322 cjne a,#0C0h,doClrRecBuf ; Початок пакету ??
3323 ; СТАРТ_1 прийому командного пакету з ПЕОМ
0FA1 0519 3324 inc RecivPtr ; Збiльш. вказiвник прийнятих байт
0FA3 020FEC 3325 jmp EndInt232
3326
0FA6 3327 doNex1RI:
0FA6 B91115 3328 cjne r1,#RecivBuf+1,doNex2RI
0FA9 B45A07 3329 cjne a,#05Ah,doClrRecBuf ; 2-й байт <> 5Ah
0FAC 0519 3330 inc RecivPtr ; Збiльш. вказiвник прийнятих байт
0FAE D250 3331 setb SynxrC05A
3332 ; СТАРТ_2 прийому командного пакету з ПЕОМ
0FB0 020FEC 3333 jmp EndInt232
3334
0FB3 3335 doClrRecBuf: ; якщо (1-й байт <> 0Ch) або (2-й байт <> 5Ah)
3336 ; cjne r1,#RecivBuf,doNex2RI ; нi->зберегти черговий байт в буф.
0FB3 C250 3337 clr SynxrC05A
3338 ; clr RecvRS_fl ; ??? iде прийом командного пакету з ПЕОМ
0FB5 D253 3339 setb Err_Last ; 1=помилка прийому останньоi команди
0FB7 7410 3340 mov a,#RecivBuf
0FB9 F519 3341 mov RecivPtr,a
0FBB 020FEC 3342 jmp EndInt232
3343
0FBE 3344 doNex2RI: ; .. iде прийом командного пакету з ПЕОМ
0FBE 3050F2 3345 jnb SynxrC05A,doClrRecBuf
0FC1 F3 3346 movx @r1,a ; Save наступ-й recived байт
0FC2 09 3347 inc r1
0FC3 B92024 3348 cjne r1,#LstAdRBf,doNex3RI ; Адр.кiнця БУФ.прийому з ПЕОМ
0FC6 B4D0EA 3349 cjne a,#0D0h,doClrRecBuf ; Останнiй байт <> D0h
3350
3351 ; Переписати прийнятий пакет в командний буфер @ComKodBuf
0FC9 754F0D 3352 mov CounCom,#LngtRecv ;=13(Довж.БУФ.прийому без служб.байт+CRC)
0FCC 7912 3353 mov r1,#RecivBuf+2
0FCE 7808 3354 mov r0,#ComKodBuf
0FD0 3355 SaveReciv: ; Перенос в буфер -> @ComKodBuf
0FD0 E3 3356 movx a,@r1
0FD1 F6 3357 mov @r0,a
0FD2 09 3358 inc r1
0FD3 08 3359 inc r0
0FD4 D54FF9 3360 djnz CounCom,SaveReciv
3361 ; Очистка вказiвникiв = пiдготовка до нового пакету
0FD7 850816 3362 mov KodComm,ComKodBuf ; код прийнятоi команди (IRAM+23)
0FDA 850917 3363 mov KodSubCom,SubComm
0FDD 7410 3364 mov a,#RecivBuf
0FDF F519 3365 mov RecivPtr,a
0FE1 C250 3366 clr SynxrC05A
0FE3 C253 3367 clr Err_Last ; 0 = очист. фл. помилки прийому остан. пакету
0FE5 D252 3368 setb RecvRS_fl ; END Recive Pakcet from RS232
0FE7 020FEC 3369 jmp EndInt232
3370
0FEA 3371 doNex3RI:
0FEA 0519 3372 inc RecivPtr ; Збiльш. вказiвник прийнятих байт
0FEC 3373 EndInt232:
0FEC D002 3374 pop 2 ; r2 <- iз стекa
0FEE D001 3375 pop 1 ; r1 <- iз стекa
0FF0 D000 3376 pop 0 ; r0 <- iз стекa
0FF2 D0E0 3377 pop acc
0FF4 F5F0 3378 mov b,a ; b <- iз стекa
0FF6 D0E0 3379 pop acc
0FF8 D0D0 3380 pop PSW
0FFA 32 3381 RETI
3382
Table 34. Commonly Used Baud Rates Using Timer 3 with the 16.777216 MHz PLL Clock
Ideal Baud CD DIV T3CON T3FD % Er
230400 0 2 82H 09H 0.25
115200 0 3 83H 09H 0.25
115200 1 2 82H 09H 0.25
115200 2 1 81H 09H 0.25
57600 0 4 84H 09H 0.25
57600 1 3 83H 09H 0.25
57600 2 2 82H 09H 0.25
57600 3 1 81H 09H 0.25
38400 0 4 84H 2DH 0.2
38400 1 3 83H 2DH 0.2