Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САПР_ЗВ(лек7-RS232).doc
Скачиваний:
3
Добавлен:
30.08.2019
Размер:
815.1 Кб
Скачать

Передача строки символів:

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