IV. NGÀY HỒN THÀNH NHI ỆM VỤ:
2.3.4 Các thanh ghi trong AVR
Tất cả các vi điều khiển họ AVR đều cĩ 32 thanh ghi đa năng. Một số trong các thanh ghi này cịn cĩ các chức năng riêng, bổ xung. Các thanh ghi được đặt tên từ R0 đến R31. Tệp thanh ghi được tách thành 2 phần, mỗi phần cĩ 16 thanh ghi, đánh từ R0 đến R15 và từ R16 đến R31. Tất cả các lệnh thao tác trên thanh ghi đều cĩ thể truy nhập trực tiếp và truy nhập trong chương trình đơnđến tất cả các thanh ghi. Nhưng cĩ một ngoại lệ là các lệnh SBCI, SUBI, CPI, ANDI, ORI cũng nhưlệnh WI các lệnh này chỉ tácđộng đến các thanh ghi R16 đến R31. 32 thanh ghi đa mục đích 64 thanh ghi Input/Output SRAM ngồi (512 x 8) EEPRROM (512 x 8)
Bộ nhớ chương trình Bộ nhớ dữ liệu Bộ nhớ dữ liệu
Bộ nhớ Flash (4K x 16) $000 $FFF $0000 $001F $0020 $005F $0060 $025F $000 $1FF
2.3.5. Tệp thanh ghi của vi điều khiển AVR
Các thanh ghi R0 và R26 đến R31 cĩ các chức năng bổ xung. Thanh ghi R0 được sử dụng trong các lệnh nạp bộ nhớ chương trình LPM (load program memory), trong khi các thanh ghi R26đến R31 được sử dụng làm các thanh ghi con trỏ. Các thanh ghi con trỏ nàyđược sử dụng trong nhiều lệnh gián tiếp dùng cho thanh ghi (register indirect instruction).
Chúng cịn cĩ các tên X, Y và Zđược cho bởi hình sau :
2.3.6. Bộ nhớ dữ liệu SRAM
Tổ chức bộ nhớ SRAM được miêu tả tổng quát nhưhình bên dưới :
Hình 2.5 Sơđồ tổ chức thanh ghi của vi điều khiển AT90S8515
608địa chỉ bộ nhớ dữ liệu bao gồm tệp thanh ghi, bộ nhớ I/O và SRAM nội. 96 địa chỉ
đầu tiên là tệp thanh ghi đa dụng và bộ nhớ I/O, 512 địa chỉ tiếp theo là SRAM nội.
2.3.7. Bộ nhớ I/O (Các port)
Bảng 2.2 Vùng I/O trong AT90S8515.
Địa chỉ I/O Tên thanhghi I/O Chức năng $3F ($5F) SREG Status REGister
$3E ($5E) SPH Stack Pointer High $3D ($5D) SPL Stack Pointer Low
$3B ($5B) GIMSK General Interrupt MaSK register $3A ($5A) GIFR General Interrupt Flag Register $39 ($59) TIMSK Timer/Counter Interrupt MaSK $38 ($58) TIFR Timer/Counter Interrupt Flag register $35 ($55) MCUCR MCU general Control Register
$34 ($45) MCUSR MCU general Status Register $33 ($53) TCCR0 Timer/Counter0 Control Register $32 ($52) TCNT0 Timer/Counter0 (8-bit)
$2F ($4F) TCCR1A Timer/Counter1 Control Register $2E ($4E) TCCR1B Timer/Counter1 Control Register $2D ($4D) TCNT1H Timer/Counter1 High Byte $2C ($4C) TCNT1L Timer/Counter1 Low Byte
$2B ($4B) OCR1AH Timer/Counter1 Output Compare $2A ($4A) OCR1AL Timer/Counter1 Output Compare $29 ($49) OCR1BH Timer/Counter1 Output Compare $28 ($48) OCR1BL Timer/Counter1 Output Compare $25 ($45) ICR1H T/C 1 Input Capture Register $24 ($44) ICR1L T/C 1 Input Capture Register $21 ($41) WDTCR Watchdog Timer Control Register $1F ($3E) EEARH EEPROM Address Register High $1E ($3E) EEARL EEPROM Address Register Low $1D ($3D) EEDR EEPROM Data Register
$1C ($3C) EECR EEPROM Control Register $1B ($3B) PORTA Data Register, Port A
$1A ($3A) DDRA Data Direction Register, Port A $19 ($39) PINA Input Pins, Port A
$18 ($38) PORTB Data Register, Port B
$17 ($37) DDRB Data Direction Register, Port B $16 ($36) PINB Input Pins, Port B
$15 ($35) PORTC Data Register, Port C
$14 ($34) DDRC Data Direction Register, Port C $13 ($33) PINC Input Pins, Port C
$12 ($32) PORTD Data Register, Port D
$11 ($31) DDRD Data Direction Register, Port D $10 ($30) PIND Input Pins, Port D
$0F ($2F) SPDR SPI I/O Data Register $0E ($2E) SPSR SPI Status Register $0D ($2D) SPCR SPI Control Register $0C ($2C) UDR UART I/O Data Register $0B ($2B) USR UART Status Register $0A ($2A) UCR UART Control Register $09 ($29) UBRR UART Baud Rate Register
$08 ($28) ACSR Analog Comparator Control and Status
2.3.8. Thanh ghi trạng thái(Status Register – SREG)
Thanh ghi trạng thái trong AT90S8535 nằm trong vùng I/O cĩđịa chỉ$3F,được mơ tả nhưsau :
Bit 7 – I : Cho phép ngắt toàn cục (Global Interrupt Enable). Bit cho phép ngắt toàn cục phải được thiết lập bằng 1 để các ngắt được cho phép. Khi bit I được thiết lập bằng 1, từng ngắt riêng lẻ lại được điều khiển bởi các thanh ghi chức năng riêng. Khi bit I bị xĩa, tất cả các ngắt riêng lẻ sẽ bị cấm cho dù chúng cĩ được cho phép bởi các thanh ghi chức năng riêng. Bit I bị xĩa bằng phần cứng ngay sau khi cĩ một ngắt được vận hành (vào chương trình ngắt), và nĩ được thiết lập bằng 1trở lại khi gặp lệnh RETI để cho phép những ngắt tiếp theo.
Bit 6 – T : Bit truyền hay cờ truyền (Bit Copy Storage). Lệnh copy bit BLD (Bit LoaD) và BST (Bit Store) sử dụng bit T “nguồn” và “đích” của sự vận hành. Một bit từ một thanh ghi trong tệp thanh ghi cĩ thể được sao chép sang bit T bằng lệnh BST, và nội dung của bit T cĩ thể được sao chép sang một bit trong một thanh ghi của tệp thanh ghi bằng lệnh BLD.
Bit 5 – H : Cờ mang một nửa hay cờ nhớ một nửa(Half – carry Flag). Báo cho biết sự nhớ một nửa trong một vài lệnh số học.
Bit 4 – S : Bit dấu hay Cờ dấu(Sign Bit), S = N V.Bit dấu là kết quả của phép EX-OR giữa cờ phủ định N và cờ tràn bù hai V.
Bit 3 – V : Cờ tràn phép lấy bù 2 (Two’s Complement Overflow Flag). Cờ V hỗ trợ cho các phép tốn lấy bù 2.
Bit 2 – N : Cờ phủ định (Negative Flag) báo kết quả phủ định(âm) từ một sự vận hành logic hoặc số học.
Bit 1 – Z : Cờ Khơng hay cờ Zer (Zero Flag) Báo kết quả là zero từ một sự vận hành logic hoặc số học.
Bit 0 – C : Cờ nhớ (Carry Flag) Báo hiệu cĩ nhớ trong phép logic hoặc số học.
Chú ý : Thanh ghi trạng thái SREG sẽ khơng được lưu trữ tự động khi vào chương trình ngắt, cũng nhưkhơngđược trả lại ( hay “ phục hồi “) khi thốt khỏi chương trình ngắt. Cho nên người dùng phải xử lý điều này bằng phần mềm để đảm bảo chương trình chạy đúng.
2.3.9. Con trỏ ngăn xếp– SP (Stack Pointer)
Con trỏ ngăn xếp AVR 16-bitđược xây dựng gồm 2 thanh ghi 8-bit trong vùng khơng gian $3E($5E) và $3D($5D). AT90S8515 hỗ trợ đến 64Kb cho SRAM ngồi cho việc sử dụng hết 16 bits.
2.3.10. Sử dụng ngắt trong AT90S8515
AT90S8515 cung cấp 16 nguồn ngắt khác nhau. Mỗi ngắt cĩ một vectơchương trình riêng trong khơng gian bộ nhớ chương trình. Các ngắt được cho phép bởi từng bit cho phép ngắt riêng lẻ và được quản lý bit bit cho phép ngắt toàn cục. Để cho phép một ngắt nàođĩ thì bit cho phép ngắt riêng của nĩ phải được thiết lậplên 1 vàđồng thời bit cho phép ngắt toàn cục( bit I trong thanh ghi trạng thái) phải được thiết lập lên 1. Khi bit cho phép ngắt toàn cục I bị xĩa thì tất cả các ngắt sẽ bị cấm.
Những địa chỉ thấp nhất trong khơng gian bộ nhớ chương trình được định nghĩa (một cách tự động) nhưlà những vectơngắt và Reset. Bảng bên dưới sẽ liệt kêđịa chỉ của các vectơngắt và Reset. Ta cũng cĩ thể dựa vào bảng nàyđể xác định mức độ ưu tiên của các ngắt khác nhau. Địa chỉ thấp hơn thì mức độ ưu tiên sẽ cao hơn. Chẳng hạn theo bảng ta thấy, RESET cĩ mức ưu tiên cao nhất, kế đến là INT0, …
Bảng 2.3 Bảng địa chỉ các ngắt của vi điều khiển
Số tt Địa chỉ chương trình Nguồn Định nghĩa ngắt
1 $000 RESET Do Reset phần cứng, do nguồn, Watchdog
2 $001 INT0 Yêu cầu ngắt bên ngồi trên chân INT0 3 $002 INT1 Yêu cầu ngắt bên ngồi trên chân INT1 4 $003 TIMER1 CAPT Sự kiện bắt sống ở Timer/counter1 5 $004 TIMER1 COMPA So sánh Aở Timer/counter1 6 $005 TIMER1 COMPB So sánh Bở Timer/counter1 7 $006 TIMER1 OVF Tràn Timer/counter1
8 $007 TIMER0 OVF Tràn Timer/counter0
9 $008 SPI, STC Hồn thành truyền nối tiếp SPI 10 $009 UART, RX Nhận hoàn thành UART 11 $00A UART. UDRE Thanh ghi dữ liệu UART rỗng 12 $00B UART, TX Phát hồn thành UART
2.3.11. Reset
Các nguồn Reset
Viđiều khiển AT90S8515 cĩ ba nguồn Reset là:
Reset do nguồn (Power-on Reset) : MCU sẽ được Reset khi nguồn cung cấp thấp hơn ngưỡng Reset VPOT.
Reset bên ngồi (External Reset) : MCU sẽ bịReset khi cĩ mức “thấp” trên chân Reset trong khoảng thời gian lớn hơn 50ns.
Reset do Watchdog (Watchdog Reset) : MCU sẽ bịReset khi chu kỳ thời gian Watchdog kết thúc và Watchdogđược cho phép.
Trong suốt thời gian Reset, tất cả các thanh ghi I/O sẽ được đặt về giá trị mặc định của nĩ và chương trình bắt đầu thi hành từ địa chỉ $000. Lệnh đặt tại địa chỉ $000 phải là một lệnh nhảy RJMP đến chương trình xử lý Reset. Nếu chương trình khơng bao giờ sử dụng đến các nguồn ngắt, các địa chỉ vectơngắt khơng được sử dụng thì mã chương trình thơng thường cĩ thể được đặt ở các địa chỉ vectơngắt này.
2.3.12. Ngắt
AT90S8515 cĩ hai thanh ghi điều khiển che ngắt 8-bit – GIMSK (General Interrupt Mask register: Thanh ghi che ngắt chung) và TIMSK (Timer/counter Interrupt Mask register : thanh ghi che ngắt Timer/counter).
Khi một ngắt xảy ra (chương trình ngắt đang được thi hành) thì mặc định bit cho phép ngắt toàn cục I bị xĩa về 0 và tất cả các ngắt bị cấm. Tuy nhiên, người sử dụng cĩ thể dùng phần mềm để thiết lập lên 1, bit I để cho phép các ngắt lồng vào. Bit cho phép
ngắt toàn cục I sẽ được thiết lập trở lại bằng 1 khi MCU thốt khỏi chương trình ngắt (gặp lệnh RETI).
Khi bộ đếm chương trình được đặt đến địa chỉ vectơngắt thực sự để thi hành chương trình xử lý ngắt, phần cứng sẽ xĩa cờ tương ứng phát sinh ngắt này. Một vài cờ ngắt cũng cĩ thể được xĩa bằng cách viết mức logic “1” đến vị trí bit tương ứng của cờ. Nếu điều kiện ngắt xảy ra khi bit cho phép ngắt tương ứng bị xĩa bằng 0, thì cờ ngắt này sẽ được thiết lập lên 1 và nhớ cho đến khi ngắt này được cho phép hoặc là cờ bị xĩa bởi phần mềm.
Nếu một hoặc nhiềungắt xảy ra khi bit cho phép ngắt toàn cục bị xĩa, thì các cờ ngắt tươngứng sẽ được thiết lập lên 1 và nhớ cho đến khi bit cho phép ngắt toàn cục I được thiết lập lên 1 và các ngắt sẽ thi hành theo mức ưu tiên.
Chú ý : Thanh ghi trạng thái SREG sẽ khơng được lưu trữ tự động khi vào chương trình ngắt, cũng nhưkhơngđược trả lại ( hay “ phục hồi “) khi thốt khỏi chương trình ngắt. Cho nên người dùng phải xử lý điều này bằng phần mềm để đảm bảo chương trình chạy đúng.
2.3.13. Thanh ghi che ngắt chung – GIMSK (General Interrupt Mask Register)
Bit 7 – INT1 (External Interrupt Request 1 Enable) Cho phép ngắt ngoài trên chân INT1. Khi bit INT1được thiết lập lên 1 và I = 1 thì ngắt ngoài trên chân INT1được cho phép.Để quy định ngắt ngoài INT1 được kích hoạt bởi cạnh lên hay cạnh xuống hay kích hoạt mức ta sử dụng hai bit ISC10 và ISC11 trong thanh ghi MCUCR. Ngắt trên chân INT1 cĩ thể kích hoạt ngay cả khi chân nàyđược cấu hình là ngõ ra (output). Ngắt INT1 sẽ được thi hành tại địa chỉ bộ nhớ chương trình là $002.
Bit 6 – INT0 (External Interrupt Request 0 Enable) Cho phép ngắt ngoài trên chân INT0. Khi bit INT0được thiết lập lên 1 và I = 1 thì ngắt ngoài trên chân INT0 được cho phép.Để quy định ngắt ngoài INT0 được kích hoạt bởi cạnh lên hay cạnh xuống hay kích hoạt mức ta sử dụng hai bit ISC00 và ISC01 trong thanh ghi MCUCR. Ngắt trên chân INT0 cĩ thể kích hoạt ngay cả khi chân nàyđược cấu hình là ngõ ra (output). Ngắt INT0 sẽ được thi hành tại địa chỉ bộ nhớ chương trình là $001.
Bit 5 .. 0 (Reserved Bits) các bit này là bit dự trữ trong AT90S8515 và luơnđược đọc là 0.
2.3.14. Thanh ghi cờ ngắt chung – GIFR (General Interrupt Flag Register)
Bit 7 – INTF1 (External Interrupt Flag1) Cờ ngắt ngoài trên INT1. Khi sự thay đổi của cạnh xung hoặc mức logic trên chân INT1 cĩ động kích (trigger) một ngắt, thì cờ INTF1 sẽ được thiết lậplên 1. Cờ này luơn luơn được xố về 0 khi chân nàyđược cấu hình cho các ngắt ở mức thấp. Trạng thái của một ngắt mức thấp cĩ thể được xác định bằng việc đọc giá trị thanh ghi PIN.
Nếu bit I trong thanh ghi trạng thái SREG bằng 1 và bit INT1 trong thanh ghi GIMSK bằng 1, khi cĩ tác động ngắt thì MCU sẽ nhảy đến địa chỉ ngắt $002. Đối với các ngắt do sự thay đổi mức logic và cạnh, cờ ngắt sẽ được xĩa khi chương trình ngắt được thi hành.Đồng thời, cờ này cũng cĩ thể được xĩa bằng cách viết mức logic “1” lên nĩ. Bit 6 – INTF0 (External Interrupt Flag 0) Cờ ngắt ngoài trên INT0. Khi sự thay đổi của cạnh xung hoặc mức logic trên chân INT0 cĩ tácđộng kích (trigger) một ngắt, thì cờ INTF0 sẽ được thiết lập lên 1. Cờ này luơn luơn được xố về 0 khi chân nàyđược cấu hình cho các ngắt ở mức thấp. Trạng thái của một ngắt mức thấp cĩ thể được xác
định bằng việc đọc giá trị thanh ghi PIN.
Nếu bit I trong thanh ghi trạng thái SREG bằng 1 và bit INT0 trong thanh ghi GIMSK bằng 1, khi cĩ tác động ngắt thì MCU sẽ nhảy đến địa chỉ ngắt $001. Đối với các ngắt do sự thay đổi mức logic và cạnh, cờ ngắt sẽ được xĩa khi chương trình ngắt được thi hành.Đồng thời, cờ này cũng cĩ thể được xĩa bằng cách viết mức logic “1” lên nĩ. Bit 5 .. bit 0 (Reserved bits) các bit này là bit dự trữ trong AT90S8515 và luơn được
đọc là 0.
2.3.15. Thanh ghi che ngắt Timer/counter – TIMSK (Timer/counter Interrupt Mask Register)
Hình 2.12 Cấu trúc thanh ghi cờ ngắt chung - GIFR
2.3.16. Thanh ghi cờ ngắt Timer/counter – TIFR (Timer/counter interrupt FlagRegister) Register)
2.3.17. Thanh ghiđiều khiển MCU – MCUCR (MCU Control Register)
Bit 7 – Reserved bit : Bit này là một bit đặt trong AT90S8535 và luơnđược đọc là 0. Ta khơng quan tâmđến nĩ.
Bit 6 – SE (Sleep Enable) Cho phép ngủ. Bit SE phải được thiết lập (bằng1) để bắt buộc MCU vào chế độ ngủ khi lệnh SLEEP được thi hành.Để tránh trường hợp MCU vào chế độ ngủ mà khơng do mục đích của người lập trình, bit SE chỉ được thiết lập lên 1 trước khi thi hành lệnh ngủ SLEEP.
Bit 5, 4 – SM1/SM0 (Sleep Mode Select Bits 1 and 0) Các bit chọn chế độ ngủ. Việc thiết lập hai bit này cho phép MCU chọn 1 trong 3 chế độ ngủ nhưsau :
Bảng 2.4 Thiết lập chế độ SLEEP cho vi điều khiển.
SM1 SM0 Chế độ ngủ
0 0 Idle : nghỉ 0 1 Khơng sử dụng
1 0 Power – down : nguồn giảm 1 1 Power save : nguồn dự trữ
Bit 3, 2 – ISC11, ISC10 (Interrupt Sense Control 1 Bits 1 and 0) các bit điều khiển nhận ngắt INT1
Ngắt ngoài 1 được kích hoạt trên chân INT1 nếu bit I trong thanh ghi trạng thái được thiết lập lên 1 và bit che ngắt tương ứng (bit cho phép ngắt) trong thanh ghi GIMSK
Hình 2.14 Cấu trúc thanh ghi cờ ngắt Timer/Counter - TIFR
được thiết lập lên 1. Kích hoạt chân INT1 bởi các cạnh hoặc mức thấp là do sự thiết lập hai bit ISC11 và ISC10 quyết định.
Bảng 2.5 Thiết lập ngắt ngoài INT1 cho viđiều khiển.ISC11 ISC10 Miêu tả ISC11 ISC10 Miêu tả
0 0 Mức thấp trên chân INT1 phát một yêu cầu ngắt 0 1 Khơng sử dụng
1 0 Cạnh xuống trên chân INT1 phát một yêu cầu ngắt 1 1 Cạnh lên trên chân INT1 phát một yêu cầu ngắt.
Giá trị trên chân INT1 được lấy mẩu trước khi các cạnh được phát hiện. Nếu ngắt cạnh
được chọn, những xung kéo dài hơn 1 chu kỳ xung đồng hồ CPU sẽ phát sinh một ngắt. Những xung ngắn hơn thì khơng bảo đảm sẽ phát sinh một ngắt. Nếu ngắt mức thấp được chọn, mức thấp phải được giữ cho đến khi MCU hoàn thành lệnh đang làm và phát sinh một ngắt. Nếu được cho phép, một ngắt kích hoạt mức sẽ phát sinh một yêu cầu ngắt nữa miễn là chân nàyđược giữ ở mức thấp.
Bit 1,0 – ISC01, ISC00 (Interrupt sense control 0 bit 1 and bit 0) các bit điều khiển nhậnngắt INT0.
Ngắt ngoài 0 được kích hoạt trên chân INT0 nếu bit I trong thanh ghi trạng thái được thiết lập lên 1 và bit che ngắt tương ứng (bit cho phép ngắt) trong thanh ghi GIMSK
được thiết lập lên 1. Kích hoạt chân INT0 bởi các cạnh hoặc mức thấp là do sự thiết lập hai bit ISC01 và ISC00 quyết định.
Bảng 2.6 Thiết lập ngắt ngoài INT0 cho viđiều khiển.ISC01 ISC00 Miêu tả ISC01 ISC00 Miêu tả
0 0 Mức thấp trên chân INT0 phát một yêu cầu ngắt 0 1 Khơng sử dụng
1 0 Cạnh xuống trên chân INT0 phát một yêu cầu ngắt 1 1 Cạnh lên trên chân INT0 phát một yêu cầu ngắt.
Giá trị trên chân INT0 được lấy mẩu trước khi các cạnh được phát hiện. Nếu ngắt cạnh
được chọn, những xung kéo dài hơn 1 chu kỳ xung đồng hồ CPU sẽ phát sinh một ngắt. Những xung ngắn hơn thì khơng bảo đảm sẽ phát sinh một ngắt. Nếu ngắt mức