Tải bản đầy đủ (.docx) (29 trang)

báo cáo thí nghiệm vi xử lý giao tiếp serial port eeprom rtc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (436.75 KB, 29 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>KHOA ĐIỆN – ĐIỆN TỬ</b>

<b>Báo cáo thí nghiệm</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>THAM KHẢO:</b>

<b>BÀI 2BÀI 1</b>

➢ Hiểu và sử dụng được các ngoại vi UART, I2C, SPI ➢ Hiểu cách giao tiếp với RTC, EEPROM

➢ Tài liệu hướng dẫn thí nghiệm, chương 7, 9, 11

➢ Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf

a) Kết nối chân TxD và RxD của UART0 vào vào tín hiệu UART_TxD0 và UART_RxD0 trên header J85 ở khối UART.

b) Kết nối dây USB-Serial vào kit thí nghiệm

c) Setup chương trình Hercules với baudrate 9600, 8 bit data, no parity, 1 stop, no handshake. d) Sử dụng các ví dụ mẫu trong tài liệu thí nghiệm, viết chương trình khởi động UART0 với

các thơng số như trên, chờ nhận một byte từ UART0 và phát ngược lại UART0.

e) Dùng Hercules truyền một ký tự xuống kit và quan sát các dữ liệu nhận được để kiểm tra hoạt động chương trình.

(Lưu ý: tần số xung clock cho CPU trên kit thí nghiệm là 8Mhz)

a) Kết nối các tín hiệu SDA và SCL của AVR vào các tín hiệu tương ứng trên module RTC. Kết nối 1 chân port vào tín hiệu MFP. Kết nối LCD 16x2 vào 1 port của AVR

b) Viết chương trình con khởi động RTC với thời gian hiện hành, cấu hình xung MFP tần số 1Hz. Sau đó cứ mỗi cạnh lên của MFP, đọc các giá trị ngày tháng năm giờ phút giây của RTC và cập nhật lên LCD

<b>MỤC TIÊU:</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>BÀI 4BÀI 3</b>

<b>BÀI 5</b>

c) Biên dịch chương trình và quan sát LCD để kiểm tra chương trình.

a) Kết nối các tín hiệu MOSI, SCK của port SPI từ AVR đến tín hiệu SDI và CLK của khối thanh ghi dịch. Kết nối 2 chân port khác vào tín hiệu nCLR và LATCH. Kết nối ngõ ra của thanh ghi dịch vào Bar LED

b) Kết nối các tín hiệu UART như ở bài 1.

c) Viết chương trình nhận 1 giá trị từ UART và xuất ra Bar Led sử dụng SPI.

a) Kết nối các tín hiệu MOSI, MISO, SCK của port SPI từ AVR các tín hiệu tương ứng trên header J80. Kết nối 1 chân port khác vào tín hiệu nCS.

b) Kết nối các tín hiệu UART như ở bài 1. c) Kết nối 1 port vào Bar LED.

d) Viết chương trình đếm số ký tự nhận được từ UART và xuất ra Bar Led, cứ mỗi lần có 1 byte nhận được, số đếm tăng lên 1 và được ghi vào EEPROM. Khi vi xử lý mất điện và có lại, số đếm được đọc ra từ EEPROM và lấy làm giá trị bắt đầu.

a) Kết nối các tín hiệu UART như ở bài 1. b) Kết nối 1 port vào Bar LED.

c) Viết chương trình đếm số ký tự nhận được từ UART và xuất ra Bar Led, cứ mỗi lần có 1byte nhận được, số đếm tăng lên 1 và được ghi vào EEPROM nội của AVR. Khi vi xử lýmất điện và có lại, số đếm được đọc ra từ EEPROM nội và lấy làm giá trị bắt đầu.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<i><b>1. Trả lời các câu hỏi</b></i>

<i><b>a. Với tần số là 8Mhz, baudrate thực tế sẽ sai lệch với mong muốn là 9600 như thế nào?</b></i>

<i><b>b. Cờ UDRE dùng để làm gì?</b></i>

<b>+ Cờ UDRE (USART Data Register Empty) được sử dụng để cho biết liệu bộ đệm truyền (UDR)</b>

có sẵn để nhận dữ liệu mới hay không. Nếu UDRE là 1, bộ đệm trống và sẵn sàng để ghi. Cờ UDRE có thể tạo ra ngắt Data Register Empty. UDRE được đặt sau khi thiết bị khởi động lại để cho biết rằng bộ phát đã sẵn sàng.

<i><b>c. Sự khác nhau giữa hardware UART và software UART (bit-banging UART)</b></i>

<b>+ UART phần cứng và UART phần mềm (UART bit-banging) là hai cách thực hiện giao tiếp nối</b>

tiếp không đồng bộ trên các thiết bị nhúng.

<b>+ Phần cứng UART là một mạch tích hợp trong vi điều khiển có các thanh ghi và bộ đệm để gửi</b>

và nhận dữ liệu nối tiếp. Phần cứng UART có thể hoạt động với nhiều loại giao thức nối tiếp khác nhau và có thể đạt được tốc độ truyền cao. Phần cứng UART không ảnh hưởng đến tài nguyên mã và không bị ảnh hưởng bởi các ngắt.

<b>+ Software UART là thư viện phần mềm dùng để điều khiển các chân I/O để tạo xung truyền và</b>

nhận dữ liệu nối tiếp. UART phần mềm có thể linh hoạt hơn UART phần cứng vì có thể sử dụng bất kỳ chân nào trên vi điều khiển. Tuy nhiên, phần mềm UART cũng có những hạn chế như: chiếm tài nguyên code, không thể hoạt động với tốc độ baud quá cao, phải tắt các ngắt để tránh lỗi thời gian…

<i><b>d. Chân TxD0 và chân RxD0 của UART0 là chân port nào?</b></i>

<b>BÀI 1</b>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

;ENABLE TRANSMITTER AND RECEIVER LDI R16, (1 << RXEN0) | (1 << TXEN0)

;WAIT FOR THE TRANSMITTER TO BE READY USART_SEND_CHAR_WAIT:

<b>+ Là chân của PortD</b>

<i><b>e. Atmega324 có bao nhiêu phần cứng UART?</b></i>

<b>+ Atmega324 có hai UART phần cứng, được gọi là USART0 và USART1. Mỗi UART có các </b>

chân Tx và Rx riêng biệt để gửi và nhận dữ liệu nối tiếp.

<i><b>2. Mã nguồn chương trình với chú thích</b></i>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>BÀI 2</b>

<i><b>1. Trả lời các câu hỏi</b></i>

<i><b>a. Các chân SCL, SDA là chân nào của AVR</b></i>

<b>+ Chân SCL là chân PD0+ Chân SDA là chân PD1</b>

<i><b>b. Vẽ hình mơ tả kết nối trong bài thí nghiệm</b></i>

SDA của vi xử lý nối với SDA của RTC SCL của vi xử lý nối với SCL của RTC

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<i><b>2.</b></i><b>Lưu đồ giải thuật: Viết chương trình con khởi động RTC với thời gian hiện hành, cấu hình xung MFP tần số 1Hz. Sau đó cứ mỗi cạnh lên của MFP, đọc các giá trị ngày tháng năm giờ phút giây của RTC và cập nhật lên LCD</b>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<i><b>3.</b></i>

Mã nguồn và chú thích

.DEF NUM_MIN=R22 ;bi?n ??t giá tr? MIN

.EQU CTL_BYTE=0B11011110 ;byte ?i?u khi?n truy xu?t

CBI CONT_DR,SW1 ;chân SW1 input

SBI CONT,SW1 ;?i?n tr? kéo lên chân SW1 CBI CONT_DR,SW2 ;chân SW2 input

SBI CONT,SW2 ;?i?n tr? kéo lên chân SW2

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

LDI R18,$28 ;Function set 2 dòng font 5x8,mode 4 bit

LDI R20,$0C ;display on,con tr? off

LDI R21,$06 ;Entry mode set d?ch ph?i con tr?,DDRAM t?ng 1 ?/c

LDI R17,$80 ;con tr? b?t ??u ? ??u dòng 1 RCALL CURS_POS ;xu?t l?nh ra LCD

LDI ZH,HIGH(MSG1<<1);Z tr? ??a ch? ??u b?ng MSG1 trong Flash ROM LDI ZL,LOW(MSG1<<1)

RCALL MSG_DISP ;ghi MSG1 ra LCD

LDI R17,$C0 ;con tr? b?t ??u ? ??u dòng 2 RCALL CURS_POS ;xu?t l?nh ra LCD

LDI ZH,HIGH(MSG2<<1);Z tr? ??u b?ng tra MSG2

RCALL TWI_START ;phát xung START LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR RCALL TWI_WRITE ;ghi RTC+W

LDI R17,0X07 ;??a ch? thanh ghi Control

RCALL TWI_START ;phát xung START LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR RCALL TWI_WRITE ;ghi RTC+W

LDI R17,0X00 ;??a ch? thanh ghi 0x00 RCALL TWI_WRITE

RCALL TWI_START ;phát xung START LDI R17,(CTL_BYTE|0X01);truy xu?t ??c RTC_TCCR

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

RCALL TWI_WRITE ;ghi RTC+R

LDI R17,$84 ;con tr? b?t ??u ? dịng 1 v? trí th? RCALL CURS_POS ;xu?t l?nh ra LCD

LDI R17,$86 ;con tr? b?t ??u ? dịng 1 v? trí gi? RCALL CURS_POS ;xu?t l?nh ra LCD

CBR R17,(1<<STO) ;xóa bit ST

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

LDI XL,LOW(RTC_BUF+4)

LDI R17,$C6 ;con tr? b?t ??u ? dịng 2 v? trí ngày RCALL CURS_POS ;xu?t l?nh ra LCD

LDI XH,HIGH(RTC_BUF+3);X tr? buffer RTC th? LDI XL,LOW(RTC_BUF+3)

LDI POS_CRS,$84 ;??t con tr? v? trí th? RCALL SET_NUM ;??t và hi?n th? th?

LDI XH,HIGH(RTC_BUF+2);X tr? buffer RTC gi?

LDI XH,HIGH(RTC_BUF+1);X tr? buffer RTC phút LDI XL,LOW(RTC_BUF+1)

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

LDI XH,HIGH(RTC_BUF);X tr? buffer RTC giây LDI

LDI XH,HIGH(RTC_BUF+4);X tr? buffer RTC ngày

LDI XH,HIGH(RTC_BUF+5);X tr? buffer RTC tháng

LDI XH,HIGH(RTC_BUF+6);X tr? buffer RTC n?m

LDI XH,HIGH(RTC_BUF);X tr? buffer RTC LDI XL,LOW(RTC_BUF)

RCALL TWI_START ;phát xung START LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC RCALL TWI_WRITE ;ghi RTC+W

LDI R17,0X00 ;??a ch? thanh ghi giây RCALL TWI_WRITE ;ghi ??a ch? TCCR

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

ANDI R17,(1<<SW1)|(1<<SW2);che bit SW1,SW2 CPI R17,(1<<SW1)|(1<<SW2);ki?m tra SW nh?n?

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

CBR R17,(1<<STO) ;?úng,xóa bit ST

MOV R17,NUM_MIN ;l?n h?n,tr? v? gi?i h?n MIN

RCALL NUM_DISP ;hi?n th? s? BCD ??t

RCALL DELAY_US

RCALL OUT_LCD ;hi?n th? giá tr?

;MSG_DISP hi?n th? chu?i ký t? k?t thúc b?ng mã NULL ??t trong Flash ROM ;Input: Z ch?a ??a ch? ??u chu?i ký t?

;Output: hi?n th? chu?i ký t? ra LCD t?i v? trí con tr? hi?n hành ;S? d?ng R16,R17,ctc DELAY_US,OUT_LCD

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

;

LPM R17,Z+ ;l?y mã ASCII ký t? t? Flash ROM CPI R17,NULL ;ki?m tra ký t? k?t thúc

RCALL DELAY_US

SBI LCD,RS ;RS=1 ghi data hi?n th? LCD RCALL OUT_LCD ;ghi mã ASCII ký t? ra LCD RJMP MSG_DISP ;ti?p t?c hi?n th? ký t?

;INIT_LCD4 kh?i ??ng LCD ghi 4 byte mã l?nh theo giao ti?p 4 bit ;Function set:R18=$28 2 dòng font 5x8 giao ti?p 4 bit

;Clear display:R19=$01 xóa màn hình

;Display on/off LCDrol:R20=$0C màn hình on,con tr? off

;Entry mode set:R21=$06 d?ch ph?i con tr? ,?/c DDRAM t?ng 1 khi ghi data ;RS=bit0=0,RW=bit1=0

;

RCALL OUT_LCD ;ghi 1 byte data ra LCD

;OUT_LCD4 ghi mã l?nh/data ra LCD ;Input: R17 ch?a mã l?nh/data 4 bit cao

;OUT_LCD ghi 1 byte mã l?nh/data ra LCD ;chia làm 2 l?n ghi 4bit

;Input: R17 ch?a mã l?nh/data,R16

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

;bit RS=0/1:l?nh/data,bit RW=0:ghi

ANDI R17,$F0 ;l?y 4 bit th?p chuy?n thành cao

RCALL OUT_LCD4 ;ghi ra LCD RET

;DELAY_US t?o th?i gian tr? =R16x100?s(Fosc=8Mhz) ;Input:R16 h? s? nhân th?i gian tr? 1 ??n 255

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>BÀI 3</b>

 Thực hiện trên kit thí nghiệm:

<i><b>1. Trả lời các câu hỏi</b></i>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<b>+ Tần số cao nhất của xung nhịp đầu vào cho 74595 là 25 MHz ở 4.5V . Đây là tần suất hoạt</b>

động tối đa được khuyến nghị cho thiết bị.

<i><b>b. Với clock là 8Mhz thì SPI của Atmega328 có tốc độ cao nhất là baonhiêu?</b></i>

<b>+ Tốc độ cao nhất của SPI bạn có thể nhận được từ Atmega328P là một nửa của tốc độ CPU. Vì</b>

vậy, với một Arduino chạy ở 16MHz, tốc độ SPI cao nhất là 8MHz. Với một clock là 8MHz, tốc độ SPI cao nhất là 4MHz.

<i><b>2. Mã nguồn và chú thích</b></i>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

;ENABLE TRANSMITTER AND RECEIVER LDI R16, (1 << RXEN0) | (1 << TXEN0)

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<i><b>1. Trả lời các câu hỏi</b></i>

<i><b>a. Dung lượng của EEPROM 25AA1024 là bao nhiêu?</b></i>

<b>+ EEPROM 25AA1024 là bộ nhớ EEPROM nối tiếp 1024 Kbit với các chức năng EEPROM nối</b>

tiếp cấp byte và cấp độ trang. Nó được tổ chức dưới dạng một khối 128K x 8-bit. Do đó, dung lượng của EEPROM 25AA1024 là 128 KB.

<i><b>b. Theo datasheet, tần số nhanh nhất của xung CK đưa vào EEPROM này là bao nhiêu?</b></i>

<b>+ Tần số nhanh nhất của xung CK được đưa vào EEPROM này là 20 MHz. Đây là tốc độ xung </b>

nhịp tối đa của thiết bị.

<i><b>2. Mã nguồn và chú thích</b></i>

<b>BÀI 4</b>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

;ENABLE TRANSMITTER AND RECEIVER LDI R16, (1 << RXEN0) | (1 << TXEN0)

;SEND ADDRESS TO EEPROM LDI TX_SPI_BUF, SPI_RD CBI

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

LDI TX_SPI_BUF, LOW(MEM_BYTE21)

RCALL SPI_MASTER_TRANSMIT ; LAY DIA CHI TRONG EEPROM ;READ DATA FROM EEPROM

LDI TX_SPI_BUF, $FF RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SS RET

;ENABLE WIRTE DATA LDI TX_SPI_BUF, WREN CBI SPI_PORT, SPI_SS

RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SS LDI TX_SPI_BUF, SPI_WR CBI SPI_PORT, SPI_SS RCALL SPI_MASTER_TRANSMIT

;SEND ADDRESS TO EEPROM LDI TX_SPI_BUF, MEM_BYTE3 ;WRITE DATA TO EEPROM MOV TX_SPI_BUF, COUNT

;ENABLE WIRTE DATA LDI TX_SPI_BUF, WREN CBI SPI_PORT, SPI_SS

RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SS

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<b>BÀI 5</b>

<i><b>1. Trả lời các câu hỏi</b></i>

<i><b>a. Atmega324PA có dung lượng EEPROM là bao nhiêu?</b></i>

<b>+ Atmega324PA có dung lượng EEPROM là 1KB.</b>

<i><b>b. Liệt kê sự khác nhau giữa SRAM và EEPROM</b></i>

<b>+ SRAM có bộ nhớ là 2KB</b>

<b>+ EEPROM có thể lưu giữ lại giá trị trong bộ nhớ khi ngắt nguồn còn SRAM thì khơng.+ SRAM nhanh hơn EEPROM, nhưng cũng đắt hơn và tiêu thụ nhiều điện năng hơn.</b>

LDI TX_SPI_BUF, PE CBI SPI_PORT, SPI_SS

RCALL SPI_MASTER_TRANSMIT ;SEND ADDRESS TO EEPROM LDI TX_SPI_BUF, MEM_BYTE3 ;WRITE DATA TO EEPROM MOV TX_SPI_BUF, COUNT

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<b>+ SRAM được sử dụng để lưu trữ dữ liệu tạm thời trong khi thực hiện chương trình, chẳng hạn</b>

như thanh ghi, ngăn xếp, …. EEPROM được sử dụng để lưu trữ dữ liệu liên tục có thể được sửa đổi trong thời gian chạy, chẳng hạn như cài đặt, giá trị hiệu chuẩn, …

<i><b>c. Liệt kê sự khác nhau giữa Flash và EEPROM</b></i>

<b>+ Bộ nhớ Flash có bộ nhớ 32KB</b>

<b>+ Bộ nhớ Flash có thể chịu được 10.000 chu kỳ ghi/xóa cịn EEPROM có thể chịu ít nhất 100.000</b>

chu kỳ ghi/xóa

<b>+ Flash là một loại EEPROM, nhưng EEPROM không phải là một loại Flash. Flash là một công</b>

nghệ mới hơn được phát triển từ EEPROM.

<b>+ Flash sử dụng bộ nhớ loại NAND, trong khi EEPROM sử dụng bộ nhớ loại NOR. Bộ nhớ loại</b>

NAND chậm hơn nhưng dày đặc hơn và rẻ hơn bộ nhớ loại NOR.

<b>+ Flash bị xóa theo khối và EEPROM bị xóa theo byte. Điều này có nghĩa là Flash có thể xóa</b>

một lượng lớn dữ liệu cùng một lúc, nhưng EEPROM có thể xóa các phần dữ liệu nhỏ hơn

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

;8 BIT, NO-PARITY, 1 STOP BIT

LDI R16, (1 << UCSZ01)|(1 << UCSZ00)

SBI EECR, EEMPE SBI EECR, EEPE RCALL DELAY_5MS RET

</div>

×