📄 mcs51_list_10_6.asm
字号:
; =======================================================================
;
; Tomasz Starecki: "Mikrokontrolery 8051 w praktyce"
; Wydawnictwo BTC - http://www.btc.pl
;
; =======================================================================
; przykladowe procedury obslugi sprzetowego interfejsu SPI
; w mikrokontrolerze 89S8252, sterujace przetwornikiem A/C i C/A
; udostepniane sa procedury jak w deklaracji PUBLIC
; wymagane zdefiniowanie (typowo w module glownym) parametr體 jak w EXTERN
; UWAGA: W przypadku programowej implementacji interfejsu SPI,
; obie procedury obslugi przetwornika pozostaja niezmienione,
; jedyna zmiana jest nieco inna implementacja procedury SPI_transfer
; (patrz na koniec listingu)
; niszczy ACC, PSW
; =======================================================================
PUBLIC _get_adc, _set_dac
adc_cs equ p1.2
dac_cs equ p1.3
sclk equ p1.7
miso equ p1.6
mosi equ p1.5
; ================================================================
; procedura sterujaca przetwornikiem A/C (wyzwolenie pomiaru
; na zadanym wejsciu przetwornika i odczyt wyniku)
; na wejsciu do procedury w R7 numer wejscia analogowego,
; na kt髍ym nalezy dokonac pomiaru napiecia
; przy wyjsciu procedury starszy bajt wyniku w R6, mlodszy w R7
; niszczy ACC, PSW
; ================================================================
_get_adc:
CLR adc_cs ; zezwolenie na komunikacja z przetwornikiem A/C
MOV SPCR, #01010001B ; ustawienie trybu pracy interfejsu SPI
MOV A, #6 ; tryb pracy przetwornika: single-ended
CALL SPI_transfer ; wyslanie pierwszego bajtu (sterujacego)
MOV A, R7
RR A ; numer wejscia analogowego
RR A ; na dw骳h najbardziej znaczacych bitach
CALL SPI_transfer ; wyslanie drugiego bajtu (numeru wejscia analogowego)
ANL A, #0FH ; maskowanie nieznaczacych bit體 wyniku
MOV R6, A ; starszy bajt wyniku do R6
CALL SPI_transfer ; odczyt mlodszego bajtu
MOV R7, A ; mlodszy bajt wyniku do R6
SETB adc_cs ; zablokowanie dalszej komunikacji
RET
; ================================================================
; procedura sterujaca przetwornikiem C/A
; na wejsciu do procedury w R7 numer wyjscia analogowego,
; w R5 warto滄 binarna napiecia wyjsciowego
; niszczy ACC, PSW
; ================================================================
_set_dac:
CLR dac_cs ; zezwolenie na komunikacje z przetwornikiem
MOV SPCR, #01010001B ; ustawienie trybu pracy interfejsu SPI
MOV A, R7
RL A ; wstepna obr骲ka dopasowywujaca dane wejsciowe
ADD A, R7 ; do formatu wymaganego przez przetwornik
XRL A, #00100001B ; slowo sterujace przetwornikiem C/A (numer wyjscia)
CALL SPI_transfer ; i jego wyslanie
MOV A, R5
CALL SPI_transfer ; wyslanie wlasciwych danych (napiecia)
SETB dac_cs
RET
; ==============================================
; procedura odpowiedzialna za obsluge sprzetowej
; wersji interfejsu SPI
; ==============================================
SPI_transfer:
MOV SPDR, A ; wysylana jest zawartosc ACC
MOV A, SPSR ; sprawdzanie w petli bitu stanu SPI
JNB ACC.7, $-2 ; w oczekiwaniu na koniec transmisji
MOV A, SPDR ; odebrany bajt bedzie w ACC
RET
; ==============================================
; i analogiczna procedura dla implementacji
; programowej, z tym ze przystosowana wylacznie
; do wysylania danych (czyli do sterowania
; przetwornikiem C/A)
; ==============================================
np. DOUT EQU P1.4
SCLK EQU P1.5
out_spi:
MOV R7, #8 ; do wyslania jest 8 bit體
loop1:
MOV C, ACC.7 ; kolejny bit do CY
MOV DOUT, C ; i na wyprowadzenie DOUT mikrokontrolera
; sluzace jako linia MOSI
SETB SCLK
CLR SCLK ; machniecie impulsem zegara na linii SCLK
RL A ; nastepny bit do wyslania na ACC.7
DJNZ R7, loop1 ; jesli nie wszystkie bity, to skok
RET ; a jesli wszystkie - powr髏 z procedury
END ; koniec modulu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -