Trong phần này sẽ mô tả những vùng nhớ khác nhau trong ATmega8515.Cấu trúc của AVR gồm 2 vùng nhớ chính, bộ nhớ dữ liệu và bộ nhớ chƣơng trình.Thêm vào đó,bộ nhớ EEPROM đặc trƣng của Atmega8515 là lƣu giữ dữ liệu.Ba vùng nhớ trên thì tuyến tính và bình thƣờng.
a. Bộ nhớ chương trình được lập trình bằng đi
AT mega 8515 có bộ nhớ chƣơng trình chứa 8Kbyte trên chip.Vùng nhớ chƣơng trình đƣợc chia làm 2 vùng:vùng chƣơng trình khởi động và vùng chƣơng trình ứng dụng. Họat động của bộ chƣơng trình khởi động đƣợc miêu tả trong phần sau.
Hình 3.3. Sơ đồ bộ nhớ chƣơng trình của ATmega8
b. Bộ nhớ dữ liệu SRAM
Bộ nhớ dữ liệu SRAM có chức năng định địa chỉ cho thanh ghi, bộ nhớ xuất/nhập và dữ liệu bên trong SRAM
Dữ liệu bên ngoài SRAM đƣợc tùy chọn để có thể sử dụng với Atmega 8515 Khi mà địa chỉ truy cập vào vùng nhớ SRAM vƣợt quá vùng nhớ dữ liệu bên trong thì vùng dữ liệu bên ngoài SRAM đƣợc truy xuất sử dụng các lệnh giống nhƣ
Sự hoạt động của SRAM đƣợc kích hoạt bên ngoài bởi bit SRE bên trong thanh ghi MCUCR
Hình 3.4. Sơ đồ bộ nhớ chƣơng trình của ATmega8
c. Bộ nhớ dữ liệu EEPROM
Atmega 8515 gồm 512 byte bộ nhớ dữ liệu EEPROM, nó đƣợc tổ chức độc lập trên các vùng dữ liệu mà tại đó các byte đơn có thể đƣợc đọc và ghi. EEPROM có độ bền khoảng 100000 vòng ghi/xóa
d. Truy xuất việc đọc ghi cho EEPROM
Khi EEPROM đọc, CPU dừng khoảng 4 chu kỳ xung clock trƣớc khi các lệnh kế tiếp đƣợc thực hiện
Khi EEPROM đƣợc ghi, CPU dừng hai chu kỳ xung clock trƣớc khi các lệnh kế tiếp đƣợc thực hiện
3.2.3. Vào ra dữ liệu cho các thiết bị ngoại vi
Một vi điều khiển thì nhƣ ta đã biết nó bao gồm CPU là bộ não trung tâm của nó.Nhƣng nó không thể đứng độc lập đƣợc và để xử lý đƣợc dữ liệu thì tất nhiên nó phải lấy dữ liệu từ một nguồn dữ liệu nào đó. Các thiết bị ngoại vi trên nó và các port chính là các thiết bị trung gian đƣa dữ liệu vào cho CPU và chuyển dữ liệu đã xử lý ra các cơ cấu chấp hành và lên mạng thông tin…Quá trình vào ra dữ liệu là quá trình điều khiển các port các thiết bị ngoại vi sao cho CPU có thể nhập hay xuất dữ liệu một cách đồng bộ.
Có 3 phƣơng pháp vào ra dữ liệu đó là: vào ra dữ liệu bằng chƣơng trình vào ra dữ liệu bằng ngắt và vào ra dẽ liệu bằng DMA. Ở đây vi điều khiển AVR chỉ có hai phƣơng pháp đầu.
3.1.3.1. Vào ra dữ liệu bằng chƣơng trình
Đây là phƣơng pháp mà CPU hỏi thiết bị ngoại vi về khả năng sẵn sàng trao đổi dữ liệu. Phƣơng pháp này có hai chế độ đó là chế độ ƣu tiên và chế độ bình đẳng.
Chế độ ƣu tiên: thiết bị đƣợc quyền ƣu tiên sẽ trao đổi dữ liệu xong mới tới thiết bị có mức ƣu tiên thấp hơn.
Chế độ bình đẳng: từng thiết bị một sẽ đƣợc hỏi nếu nhƣ không có nhu cầu trao đổi dữ liệu thì CPU sẽ hỏi thiết bị khác.
Ƣu điểm của phƣơng pháp này là: CPU chủ động và phân đƣợc quyền ƣu tiên. Nhƣng nhƣợc điểm của phƣơng pháp này là: Không đáp ứng đƣợc các sự kiện tức thời xảy ra (Ví nhƣ có một thiết bị có yêu cầu trao đổi dữ liệu khẩn cấp mà vẫn chƣa tới lƣợt đƣợc hỏi) và trong thời gian hỏi trạng thái của các thiết bị thì CPU không thể làm việc khác.
Trên VĐK có 32 đƣờng vào ra gồm nhiều chức năng có thể sử dụng làm cổng vào ra số, cho các thiết bị ngoại vi tƣơng tự. Sau đây ta sẽ tìm hiểu từng thiết bị ngoại vi và các cổng vào ra
3.2.3.3. Cổng vào ra
Vi điều khiển AT90S8535 có 32 đƣờng vào ra chia làm bốn nhóm mỗi nhóm 8bit. Các đƣờng vào ra này có rất nhiều tính năng và có thể lập trình đƣợc.Ở đây chúng ta sẽ xét chúng là các cổng vào ra số. Nếu xét trên mặt này thì các cổng vào ra này là cổng vào ra hai chiều có thể định hƣớng theo từng bit. Và chứa cả điện trở pull-up (có thể lập trình đƣợc).Mặc dù mỗi port có các đặc điểm riêng nhƣng khi xét chúng là các cổng vào ra số thì dƣờng nhƣ điều khiển vào ra dữ liệu thì hoàn toàn nhƣ nhau. Chúng ta có thanh ghi và một địa chỉ cổng đối với mỗi cổng, đó là: thanh ghi dữ liệu cổng (PORTA, PORTB, PORTC), thanh ghi dữ liệu điều khiển cổng (DDRA, DDRB, DDRC)và cuối cùng là địa chỉ chân vào của cổng (PINA, PINB, PINC).
a.Thanh ghi DDRA
Đây là thanh ghi 8 bit (ta có thể đọc và ghi các bit ở thanh ghi này) và có tác dụng điều khiển hƣớng cổng PA (tức là cổng ra hay cổng vào). Nếu nhƣ một bit trong thanh ghi này đƣợc set thì bit tƣơng ứng đó trên PA đƣợc định nghĩa nhƣ một cổng ra. Ngƣợc lại nếu nhƣ bit đó không đƣợc set thì bit tƣơng ứng trên PA đƣợc định nghĩa là cổng vào.
b. Thanh ghi PORTA
Đây cũng là thanh ghi 8 bit (các bit có thể đọc và ghi đƣợc) nó là thanh ghi dữ liệu của cổng PA và trong trƣờng hợp nếu cổng đƣợc định nghĩa là cổng ra thì khi ta ghi một bit lên thanh ghi này thì chân tƣơng ứng trên port đó cũng có cùng mức logic. Trong trƣờng hợp mà cổng đƣợc định nghĩa là cổng vào thì thanh ghi này lại mang dữ liệu điều khiển cổng. Cụ thể nếu bit nào đó của thanh ghi này đƣợc set (đƣa lên mức 1) thì điện trở kéo lên (pull-up) của chân tƣơng ứng của port đó sẽ đƣợc kích hoạt. Ngƣợc lại nó sẽ ở trạng thái hi-Z.Thanh ghi này sau khi khởi động VĐK sẽ có giá trị là 0x00.
c. Thanh ghi PINA
Đây là địa chỉ cho phép truy nhập trức tiếp ra các chân vật lý của vi điều khiển.Tất nhiên vì thế mà với địa chỉ này ta chỉ có thể đọc mà thôi (Không thể ghi đƣợc!!!), ta có bảng tóm tắt sau:
Bảng 3.1. Định nghĩa các chân vào ra
DDAn PORTAn I/O Pull-up Chú thích
0 0 Cổng vào Không Cao trở 0 1 Cổng vào Có
1 0 Cổng ra Không Đầu ra đẩy kéo 1 1 Cổng ra Không Đầu ra đẩy kéo
Trong đó DDAn là bit thứ n trong thanh ghi DDA
Bảng 3.2. Bảng các thanh ghi và địa chỉ của chúng cho từng PORT
PORT Tên Địa chỉ thanh ghi/Địa chỉ trong SRAM
A PORTA 0x1B/0x3B A DDRA 0x1A/0x3A A PINA 0x19/0x39 B PORTB 0x18/0x38 B DDRB 0x17/0x37 B PINB 0x16/0x36 C PORTC 0x15/0x35 C DDRC 0x14/0x34 C PINC 0x13/0x33 D PORTD 0x12/0x32 D DDRD 0x11/0x31 D PIND 0x10/0x30
* Tóm lại để đọc dữ liệu từ ngoài thì ta phải thực hiện các bƣớc sau:
- Đƣa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORT (hoặc bit trong port) đó là đầu vào (xóa thanh ghi ddr hoặc bit).
- Sau đó kích hoạt điện trở pull-up bằng cách set thanh ghi PORT (bit). - Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit).
3.2.4. Ngắt
Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình trạng sẵn xàng cho đổi dữ liệu của mình.Ví dụ:Khi bộ truyền nhận UART nhận đƣợc một byte nó sẽ báo cho CPU biết thông qua cờ RXChoặc khi nó đã truyền đƣợc một byte thì cờ TX đƣợc thiết lập…
Phục vụ ngắt
Nếu nhƣ ngắt đó đƣợc cho phép thực hiện thì:
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và lƣu vị trí đang thực hiên chƣơng trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới vector phuc vụ ngắt và thức hiện chƣơng trình phục vụ ngắt đó cho tới khi gặp lệnh RETI (return from interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục thực hiện chƣơng trình mà trƣớc khi có ngắt nó đang thực hiện. Trong trƣờng hợp mà có nhiều ngắt yêu cầu cùng một lúc thì CPU sẽ lƣu các cờ báo ngắt đó lại và thực hiện lần lƣợt các ngắt theo mức ƣu tiên.Trong khi đang thực hiện ngắt mà xuất hiện ngắt mới thì sẽ xảy ra hai trƣờng hợp.Trƣờng hợp này, ngắt có mức ƣu tiên cao hơn thì nó sẽ đƣợc phục vụ.Còn nó mà có mức ƣu tiên thấp hơn thì nó sẽ bị bỏ qua.
Trong tài liệu của hãng sản xuất không thấy nói tới bộ nhớ ngăn xếp, nó là vùng bất kì trong SRAM từ địa chỉ 0x60 trở lên. Để truy nhập vào SRAM thông thƣờng thì ta dùng con trỏ X,Y,Z và để truy nhập vào SRAM theo kiểu ngăn xếp thì ta dùng con trỏ SP.Con trỏ này là một thanh ghi 16 bit và đƣợc truy nhập nhƣ hai thanh ghi 8 bit chung có địa chỉ: SPL:0x3D/0x5D(IO/SRAM) và SPH:0x3E/0x5E.
Khi chƣơng trình phục vu ngắt hoặc chƣơng trình con thì con trỏ PC đƣợc lƣu vào ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí.Và con trỏ ngăn xếp sẽ giảm 1 khi thực hiện lệnh push. Ngƣợc lại khi thực hiện lệnh POP thì con trỏ ngăn
xếp sẽ tăng 1 và khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2. Nhƣ vậy con trỏ ngăn xếp cần đƣợc chƣơng trình đặt trƣớc giá trị khởi tạo ngăn xếp trƣớc khi một chƣơng trình con đƣợc gọi hoặc các ngắt đƣợc cho phép phục vụ và giá trị ngăn xếp ít nhất cũng phải lơn hơn 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi.
Để thay đổi giá trị của SP ta có hai cách:
- Sử dụng địa chỉ trực tiếp trên các thanh ghi I/O. - Sử dụng địa chỉ gián tiếp của chúng qua SRAM.