Trong chương trình Account và Password được đặt là “123”. Sau khi người
sử dụng nhập password vào từ keyboard và login vào được hệ thống, hệ thống hoạt
động. Atmega128 luôn gửi tín hiệuquét hỏi slavethông qua Usart0_Tx. Khi sensor
nhận được tín hiệu trong khu vực quét có người nó gửi tín hiệu đến ngắt ngoài của
slave, tiếp đó slavegửi tín hiệu tới master thông qua Usart0_Rx của Atmega128.
Khi nhận dữ liệu xong lúc này DATA_flag có giá trị là True, Usart1nhận tín hiệu
vào Master. Khi Master đã nhận được dữ liệu nó điều chỉnh điện áp ra để đóng
Rơle điện cho đèn sáng, đèn sáng trong vòng 30 giây, đồng thời dữ liệu trong
Master được xóa và công việc quét hỏi lại tiếp tục.
108 trang |
Chia sẻ: lylyngoc | Lượt xem: 2552 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu các chuẩn truyền thông và xây dựng một ứng dụng cho hệ thống giám sát, điều khiển, điều hành tòa nhà cao tầng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
có khác. Khi TMS là 0 thì các bit PSR0 và PSR321 được xóa bởi phần
cứng và các bộ định thời (1,2,3) bắt đầu đếm đồng thời.
• Bit 0 – PSR321: Prescaler Reset Timer/Counter3, Timer/Counter2, and
Timer/Counter1: Khi bit này là 1 thì bộ chia trước (prescaler) của ba bộ định thời
1,2,3 được reset. Bit PSR321 được xóa bởi phần cứng ngoại trừ trường hợp bit
TSM được set.
Chú ý là ba bộ định thời 1, 2, 3 cùng chia sẽ một bộ chia trước (prescaler)
nên việc reset bộ chia trước (prescaler) sẽ tác động lên cả ba bộ định thời này.[2]
3.3.2.4.2. BỘ ĐỊNH THỜI 3
Bộ định thời 3 giống bộ định thời 1 nên ở đây chỉ trình bày các thanh ghi
liên quan tới bộ định thời 3, chức năng của từng thanh ghi có thể xem các thanh ghi
tương ứng với nó ở bộ định thời 1.
1. Thanh ghi TCCR3A (Timer/Counter3 Control Register A)
• Bit 7:6 – COM3A1:0: Compare Output Mode for Channel A
• Bit 5:4 – COM3B1:0: Compare Output Mode for Channel B
• Bit 3:2 – COM3C1:0: Compare Output Mode for Channel C
• Bit 1:0 – WGMn1:0: Waveform Generation Mode
2. Thanh ghi TCCR3B (Timer/Counter3 Control Register B)
Để ý là khối Input Capture Unit của bộ định thời 3 có khác chút ít so với của
bộ định thời 1. Xem chi tiết về khối Input Capture Unit ở phần mô tả “Khối Input
Capture Unit”.
• Bit 7 – ICNC3: Input Capture Noise Canceler
Trang - - 63
• Bit 6 – ICES3: Input Capture Edge Select
• Bit 5 – Reserved Bit
• Bit 4:3 – WGM3 3:2: Waveform Generation Mode
• Bit 2:0 – CS3 2:0: Clock Select
3. Thanh ghi TCCR3C (Timer/Counter3 Control Register C)
• Bit 7 – FOC3A: Force Output Compare for Channel A
• Bit 6 – FOC3B: Force Output Compare for Channel B
• Bit 5 – FOC3C: Force Output Compare for Channel C
• Bit 4:0 – Reserved Bits
4. Thanh Ghi Timer/Counter1 – TCNT3H and TCNT3L
5. Thanh Ghi Output Compare Register 3 A– OCR3AH and OCR3AL
Trang - - 64
6. Thanh Ghi Output Compare Register 3 B– OCR3BH and OCR3BL
7. Thanh Ghi Output Compare Register 3C– OCR3CH and OCR3CL
8. Thanh Ghi Input Capture Register 3 –ICR3H and ICR3L
9. Thanh Ghi Extended Timer/Counter Interrupt Mask Register –
ETIMSK (Interrupt for Timer/counter 3)
Để ý là ở bộ định thời 1 có sử dụng thanh ghi TIMSK và ETIMSK , còn bộ
định thời 3 chỉ sử dụng thanh ghi ETIMSK.
Trang - - 65
10. Thanh Ghi Extended Timer/Counter Interrupt Flag Register –
ETIFR
Để ý là bộ định thời 1 sử dụng cả 2 thanh ghi TIFR và ETIFR , còn bộ định
thời 3 chỉ sử dụng thanh ghi TIFR.
11. Thanh Ghi Special Function IO Register –SFIOR
12. Ngõ Ra Khối Compare Match Output Unit
Hình 26: Ngõ ra khối Compare Match Output Unit
Nhìn hình 27 trên ta thấy Pin OCnX (chẳng hạn pin 15 của IC tương ứng
với OC1A), là ngõ ra của khối Compare Match Output Unit, có thể được nối với 3
Trang - - 66
thanh ghi là OCnX, PortX và DDRX. Thanh ghi nào được nối với OCn là phụ
thuộc vào các bit COMn1:0 (tức tùy theo chế độ hoạt động của bộ định thời), giả
sử ta thiết lập các bit COMn1:0 để cho thanh ghi OCn được nối với PIN OCn, thì
hoạt động của PIN OCn (tức dạng sóng ở ngõ ra OCn ) lại phụ thuộc vào thiết lập
của các bit WGMn3:0, các bit WGMn3:0 sẽ qui định dạng sóng ngõ ra tại OCn như
thế nào. Ngược lại, nếu ta thiết lập bộ định thời hoạt động ở chế độ bình thường
(tức không sử dụng chức năng “so sánh khớp” thì chân OCn trở thành chân vào ra
số thông thường. Ngõ ra khối Compare Match Output Unit của bộ định thời 1 cũng
giống như ở bộ định thời 3.[17]
3.3.2.4.3. BỘ ĐỊNH THỜI 0
Hình 27: Sơ đồ khối bộ định thời 0
Bộ định thời 0 là bộ định thời 8 bit, bộ định thời 0 liên quan tới 7 thanh ghi
với nhiều chế độ thực thi khác nhau.
Bộ định thời 0 có vài đặc điểm chính như: Bộ đếm đơn kênh, xóa bộ định
thời khi có sự kiện so sánh khớp (compare match) và tự nạp lại, có thể đếm từ bộ
dao động 32 KHz bên ngoài, chế độ PWM hiệu chỉnh pha. Dưới đây là mô tả chức
năng của các thanh ghi liên quan tới bộ định thời 0.[17]
Trang - - 67
1. Thanh Ghi Timer/Counter Control Register – TCCR0
• Bit 7 – FOC0: Force Output Compare ( 6 )
• Bit 6, 3 – WGM01:0: Waveform Generation Mode
• Bit 5:4 – COM01:0: Compare Match Output Mode
• Bit 2:0 – CS02:0: Clock Select
• Bit 7 – FOC0: Force Output Compare: Bit này chỉ hoạt động khi các bit
WGM chỉ định chế độ non-PWM ( chẳng hạn chế độ CTC,…). Khi ở chế độ PWM
nên ghi bit này thành 0. Ở chế độ non-PWM, khi bit FOC0 được ghi thành 1 lập tức
một sự kiện “so sánh khớp cưỡng bức” ( Force compare match ) xảy ra ở bộ tạo
sóng, tức là sự kiện so sánh khớp bị bắt buộc xảy ra mặt dù giá trị bộ định thời
không bằng với giá trị ghi sẵn trong thanh ghi OCR0. Lúc này ngõ ra OC0 sẽ thay
đổi tùy theo thiết lập của những bit COM01:0 tương ứng với nó. Bit FOC0 sẽ tự
động xóa bởi phần cứng sau 1 chu kì clock. Bit này không thể đọc.
• Bit 6, 3 – WGM01:0: Waveform Generation Mode : Những bit này điều
khiển các chế độ thực thi của bộ đếm, theo đó dạng sóng tương ứng được tạo ra từ
bộ tạo sóng. Các chế độ thực thi được hỗ trợ là: Normal, CTC, PWM. Cụ thể xem
bảng 8.
Bảng 8: Lựa chọn các chế độ thực thi của bộ định thời 0.
(1): Tên các bit CTC0 và PWM0 đã không được sử dụng nữa và được thay
thế bằng các tên khác là WGM01 và WGM00. Khi lập trình nên chú ý điều này.
• Bit 5:4 – COM01:0: Compare Match Output Mode : Hai bit này điều khiển
hành vi của chân OC0. Nếu một trong hai bit này được set thành 1 thì ngõ ra OC0
Trang - - 68
được ưu tiên hơn chức năng I/O thông thường. Chú ý là các bit tương ứng của
OC0 trong thanh ghi DDR phải được set để cho phép ngõ ra. Khi bit OC0 được kết
nối với chân ngõ ra OC0 thì tác động của các bit COM01:0 đối với hành vi của
chân OC0 còn phụ thuộc vào các thiết lập của các bit WGM01:0. Chẳng hạn, khi ta
set bit { WGM00, WGM01, COM00, COM01} = { 0, 0, 1, 0 } thì bộ định thời 0 sẽ
hoạt động ở chế độ Normal và ở chế độ này hành vi của chân OC0 là: OC0 sẽ thay
đổi mức logic mỗi khi có sự kiện So sánh khớp ( Compare match ). Để ý là ở chế
độ Normal, với thiết lập các bit WGM00, WGM01, COM00, COM01 như trên, giá
trị thanh ghi OCR0 được cập nhật ngay tức thời, khác với ở chế độ PWM giá trị
thanh ghi OCR0 chỉ được cập nhật khi bộ định thời đếm tới giá trị TOP (giả định
trong đoạn chương trình ứng dụng có sự thay đổi giá trị thanh ghi OCR0).[2]
2. Thanh Ghi Timer/Counter Register –TCNT0
Đây là thanh ghi đếm 8 bit của bộ định thời 0 .Giá trị thanh ghi này tăng
hoặc giảm 1 đơn vị sau mỗi chu kì clock. Không nên ghi vào thanh ghi này khi nó
đang đếm.
3. Thanh Ghi Output Compare Register –OCR0
OCR0 là thanh ghi 8 bit, giá trị của nó được liên tục so sánh với giá trị của
thanh ghi TCNT0. Khi hai giá trị của hai thanh ghi này bằng nhau thì xảy ra một sự
kiện “so sánh khớp” (compare match). Sự kiện so sánh khớp sẽ tạo ra một ngắt, nếu
ngắt được cho phép. Hay tạo ra một dạng sóng ở chân ngõ ra OC0, tùy theo chế độ
thực thi của bộ định thời.
Trang - - 69
4. Thanh Ghi Timer/Counter Interrupt Mask Register – TIMSK
• Bit 1 – OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable
• Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable
• Bit 1 – OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable:
Khi bit OCIE0 ghi là 1 và bit I của thanh ghi trạng thái SREG được set
thành 1 thì ngắt sự kiện “so sánh khớp” (compare match interrupt ) được cho phép.
Khi đó một ngắt sẽ được thực thi khi xảy ra một sự kiện “so sánh khớp”.
• Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable: Khi bit này
được ghi là 1 và ngắt toàn cục được cho phép thì ngắt tràn bộ định thời
(Timer/Counter0 Overflow interrupt) được cho phép. Khi đó một ngắt tương ứng sẽ
được thực thi khi bộ định thời tràn.[2]
5. Thanh Ghi Timer/Counter Interrupt Flag Register – TIFR
• Bit 1 – OCF0: Output Compare Flag 0
• Bit 0 – TOV0: Timer/Counter0 Overflow Flag
• Bit 1 – OCF0: Output Compare Flag 0: Bit này sẽ được set lên 1 khi xảy ra
“so sánh khớp ” (compare match) giữa bộ định thời (tức thanh ghi TCCN0) với
thanh ghi OCR0. Cờ OCF0 sẽ tự động xóa khi ngắt tương ứng được thực thi. Ngoài
ra ta cũng có thể xóa cờ OCF0 bằng cách ghi một giá trị logic vào nó. Khi bit I
trong thanh ghi SREG, bit OCIE0 (Timer/Counter0 Compare Match Interrupt
Trang - - 70
Enable) và bit OCF0 được set lên 1 thì ngắt “so sánh khớp” (Compare Match
Interrupt) sẽ được thực thi.
• Bit 0 – TOV0: Timer/Counter0 Overflow Flag: Bit TOV0 được set thành 1
khi bộ định thời tràn và nó được xóa khi ngắt tương ứng được thực thi. Ngoài ra
cũng có thể xóa bằng cách ghi một giá trị logic vào vị trí của nó . Khi bit I trong
thanh ghi SREG, bit TOIE0 (Timer/Counter0 Overflow interrupt) và bit TOV0
được set lên 1 thì ngắt tràn bộ định thời 0 (Timer/Counter0 Overflow Interrupt ) sẽ
được thực thi. Trong chế độ PWM cờ TOV0 được Set khi bộ định thời 0 đổi hướng
đếm tại giá trị 00h.
6. Thanh Ghi Special Function IO Register –SFIOR
• Bit 7 – TSM: Timer/Counter Synchronization Mode
• Bit 1 – PSR0: Prescaler Reset Timer/Counter0
• Bit 7 – TSM: Timer/Counter Synchronization Mode: Ghi bit này thành 1 sẽ
kích hoạt chế độ đồng bộ bộ định thời (Timer/Counter Synchronization). Trong chế
độ này, một giá trị được ghi vào các bit PSR0 và PSR321 sẽ được giữ lại, vì thế nó
giữ cho tín hiệu reset của bộ chia trước (prescaler) tương ứng được xác nhận ( do
đó bộ chia trước (prescaler) vẫn ở trạng thái Reset ). Điều này là để chắc chắn là
các bộ định thời tương ứng sẽ được tạm nghỉ và có thể được cấu hình với các giá
trị như nhau mà không làm ảnh hưởng đến một trong những cấu hình nâng cao
khác của chúng. Khi bit này được ghi thành 0 thì các bộ định thời sẽ bắt đầu đếm
đồng thời.
• Bit 1 – PSR0: Prescaler Reset Timer/Counter0: Khi bit này là 1 thì bộ chia
trước của bộ định thời 0 (Timer/couter 0 prescaler) sẽ được đặt lại. Bit này thường
được xóa tức thời bởi phần cứng. Nếu bit này được ghi khi bộ định thời 0 đang
thực thi chế độ không đồng bộ thì nó vẫn giữ nguyên giá trị của nó cho đến khi bộ
chia trước được đặt lại. Bit này sẽ không được xóa bởi phần cứng nếu như bit TSM
được set thành 1.[17]
Trang - - 71
7. Thanh Ghi Asynchronous Status Register – ASSR
• Bit 3 – AS0: Asynchronous Timer/Counter0
• Bit 2 – TCN0UB: Timer/Counter0 Update Busy
• Bit 1 – OCR0UB: Output Compare Register0 Update Busy
• Bit 0 – TCR0UB: Timer/Counter Control Register0 Update Busy
• Bit 3 – AS0: Asynchronous Timer/Counter0: Khi bit AS0 là 0 thì bộ định
thời được đếm từ nguồn xung clock I/O, tức ClkI/O. Khi AS0 được ghi thành 1 bộ
định thời được đếm từ xung thạch anh ở chân TOSC1. Khi giá trị của AS0 bị thay
đổi thì nội dụng của các thanh ghi TCNT0, OCR0 và TCCR0 có thể bị hỏng.
• Bit 2 – TCN0UB: Timer/Counter0 Update Busy: Khi bộ định thời 0 thực
thi quá trình không đồng bộ và thanh ghi TCNT0 đang được ghi thì bit TCN0UB sẽ
set lên 1. Khi thanh ghi TCNT0 vừa được cập nhật từ thanh ghi lưu trữ tạm thì bit
này bị xóa bởi phần cứng. Mức logic 0 trong trường hợp này là để chỉ ra rằng thanh
ghi TCNT0 đã sẵn sàng để cập nhật một giá trị mới.
• Bit 1 – OCR0UB: Output Compare Register0 Update Busy: Khi bộ định
thời 0 thực thi quá trình không đồng bộ và thanh ghi OCR0 đang được ghi thì bit
OCR0UB sẽ set lên 1. Khi thanh ghi OCR0 vừa được cập nhật từ thanh ghi lưu trữ
tạm thì bit này bị xóa bởi phần cứng .Mức logic 0 trong trường hợp này là để chỉ ra
rằng thanh ghi OCR0 đã sẵn sàng để cập nhật một giá trị mới.
• Bit 0 – TCR0UB: Timer/Counter Control Register0 Update Busy: Khi bộ
định thời 0 thực thi quá trình không đồng bộ và thanh ghi TCCR0 đang được ghi
thì bit TCR0UB sẽ set lên 1. Khi thanh ghi TCCR0 vừa được cập nhật từ thanh ghi
lưu trữ tạm thì bit này bị xóa bởi phần cứng. Mức logic 0 trong trường hợp này là
để chỉ ra rằng thanh ghi TCCR0 đã sẵn sàng để cập nhật một giá trị mới.
Nếu ghi vào một trong ba thanh ghi của bộ định thời 0 (TCNT0, OCR0,
TCCR0) trong lúc cờ báo bận cập nhật (update busy flag) của chúng được set, thì
giá trị cập nhật có thể bị hỏng và sẽ tạo ra một ngắt không biết trước.[2]
Trang - - 72
3.3.2.4.4. BỘ ĐỊNH THỜI 2
Hình 28: Sơ đồ khối bộ định thời 2
Bộ định thời 2 là bộ định thời 8 bit, bộ định thời 2 liên quan tới 5 thanh ghi
với nhiều chế độ thực thi khác nhau. Các thuộc tính chính của bộ định gồm: Bộ
đếm đơn kênh, xóa bộ định thời khi có sự kiện “so sánh khớp” và tự động nạp lại,
PWM hiệu chỉnh pha, đếm sự kiện bên ngoài.
Các Thanh Ghi Bộ Định Thời 2.
1. Thanh ghi Timer/Counter Control Register – TCCR2
• Bit 7 – FOC2: Force Output Compare
• Bit 6, 3 – WGM21:0: Waveform Generation Mode
• Bit 5:4 – COM21:0: Compare Match Output Mode
• Bit 2:0 – CS22:0: Clock Select
Trang - - 73
• Bit 7 – FOC2: Force Output Compare: Bit FOC2 chỉ hoạt động khi bit
WGM20 chỉ định chế độ Non-PWM, trong chế PWM nên ghi bit này thành 0. Ở
chế độ non-PWM, khi bit FOC0 được ghi thành 1 lập tức một “so sánh khớp”
(compare match ) xảy ra ở bộ tạo sóng, ngõ ra OC2 thay đổi tùy theo thiết lập của
những bit COM21:0 tương ứng với nó. Bit này không thể đọc, khi đọc ta luôn
nhận giá trị 0. Bit này hoạt động giống như bit FOC0 của bộ định thời 0.
• Bit 6, 3 – WGM21:0: Waveform Generation Mode : Những bit này điều
khiển các chế độ thực thi của bộ đếm, theo đó dạng sóng tương ứng được tạo ra từ
bộ tạo sóng. Các chế độ thực thi được hỗ trợ là : Normal, CTC, PWM.
• Bit 5:4 – COM21:0: Compare Match Output Mode: Hai bit này điều khiển
hoạt động của chân OC2. Nếu một trong hai bit này được set thành 1 thì ngõ ra
OC2 được ưu tiên hơn chức năng I/O thông thường . Chú ý là các bit tương ứng
của OC2 trong thanh ghi DDR phải được set để cho phép ngõ ra. Khi OC2 được kết
nối với chân ngõ ra OC2 thì vai trò của các bit COM21:0 còn phụ thuộc vào các
thiết lập của các bit WGM21:0. Các bit này hoạt động giống với các bit COM01:0
của bộ định thời 0.
• Bit 2:0 – CS22:0: Clock Select: Dùng để lựa chọn nguồn xung clock cho bộ
định thời 2.
2. Thanh ghi Timer/Counter Register – TCNT2
Đây là thanh ghi đếm 8 bit của bộ định thời 2. Giá trị thanh ghi này tăng
hoặc giảm 1 đơn vị sau mỗi chu khì clock. Thanh ghi TCNT2 được truy xuất trực
tiếp khi đọc hay ghi ( Điều này khác với bộ định thời 1 và 3 là khi truy xuất các
thanh ghi TCNT1 hay TCNT3 cần phải thông qua thanh ghi tạm trung gian 8 bit ).
Không nên chỉnh sửa thanh ghi TCNT2 khi bộ định thời đang chạy.[17]
Trang - - 74
3. Thanh ghi Output Compare Register – OCR2
Thanh ghi OCR2 là thanh ghi 8 bit, giá trị của thanh ghi OCR2 sẽ được liên
tục so sánh với giá trị của bộ đếm, tức thanh ghi TCNT2. Khi giá trị của hai thanh
ghi này bằng nhau sẽ tạo ra sự kiện “so sánh khớp” ( Compare match). Một ngắt so
sánh khớp ( compare match interrupt ) có thể được tạo ra nếu ngắt được cho phép,
hay một dạng sóng sẽ được tạo ra ở chân OC2.Thanh ghi này hoạt động tương tự
như thanh ghi OCR0 ở bộ định thời 0.
4. Thanh ghi Timer/Counter Interrupt Mask Register – TIMSK
• Bit 7 – OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable
• Bit 6 – TOIE2: Timer/Counter2 Overflow Interrupt Enable
• Bit 7 – OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable:
Khi bit OCIE2 được set thành 1 và bit I trong thanh ghi trạng thái được set
thành 1 thì ngắt “so sánh khớp” (compare match interrupt ) của bộ định thời 2 được
cho phép. Khi đó một ngắt tương ứng sẽ được thực thi khi xảy ra một sự kiện “so
sánh khớp” ở bộ định thời 2. Chẳng hạn, để xảy ra một “so sánh khớp” (compare
match ) ở bộ định thời 2 ta có thể set bit OCF2 trong thanh ghi TIFR, hoặc là chờ
cho đến khi nào giá trị của hai thanh ghi TCNT2 và OCR2 bằng nhau thì một “so
sánh khớp” (compare match ) sẽ xảy ra.
• Bit 6 – TOIE2: Timer/Counter2 Overflow Interrupt Enable: Khi bit này
được ghi là 1 và ngắt toàn cục được cho phép (bit I trong thanh ghi trạng thái
SREG được set thành 1) thì ngắt tràn bộ định thời 2 (Timer/Counter2 Overflow
interrupt) được cho phép. Khi đó một ngắt tương ứng sẽ được thực thi khi bộ định
Trang - - 75
thời 2 tràn. Chẳng hạn, ta set bit TOV2 trong thanh ghi TIFR thành 1 hoặc là chờ
cho bộ định thời 2 bị tràn khi vượt quá giá trị TOP ( hay MAX ).
5. Thanh ghi Timer/Counter Interrupt Flag Register – TIFR
• Bit 7 – OCF2: Output Compare Flag 2
• Bit 6 – TOV2: Timer/Counter2 Overflow Flag
• Bit 7 – OCF2: Output Compare Flag 2 : Bit này sẽ được set lên 1 khi xảy
ra sự kiện “so sánh khớp” (compare match) giữa bộ định thời 2 (tức thanh ghi
TCCN2) với thanh ghi OCR2. Cờ OCF2 sẽ tự động xóa khi ngắt tương ứng được
thực thi. Ngoài ra ta cũng có thể xóa cờ OCF2 bằng cách ghi một giá trị logic vào
nó. Khi bit I trong thanh ghi SREG, bit OCIE2 (Timer/Counter2 Compare Match
Interrupt Enable) và bit OCF2 được set lên 1 thì ngắt sự kiện “so sánh khớp”
(Compare Match Interrupt) của bộ định thời 2 sẽ được thực thi.
• Bit 6 – TOV2: Timer/Counter2 Overflow Flag: Bit TOV2 được set thành 1
khi bộ định thời tràn và nó được xóa khi ngắt tương ứng được thực thi. Ngoài ra
cũng có thể xóa bằng cách ghi một giá trị logic vào vị trí của nó. Khi bit I trong
thanh ghi SREG, bit TOIE2 (Timer/Counter2 Overflow interrupt) và bit TOV2
được set lên 1 thì ngắt tràn bộ định thời 2 (Timer/Counter2 Overflow Interrupt ) sẽ
được thực thi. Trong chế độ PWM cờ TOV2 được set khi bộ định thời 2 đổi hướng
đếm tại giá trị 00h.[2]
3.3.2.5. Cấu trúc ngắt
3.3.2.5.1. Khái niệm về ngắt
Ngắt là một sự kiện bên trong hay bên ngoài làm ngắt bộ vi điều khiển để
báo cho nó biết rằng thiết bị cần dịch vụ của nó.
Một bộ vi điều khiển có thể phục vụ một vài thiết bị, có hai cách để thực hiện
điều này đó là sử dụng các ngắt (interrupt) và thăm dò (polling). Trong phương
pháp sử dụng các ngắt thì mỗi khi có một thiết bị bất kỳ cần đến dịch vụ của nó thì
nó báo cho bộ vi điều khiển bằng cách gửi một tín hiệu ngắt. Khi nhận đựợc tín
hiệu ngắt thì bộ vi điều khiển ngắt tất cả những gì nó đang thực hiện để chuyển
sang phục vụ thiết bị. Chương trình đi cùng với ngắt được gọi là trình dịch vụ ngắt
Trang - - 76
ISR (Interrupt Service Routine) hay còn gọi là trình quản lý ngắt (Interrupt
handler). Còn trong phương pháp thăm dò thì bộ vi điều khiển hiển thị liên tục tình
trạng của một thiết bị đã cho và điều kiện thoả mãn thì nó phục vụ thiết bị. Sau đó
nó chuyển sang hiển thị tình trạng của thiết bị kế tiếp cho đến khi tất cả đều được
phục vụ.
Mặc dù phương pháp thăm dò có thể thể hiển thị tình trạng của một vài thiết
bị và phục vụ mỗi thiết bị khi các điều kiện nhất định được thoả mãn nhưng nó
không tận dụng hết cộng dụng của bộ vi điều khiển. Điểm mạnh của phương pháp
ngắt là bộ vi điều khiển có thể phục vụ được rất nhiều thiết bị (tất nhiên là không
tại cùng một thời điểm). Mỗi thiết bị có thể nhận được sự chú ý của bộ vi điều
khiển dựa trên mức ưu tiên được gán cho nó. Đối với phương pháp thăm dò thì
không thể gán mức ưu tiên cho các thiết bị vì nó kiểm tra tất cả mọi thiết bị theo
kiểu quay vòng. Quan trọng hơn là trong phương pháp ngắt thì bộ vi điều khiển
cũng còn có thể che hoặc làm lơ một yêu cầu dịch vụ của thiết bị. Điều này lại một
lần nữa không thể thực hiện được trong phương pháp thăm dò. Lý do quan trọng
nhất mà phương pháp ngắt được ưu chuộng nhất là vì phương pháp thăm dò làm
hao phí thời gian của bộ vi điều khiển bằng cách hỏi dò từng thiết bị kể cả khi
chúng không cần đến dịch vụ.[5]
3.3.2.5.2. Trình phụ vụ ngắt và bảng véctơ ngắt
Đối với mỗi ngắt thì phải có một trình phục vụ ngắt ISR (Interrupt Service
Routine) hay trình quản lý ngắt (Interrupt handler). Khi một ngắt đựợc gọi thì bộ
vi điều khiển phục vụ ngắt. Khi một ngắt đựợc gọi thì bộ vi điều khiển chạy trình
phục vụ ngắt. Đối với mỗi ngắt thì có một vị trí cố định trong bộ nhớ để giữ địa chỉ
ISR của nó. Nhóm các vị trí nhớ được dành riêng để gửi các địa chỉ của các ISR
được gọi là bảng véc tơ ngắt.
Khi kích hoạt một ngắt bộ vi điều khiển đi qua các bước sau:
● Vi điều khiển kết thúc lệnh đang thực hiện và lưu địa chỉ của lệnh kế tiếp
(PC) vào ngăn xếp.
● Nó nhảy đến một vị trí cố định trong bộ nhớ được gọi là bảng véc tơ ngắt
nơi lưu giữ địa chỉ của một trình phục vụ ngắt.
● Bộ vi điều khiển nhận địa chỉ ISR từ bảng véc tơ ngắt và nhảy tới đó. Nó
bắt đầu thực hiện trình phục vụ ngắt cho đến lệnh cuối cùng của ISR là RETI (trở
về từ ngắt).
● Khi thực hiện lệnh RETI bộ vi điều khiển quay trở về nơi nó đã bị ngắt.
Trước hết nó nhận địa chỉ của bộ đếm chương trình PC từ ngăn xếp bằng cách kéo
Trang - - 77
hai byte trên đỉnh của ngăn xếp vào PC. Sau đó bắt đầu thực hiện các lệnh từ địa
chỉ đó.[5]
3.3.2.5.3. Bảng véctơ ngắt của ATmega128
Dưới đây là bảng véc tơ ngắt của ATmega128 , cùng với địa chỉ của nó trong
bộ nhớ chương trình
Trang - - 78
Bảng 9: Bảng Vector Ngắt Của ATmega128
3.3.2.5.4. Thứ tự ưu tiên ngắt
Không như vi điều khiển họ 8051, ở đó thứ tự ưu tiên của các ngắt có thể
thay đổi được ( bằng cách lập trình ). Với vi điều khiển AVR thứ tự ưu tiên các
ngắt là không thể thay đổi và theo qui tắc: “ Một vec tơ ngắt có địa chỉ thấp hơn
trong bộ nhớ chương trình có mức độ ưu tiên cao hơn ”. Chẳng hạn ngắt ngoài 0 (
INT0 ) có mức độ ưu tiên cao hơn ngắt ngoài 1 ( INT1 ).
Để cho phép một ngắt người dùng cần cho phép ngắt toàn cục ( set bit I
trong thanh ghi SREG ) và các bit điều khiển ngắt tương ứng.
Khi một ngắt xảy ra và đang được phục vụ thì bit I trong thanh ghi SREG bị
xóa, như thế khi có một ngắt khác xảy ra nó sẽ không được phục vụ, do đó để cho
phép các ngắt trong khi một ISR ( interrupt service routine ) khác đang thực thi, thì
trong chương trình ISR phải có lệnh SEI để set lại bit I trong SREG.[17]
Trang - - 79
3.3.2.5.5. Các ngắt ngoài
ATmega128 có 8 ngắt ngoài từ INT0 đến INT7 ( ở đây chưa kể tới ngắt
reset ). Tám ngắt này tương ứng với 8 chân của MCU là INT0 ,INT1, …, INT7. Để
ý là ngay cả khi các chân INT0, INT1, …, INT7 của MCU được cấu hình như là
chân lối ra, thì các ngắt ngoài vẫn có tác dụng nếu được cho phép.
Các ngắt ngoài có thể bắt mẫu theo kiểu cạnh lên ( Rising ), cạnh xuống (
Falling ) hay mức thấp ( Low level ). Điều này được qui định trong hai thanh ghi
EICRA và EICRB. Dưới đây là mô tả chi tiết 2 thanh ghi EICRA và EICRB và các
thanh ghi liên quan tới các ngắt ngoài.
1. Thanh ghi External Interrupt Control Register A – EICRA
• Bits 7..0 – ISC31, ISC30 – ISC00, ISC00: External Interrupt 3 - 0 Sense
Control Bits.
Tám bit của thanh ghi EICRA sẽ điều khiển kiểu bắt mẫu cho 4 ngắt INT3,
INT2, INT1, INT0. Qui định cụ thể được thể hiện trong Bảng 10 .
n = 3, 2, 1, 0
Bảng 10: Điều khiển kiểu bắt mẫu ngắt trong thanh A
2. Thanh Ghi External Interrupt Control Register B – EICRB
Trang - - 80
• Bits 7..0 – ISC71, ISC70 - ISC41, ISC40: External Interrupt 7 - 4 Sense
Control Bits.
Tám bit của thanh ghi EICRA sẽ điều khiển kiểu bắt mẫu cho 4 ngắt INT7,
INT6, INT5, INT4. . Qui định cụ thể được thể hiện trong Bảng 11 .
n = 7,6, 5, 4
Bảng 11: Điều khiển kiểu bắt mẫu ngắt trong thanh B
3. Thanh Ghi External Interrupt Mask Register – EIMSK
• Bits 7..0 – INT7 – INT0: External Interrupt Request 7 - 0 Enable : Khi cho
phép ngắt toàn cục ( set bit I trong thanh ghi SREG thành 1 ) thì các ngắt vẫn chưa
thể thực thi, để ngắt có thể thực thi ta cần phải cho phép nó, 8 bit trong thanh ghi
EIMSK sẽ quyết định 8 ngắt ngoài tương ứng ( từ INT7 ...INT0 ) có được cho phép
hay không. Khi một trong số 8 bit ( từ INT7 ...INT0 ) được set thành 1 và ngắt toàn
cục được cho phép thì ngắt ngoài tương ứng được cho phép. Còn tín hiệu ngắt là
mức hay cạnh sẽ do các thanh ghi EICRA và EICRB ( nêu ở trên ) qui định. Kích
hoạt bất cứ chân ( Pin ) nào trong 8 chân của ngắt ngoài cũng tạo ra yêu cầu ngắt
ngay cả khi chân được thiết lập thành ngõ ra.
Trang - - 81
4. Thanh Ghi External Interrupt Flag Register – EIFR
• Bits 7..0 – INTF7 - INTF0: External Interrupt Flags 7 – 0 : Đây là tám cờ
ngắt tương ứng với tám ngắt ngoài INT7..INT0. Khi có tín hiệu yêu cầu ngắt ngoài
thì cờ ngắt tương ứng sẽ được set thành 1, nếu ngắt tương ứng được cho phép thì
MCU sẽ nhảy tới bảng véc tơ ngắt, cờ ngắt sẽ được xóa khi chương trình phục vụ
ngắt ( ISR ) được thực thi.
Ngoài ra ta cũng có set hay xóa cờ ngắt bằng cách ghi trực tiếp một giá trị
logic vào nó.
5. Thanh Ghi MCU Control Register – MCUCR
Trong phần này ta chỉ quan tâm tới hai bit là: IVCE (Interrupt Vector Select )
và bit IVSEL (Interrupt Vector Change Enable ) của thanh ghi MCUCR. Bit này
liên quan đến việc thiết lập vị trí bảng véc tơ ngắt.
• Bit 1 – IVSEL: Interrupt Vector Select: Khi bit này là 0 vị trí của bảng véc
tơ ngắt được đặt ở phần đầu bộ nhớ chương trình. Khi bit này là 1 bảng véc tơ ngắt
được di chuyển tới phần đầu của vùng nhớ Boot Loader.
• Bit 0 – IVCE: Interrupt Vector Change Enable : Bit này phải được ghi
thành 1 để cho phép thay đổi bit IVSEL. Bit IVCE được xóa sau 4 chu kì máy sau
khi nó được set hay bit IVSEL được ghi. Trong lúc bit ICVE đang set các ngắt sẽ
bị cấm cho tới khi bit IVSEL được ghi, nếu bit IVSEL không được ghi thì các ngắt
vẫn bị cấm trong 4 cho kì máy liên tiếp ( sau 4 chu kì máy thì bit IVCE sẽ tự động
bị xóa nên các ngắt được cho phép trở lại ).[2]
Trang - - 82
3.3.3. Giới thiệu vi điều khiển AVR Atmega8
3.3.3.1. Giới thiệu chung
Vi điều khiển AVR Atmega8 có một số đặc điểm sau:
- Có 8Kbyte bộ nhớ flash có thể xóa lập trình được và có thể chịu được
10000 lần ghi xóa.
- Có 32 thanh ghi đa năng 8 bit, 512 byte bộ nhớ EEPROM tích hợp trên
chíp, có 1 kbyte SRAM nội.
- Có hai bộ Timer/counter 8 bit và một bộ timer/counter 16 bit với bộ chia
tần lập trình được.
- Có ba kênh điều xung, 6 kênh lối vào chuyển đổi ADC với độ phân giải 10
bit.
- Atmega8 có 32 chân.
- Nguồn nuôi từ 2.7 đến 5.5 đối với Atmega8L và từ 4.5 đến 5.5 đối với
Atmega8, làm việc tiêu thụ dòng 3.6mA.
- Sử dụng mạch dao động ngoài từ 0 đến 8 Mhz với Atmega8L và từ 0 đến
16 Mhz với Atmega8. Ngoài ra chíp Atmega8 còn có bộ xung nội bên trong có thể
lập trình chế độ xung nhịp.[3]
Trang - - 83
3.3.3.2. Sơ đồ chân
Hình 29: Sơ đồ chân Atmega8
Trang - - 84
Bảng 12: Các chân Atmega8
3.3.4. Cảm biến
Hình 30: Hình ảnh cảm biến JS- 20 Largo Pir
Trang - - 85
Cảm biến JS-20 Largo Pir được dùng để phát hiện chuyển động của con
người. Các tín hiệu từ bộ cảm biến điện tử được phân tích. Điều này đảm bảo rằng
phát hiện này cung cấp độ nhạy cảm tuyệt vời và đồng thời về cơ bản loại bỏ được
báo động sai.
Cảm biến JS-20 Largo Pir có thể phát hiện được các chuyển động trong
phạm vi dài 12 mét và với góc 1200.
Hình 31: Khoảng cách và góc quét của JS-20
Thông số kỹ thuật:[1]
Nguồn điện cấp 12 V DC ± 25%
Điện năng tiêu thụ (LED off) max. 10 mA
Tiêu thụ tối đa (LED on) max. 35 mA
Kích thước thiết bị đầu cuối max. 1 mm2
Chiều cao lắp đặt 2,5 m trên sàn
Vùng phát hiện 120 ° / 12 m
Thời gian khởi động 1 phút
Báo động đầu ra thường đóng, tối đa 60V / 50 mA trở nội max.30 Ohm
Tamper đầu ra thường đóng, tối đa 60 V / 50 mA trở nội max.16 Ohm
Môi trường Trong nhà, (EN 50.131-1)
Nhiệt độ hoạt động -10 Đến 55 ° C
Mức độ bảo mật lớp 2, EN 50.131-1
Bảng 13: Các thông số kỹ thuật của sensor JS-20
Trang - - 86
3.3.5. Mạch Slave
Mạch Slave được thiết kế như sau:
o Sơ đồ nguyên lý mạch Slave sử dụng Atmega8
SCK
GDO0
J1
ISP
1
2
3
4
5
6
MISO
RXD
R5
120
R71
150
U16
MAX485
1
4
5
8
2
3
6
7
RO
DI
G
N
D
V
C
C
RE
DE
A
B
R72
150
R4
10k
R73
150
U17
MAX485
1
4
5
8
2
3
6
7
RO
DI
G
N
D
V
C
C
RE
DE
A
B
C3
10uF
C4
10uF
GDO2
TXD
VCC
VCC
SCK
RST
MISO
U2
LM1117-3.3
3
1
2
VIN
ADJ
VOUT
R6
120
J4
Sensor_OUT
1
2
C5
10uF
VCC
RST
GDO0
MOSI
C2
22pF
R1
10k
C1
22pF
VCC
VCC
U1
ATMEGA8
1
2
3
4
5
6
7
8
9 10 11 12 13 14 15 16
17
18
19
20
21
22
23
24
2526272829303132
PD3(INT1)
PD4
GND
VCC
GND
VCC
XTAL1
XTAL2
P
D
5
P
D
6
P
D
7
P
B
0
P
B
1
S
S
M
O
SI
M
IS
O SCK
AVCC
ADC6
AREF
GND
ADC7
PC0
PC1
P
C
2
P
C
3
P
C
4
P
C
5
P
C
6(
/R
E
S
E
T
)
R
X
D
T
X
D
IN
T
0
ATMEGA8 MODULS - UET 2009
SCK
GDO2
TXD
R74
150
VCC
MOSI
VCC
RST
MISO
SS
RXD
J3
12V
1
2
VCC
Y1
4MHZ
CC1101_M
RF_Module
1
2
3
4
5
6
7
8
9
J12
RJ45
1
2
3
4
5
6
7
8
VCC VCC
MOSI
VCC
SS
R2
10k
C6
104
VCC
VCC
Hình 32: Sơ đồ nguyên lý mạch Slave
Trang - - 87
o Sơ đồ PCB của mạch Slave sử dụng Atmega8
0
0
0 0
0
1
2
1
2
654321
1 2
1 2
1
2
1 2
12
21
2121
0
0
0
0
9
8
7
6
5
4
3
2
1
2
1
1
22
1
1
Hole32
Hole31
8
7
6
5
4
3
2
0
3
2
1
1
2
3
4 5
6
7
8
1
2
1
2
2 1
Hole32
Hole31
8
7
6
5
4
3
2
1
1
2
1 2
2
1
2
1
Hình 33: Sơ đồ mạch PCB của mạch slave
Trang - - 88
3.3.6. Mạch Master
Mạch Master được thiết kế như sau:
o Sơ đồ nguyên lý mạch Master sử dụng Atmega128
VCCLCD1
D6
D2
VCC
R42
1k
C5
10uF
VCC
EX_CS
D7
A13
LCD5
U18
74HC573
2
3
4
5
6
7
8
9
11
1
19
18
17
16
15
14
13
12
10
20
D0
D1
D2
D3
D4
D5
D6
D7
LE
OE
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
G
N
D
V
C
C
WR
VCC
U8
DS1307 4
7
51
2
6
3
8
G
N
D
SQW/OUT
SDAX1
X2
SCL
V
B
A
T
VCC
GDO2
D6
D5
SS
D5
C3
22pF
A2
R3
10k
C1
10uF
XTAL2
SCL
A5
VCC
D2
A7
MASTER UNIT - Atmega128 - UET 2009
C9
1000uF
VCC
A4
U9
24C256
1
2
3
4
5
6
7
8
A0
A1
A2
G
N
D
SDA
SCL
WP
V
C
C
TX0
LED
SCK
D1
VCC
D1
A9
C10
22pF
VCC
D0
LCD7
XTAL1
D1
LCD6
XTAL2
LCD7
LCD2
LCD2
A0
RX1
LED
SCL
A9
A3
A8
SCL
CS
LCD4
VCC
A7
A12
R1
10k
J7
ATXS
1
2
VCC
WR
C8
10uF
RD
CS
D7
D0
A1
VCC
D2
LCD4
VCC
ADDRESSBUS
MISO
U10
ATMEGA64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49505152535455565758596061626364
/PEN
(RXD0/PDI)/PE0
(TXD0/PDO)/PE1
(XCK0/AIN0)/PE2
(OC3A/AIN1)/PE3
(OC3B/INT4)/PE4
(OC3C/INT5)/PE5
(T3/INT6)/PE6
(ICP3/INT7)/PE7
(/SS)/PB0
(SCK)/PB1
(MOSI)/PB2
(MISO)/PB3
(OC0)/PB4
(OC1A)/PB5
(OC1B)/PB6
(O
C
2/
O
C
1C
)/
P
B
7
TO
S
C
2/
PG
3
TO
S
C
1/
PG
4
/R
E
S
E
T
VC
C
G
N
D
XT
A
L2
XT
A
L1
(S
C
L/
IN
T0
)/
P
D
0
(S
D
A
/I
N
T1
)/
P
D
1
(R
X
D
1/
IN
T
2)
/P
D
2
(T
X
D
1/
IN
T
3)
/P
D
3
(IC
P
1)
/P
D
4
(X
C
K
1)
/P
D
5
(T
1)
/P
D
6
(T
2)
/P
D
7
(/WR)/PG0
(/RD)/PG1
(A8)/PC0
(A9)/PC1
(A10)/PC2
(A11)/PC3
(A12)/PC4
(A13)/PC5
(A14)/PC6
(A15)/PC7
(ALE)/PG2
(AD7)/PA7
(AD6)/PA6
(AD5)/PA5
(AD4)/PA4
(AD3)/PA3
(D
A
2)
/P
A
2
(D
A
1)
/P
A
1
(D
A
0)
/P
A
0
VC
C
G
N
D
(A
D
C
7/
T
D
I)
/P
F
7
(A
D
C
6/
T
D
O
)/
PF
6
(A
D
C
5/
T
M
S
)/
PF
5
(A
D
C
4/
T
C
K
)/P
F
4
(A
D
C
3)
/P
F
3
(A
D
C
2)
/P
F
2
(A
D
C
1)
/P
F
1
(A
D
C
0)
/P
F
0
A
R
E
F
G
N
D
A
VC
C
A3
D6
D5
R45
1k
U6
24C256
1
2
3
4
5
6
7
8
A0
A1
A2
G
N
D
SDA
SCL
WP
V
C
C
CS
A2
D6
A10
A6
SCL
SCK
VCC
R70
220
P1
CONNECTOR DB9
5
9
4
8
3
7
2
6
1
J2
ISP
1
2
3
4
5
6
VCC
A2
LCD3
VCC
PDO
VCC
J70
LCD
1
2
3
4
5
6
7
8
9
10
XTAL1
WR
D4
VCC
D0
D3
D1A1
J6
BUTTON
1 2 3 4 5 6 7 8 9 10
D7
U5A
7404
1 2
14
7
SCL
PDO
A12
DATABUS
VCC
D4
ALE A10
D4
A9
VCC
A0
D6
VCC
R60
4.7k
BT1
BATTERY
ALE
A4
A14
LCD6
LCD1
J1
RPACK
1
2
3
4
5
6
7
8
9
RD
A12
D5
D301990428
LED
RXD
PDI
LCD5
A14
D3
SDA
D3
R2
10k
U4
62256
1
2
3
4
5
6
7
8
9
10 11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
A14
A12
A7
A6
A5
A4
A3
A2
A1
A0 I/O0
I/O1
I/O2
V
SS
I/O3
I/O4
I/O5
I/O6
I/O7
/CS
A10
/OE
A11
A9
A8
A13
/WE
V
C
C
R20
330
Y 2
32.768kHz
C7
10uF
VCC
GDO0
D3
A5
R44
1k
VCC
MOSI
A0
A8
LCD3
C6
10uF
A6
A3
U7
MAX232
1
3
4
5
16
15
2
6
12
9
11
10
13
8
14
7
C1+
C1-
C2+
C2-
V
C
C
G
N
DV+
V-
R1OUT
R2OUT
T1IN
T2IN
R1IN
R2IN
T1OUT
T2OUT
RST
VCC
VCC
A11
A6
A7
RX0
LED
A11
U3
62256
1
2
3
4
5
6
7
8
9
10 11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
A14
A12
A7
A6
A5
A4
A3
A2
A1
A0 I/O0
I/O1
I/O2
V
SS
I/O3
I/O4
I/O5
I/O6
I/O7
/CS
A10
/OE
A11
A9
A8
A13
/WE
V
C
C
C2
10uF
RST
Y 1
CRYSTAL
PDI
A5
A13
SDA
SDA
A8
R79
TRONHIET
RXD
D0
D1
A11
VCC
TXD
D4
C4
22pF
SDA
VCC
D2
A14
TX1
LED
A13
A1
A10
EX_CS
D0
D4
J4
CON8
1
2
3
4
5
6
7
8
RD
D2
TXD
A4
D3
SDA
D7
VCC
D5
D7
R43
1k
C11
22pF
Hình 34: Sơ đồ nguyên lý mạch Master
Trang - - 89
o Sơ đồ PCB của mạch Master sử dụng Atmega128
0
10
5
1
2
1 2
1
2
1
2
1
2
1
2
1
2
1
2
1 2
21
Hole32
Hole31
8
7
6
5
4
3
2
1
123
4
1 2
21
1 2
1 2 3
0
12
8 7 6 5
4321
1
1
2
12
2
1
2
1
2
1
1 2 1 2 1 21 2
21
2
1
2
1
1
2
6 5 4 3 2 1
123
8
7
6
5
4
3
2
1
1
2
3
4
5
6
7
8
21
1 2
1 2
2 1
20
19
18
17
16
15
14
13
12
1110
9
8
7
6
5
4
3
2
1
28
27
26
25
24
23
22
21
20
19
18
17
16
15 14
13
12
11
10
9
8
7
6
5
4
3
2
128
27
26
25
24
23
22
21
20
19
18
17
16
15 14
13
12
11
10
9
8
7
6
5
4
3
2
1
14 13 12 11 10 9 8
7654321
8 7 6 5
4321
16 15 14 13 12 11 10 9
87654321
8 7 6 5
4321
8 7 6 5
4321
2 1
12
1
11
1
2
1
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
123
1 2
2
1
2
1
1234
5 6 7 8
2
1
2
1
21
0
0
0
0
9
8
7
6
5
4
3
2
1
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2
1 2
Hình 35: Sơ đồ mạch PCB của mạch Master
Hình 36: Mạch điện điều khiển của mạch Master
Trang - - 90
3.3.7. Keyboard và LCD
Mạch Keyboard và LCD được thiết kế như sau:
00
00
1
2
1
2
1
2
1
2
1 2
1 2
1 2
1 2
12
12
21
10
9
8
7
6
5
4
3
2
1
10
9
8
7
6
5
4
3
2
1
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
1 2
34
87654321
0 0
0 0
1 1 615141312111098765432
87654321
65
43
21
109
87
Hình 37: Sơ đồ mạch PCB của LCD Keyboard
Trang - - 91
Hình 38: Mạch điện điều khiển của Keyboard và LCD
3.4. Xây dựng phần mềm nhúng điều khiển cho hệ thống
3.4.1. Xây dựng phần mềm nhúng điều khiển cho mạch Slave dùng
Atmega8
3.4.1.1. Sơ đồ hoạt động
Hình 39: Sơ đồ khối hoạt động của mạch Slave
Cảm biến
Master
Slave
UART
uC
Atmega8
EXT_INT0
Rx Hỏi
Tx
Trang - - 92
3.4.1.2. Giải thích hoạt động
Khi có sự xuất hiện của con người trong vùng quét của cảm biến, tín
hiệu từ cảm biến được gửi đến Slave tại ngắt ngoài INT0, lúc này sensor_flag là
True. PORTC.0 được đặt lên 1, đặt RS485 ở chế độ truyền tín hiện đi. Dữ liệu của
tín hiệu được gửi tới Master, khi dữ liệu gửi hết đến Master thì sensor_flag lại được
đặt là False và PORTC.0 được đặt xuống 0 lúc này slave ở chế độ quét chờ nhận tín
hiệu tiếp theo.
3.4.2. Xây dựng phần mềm nhúng điều khiển cho Master dùng
Atmega128
3.4.2.1. Sơ đồ hoạt động
Hình 40: Sơ đồ khối hoạt động của mạch Master
Slave
Rx Tx
Query slave
Master
LCD
Keyboard
Tải
uC
Atmega128
Usart0 Usart1
Timer0 Timer1
Trang - - 93
3.4.2.2. Giải thích hoạt động
Trong chương trình Account và Password được đặt là “123”. Sau khi người
sử dụng nhập password vào từ keyboard và login vào được hệ thống, hệ thống hoạt
động. Atmega128 luôn gửi tín hiệu quét hỏi slave thông qua Usart0_Tx. Khi sensor
nhận được tín hiệu trong khu vực quét có người nó gửi tín hiệu đến ngắt ngoài của
slave, tiếp đó slave gửi tín hiệu tới master thông qua Usart0_Rx của Atmega128.
Khi nhận dữ liệu xong lúc này DATA_flag có giá trị là True, Usart1 nhận tín hiệu
vào Master. Khi Master đã nhận được dữ liệu nó điều chỉnh điện áp ra để đóng
Rơle điện cho đèn sáng, đèn sáng trong vòng 30 giây, đồng thời dữ liệu trong
Master được xóa và công việc quét hỏi lại tiếp tục.
3.5. Kết quả và khả năng ứng dụng của hệ thống
3.5.1. Tính khoa học
Thế kỷ 20 - 21 là thế kỷ của Thông Tin Điện tử - Viễn Thông, là nền tảng
quan trọng trong việc điều khiển tự động hóa phù hợp với xu hướng phát triển khoa
học kỹ thuật.
Đề tài thể hiện tính ứng dụng đa năng trong kỹ thuật vi điều khiển.
Ngoài ra đề tài còn sử dụng phần mềm hiện đại CodeVisionAVR để xây
dựng phần mềm nhúng cho bo mạch.
3.5.2. Khả năng triển khai ứng dụng vào thực tiễn
Mục tiêu của đề tài này là nghiên cứu, thiết kế và chế tạo bo mạch điện tử
ứng dụng trong tự động hóa và xây dựng phần mềm điều khiển cho bo mạch nêu
trên để điều khiển bật/tắt đèn chiếu sáng và điều khiển đóng ngắt các thiết bị điện
dân dụng khác một cách tự động nhằm tạo sự tiện dụng cho con người và tiết kiệm
năng lượng.
Hệ thống có khả năng điều khiển được nhiều bóng đèn. Tuy nhiên, đề tài này
chỉ làm trên mô hình cho nên tôi chỉ đưa ra điều khiển 1 bóng đèn mà thôi.
Hệ thống này tôi xây dựng để điều khiển bật/ tắt đèn chiếu sáng tự động, trên
cơ sở này có thể phát triển mở rộng để điều khiển bật/ tắt các thiết bị điện khác.
Ngoài ra trong công tác giảng dạy, hệ thống trở thành một mô hình thực tế
dùng để giảng dạy thể hiện sự ứng dụng của tự động hóa và đặc biệt khả năng ứng
dụng đa dạng của Vi Điều Khiển.
Trang - - 94
Với những đặc điểm và tính năng trên, đề tài có khả năng triển khai ứng
dụng rộng rãi trong thực tế và mang tính hiện đại thực tiễn cao.
3.5.3. Hiệu quả kinh tế xã hội
Nhờ có điều khiển tự động con người giảm bớt được những công việc đóng
ngắt một số thiết bị điện, với điều kiện thi công của đề tài rất khả thi, giá thành
thấp, phù hợp với điều kiện hiện tại nước nhà. Đề tài mang tính tiện ích rất cao
được ứng dụng từ dân dụng đến công nghiệp cũng như những nơi công cộng.
Sử dụng hệ thống điều khiển bật/ tắt đèn chiếu sáng con người có thể ra vào
những khu vực không cần chiếu sáng liên tục như cầu thang, hành lang, nhà vệ sinh
và các khu vực khác mà không cần bật/ tắt đèn chiếu sáng. Điều này đem lại sự tiện
dụng, thoải mái trong đời sống sinh hoạt của con người, đồng thời một lợi ích to
lớn khác là tiết kiệm được năng lượng điện chiếu sáng góp phần vào công cuộc tiết
kiệm tiêu thụ năng lượng điện toàn cầu.
Hơn nữa về tính khả thi trong tương lai, đề tài mang tính kích thích thúc đẩy
sự phát triển của ngành Công nghệ Điện tử Việt Nam. Từ đó góp phần xây dựng
đất nước ngày càng phồn vinh.
Trang - - 95
KẾT LUẬN
Hiện nay công nghệ tự động hóa đang được rất nhiều nhà khoa học quan tâm
nghiên cứu cũng như nhu cầu sử dụng các sản phẩm được tích hợp công nghệ tự
động hóa của người dân.
Luận văn đã trình bày được nhu cầu sử dụng các hệ thống điều khiển thông
minh trong các tòa nhà, giới thiệu về một số phân hệ được sử dụng trong tòa nhà
thông minh, những khái niệm về giao thức và chuẩn truyền thông sử dụng trong hệ
thống điều khiển các phân hệ của tòa nhà thông minh. Đặc biệt luận văn đã trình
bày việc thiết kế hệ thống điều khiển bật/ tắt đèn chiếu sáng trong tòa nhà cao tầng,
cụ thể như:
Thiết kế các mạch điện tử sử dụng vi điều khiển Atmega8 và
Atmega128 trong hệ thống.
Thiết lập giao tiếp theo chuẩn RS485 giữa các mạch điện tử.
Sử dụng phần mềm CodeVisionAVR để xây dựng phần mềm nhúng
cho các mạch.
Sử dụng cảm biến JS-20 Largo Pir.
Qua đề tài này, học viên mong muốn nắm bắt được nền tảng kiến thức về
lập trình cho vi điều khiển Atmega128, Atmega8 cũng như họ vi điều khiển AVR,
đồng thời nắm bắt được kỹ thuật thiết kế mạch điện tử để ứng dụng vào điều khiển
tự động hóa. Công nghệ mới luôn luôn phát triển không ngừng và có tính kế thừa,
vì vậy việc nghiên cứu, cập nhật kiến thức để làm chủ thiết bị hiện đại là hết sức
cần thiết.
Trang - - 96
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1]Nguyễn Thị Lan Hương (2003), Kỹ thuật cảm biến.
[2] Lê Trung Thắng (2007), Vi điều khiển AVR – ATmega 128, Đại học Khoa
Học Tự Nhiên TP. Hồ Chí Minh.
[3] PGS. TS. Thái Duy Thức, KS. Trịnh Quang Vinh (2009), Tổng quan về
vi điều khiển Atmega8, KHCN.
[4] Dương Minh Trí (1997), Sơ đồ chân linh kiện bán dẫn, KHKT.
[5] Trường Đại học kỹ thuật TP. HCM (2006), Giáo trình vi điều khiển.
[6]Trường Đại học Giao thông Vận tải (2001), Các loại cáp mạng.
[7]Trường ĐH Giao thông Vận tải (2001), Thiết kế môn học Mạng máy tính
và số liệu.
[8] Nguyễn Thúy Vân (1997), Kỹ thuật số, KHKT Hà Nội.
Tiếng Anh
[9] Gilbert Held (2003), Ethernet Networks: Design, Implementation,
Operation, Management, John Wiley & Sons, Ltd.
[10] Robert C, Elsenpeter Toby J. Velte (2003), Build Your Own Smart
Home
[11] F. H. Mitchell (1988), Introduction to Electronics Design, Printice Hall
[12] Kenvin Gilligan (2003), Honeywell Engineering Manual of Automatic
Control for Commercial Buildings
[13] John, Wiley (2005), RFID HandBook
Website:
[14]
[15]
kiem-nang-luong-trong-toa-nha.html
[16]
cu/2009/06/1194171/phat-trien-rfid-tai-viet-nam/
[17] www.atmel.com
Trang - - 97
PHỤ LỤC
Hình ảnh hệ thống được thiết kế
Trang - - 98
Hình 41: Hình ảnh của hệ thống
Phần mã nguồn các phần mềm nhúng điều khiển cho các mạch
1- Phần mã nguồn điều khiển cho mạch Master
Chip type : ATmega128
Program type : Application
Clock frequency : 16.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
#include
#include
#include "lcdcustom.c"
#include "sw.h"
#include "LcdCommand.h"
#include "acc.h"
#define TX_MODE 1
#define RX_MODE 0
Trang - - 99
#define RS485_N1_DIR PORTD.6
#define RS485_N0_DIR PORTD.7
#define MAX_SID 3 // Max slave IDs
#define QUERY_TIMER 1 // N
#define TIMER QUERY_TIMER*10 // N x 16ms
// Defines
#define FID_NO 1
#define A_LENGHT 13
unsigned char Dulieu_Floor[A_LENGHT]={'{','O','K',FID_NO,0,0,0,0,0,0,0,0,'}'};
unsigned int count=0;
unsigned char SID_NO; // IDs of Slave 0 -> 31
unsigned char FRAME_Length; // Length of receive frame
#define MAX_LENGTH 20 // Define max length of receive buffer
unsigned char R_Buffer[MAX_LENGTH]; // Receive buffer for Slave IDs data
union Long_Bytes
{
unsigned long DL_LONG;
unsigned char DL_BYTE[4];
} DULIEU;
bit DATA_Flag=FALSE; // Transmit to master when DATA ready
#define UDRE0 UCSR0A.5
#define RXC0 UCSR0A.7
// Declare your global variables here
extern unsigned char STATE_MACHINE;
extern flash byte coltech_0[8];
extern flash byte coltech_1[8];
extern flash byte coltech_2[8];
extern flash byte coltech_3[8];
extern flash byte coltech_4[8];
extern flash byte coltech_5[8];
void main(void)
{
// Declare your local variables here
unsigned char temp,temp2;
STATE_MACHINE= 'A';
Trang - - 100
Init_uC();
init_SW();
def_Coltech();
display_Coltech(0,0);
init_default_SuperAdmin();
// Enable RS485 RX mode
// RS485_N1_DIR = RX_MODE;
PORTE.2= 0 ;
while (1)
{
// Place your code here
switch(STATE_MACHINE)
{
case ACC_LOGIN_STATE: ACC_LOGIN_ACTION();
break;
case PASS_LOGIN_STATE: PASS_LOGIN_ACTION();
break;
case CHECK: CHECK_ACTION();
break;
case MONITER: MONITER_ACTION();
break;
}
};
}
//=======================================================
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include
void Init_uC()
{
Trang - - 101
#asm("cli")
PORTA=0xFF;
DDRA=0xFF;
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
PORTC=0xFF;
DDRC=0xFF;
// Port D initialization
PORTD=0xFF;
DDRD=0xFF;
// Port E initialization
PORTE=0xFF;
DDRE=0xCF;
// Port G initialization
PORTG=0x1F;
DDRG=0x1F;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x07;
TCNT0=0x82; // 5
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 62.500 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
Trang - - 102
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0xFF;
TCNT1L=0x9B;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
Trang - - 103
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x05;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: On
// INT4 Mode: Faling Edge
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x03;
EIMSK=0x10;
EIFR=0x10;
// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud rate: 38400
UCSR0A=0x00;
UCSR0B=0xD8;
Trang - - 104
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x19;
// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud rate: 38400
UCSR1A=0x00;
UCSR1B=0xD8;
UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=0x19;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;
ETIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(20);
// Global enable interrupts
#asm("sei")
}
//==========================================================
// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
To_SLAVE();
}
//==========================================================
Trang - - 105
// Interrupt to get slave data
// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
static bit FRAME_flag = FALSE;
static unsigned char byte_no = 0;
unsigned char c;
c=UDR0;
if(c=='{')
{
byte_no=0;
FRAME_flag=TRUE;
}
if(FRAME_flag)
{
R_Buffer[byte_no]=c;
if(c=='}')
{
FRAME_flag=FALSE;
if((R_Buffer[1]=='O') & (R_Buffer[2]=='K'))
{
FRAME_Length=byte_no+1;
//RS485_DATA_ToSend(R_Buffer[3]);
DATA_Flag=TRUE;
}
}
else
{
byte_no++;
}
}
}
//==========================================================
#define CHECK_LENGTH 3
unsigned char Command;
Trang - - 106
const unsigned char CHECK_OK[CHECK_LENGTH]={'O','K',FID_NO};
// Interrupt to receive request
// USART1 Receiver interrupt service routine
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
static unsigned char byte_no = 0;
unsigned char c;
c = UDR1;
if(byte_no<CHECK_LENGTH)
{
if(c!=CHECK_OK[byte_no])
byte_no=0;
else
{
byte_no++;
}
}
else
{
Command=c;
byte_no=0;
if(Command=='?')
{
if(DATA_Flag)
To_MASTER();
}
}
}
//=======================================================
// Request slave data
#define Q_LENGHT 4
unsigned char QUESTION[Q_LENGHT]={'O','K',0xff,'?'};
void To_SLAVE()
{
static unsigned char byte_no = 0;
Trang - - 107
if(byte_no<Q_LENGHT)
{
RS485_N0_DIR = TX_MODE;
UDR0=QUESTION[byte_no];
byte_no++;
}
else
{
byte_no=0;
RS485_N0_DIR = RX_MODE;
}
}
//=========================================================
void Query_Slaves()
{
QUESTION[2]=SID_NO;
To_SLAVE();
// Inc Query Slave ID
SID_NO++;
if(SID_NO==MAX_SID)
SID_NO=0;
}
//=========================================================
void To_MASTER()
{
static unsigned char byte_no = 0;
if(byte_no<A_LENGHT)
{
RS485_N1_DIR = TX_MODE;
UDR1=Dulieu_Floor[byte_no];
byte_no++;
}
else
{
Trang - - 108
byte_no=0;
RS485_N1_DIR = RX_MODE;
// Reset data
Dulieu_Floor[11]=0;
Dulieu_Floor[10]=0;
Dulieu_Floor[9]=0;
Dulieu_Floor[8]=0;
Dulieu_Floor[7]=0;
Dulieu_Floor[6]=0;
Dulieu_Floor[5]=0;
Dulieu_Floor[4]=0;
DATA_Flag=FALSE;
}
}
//=========================================================
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
static unsigned int times = 0;
// Place your code here
TCNT1H=0xFF;
TCNT1L=0x9B;
times++;
if(times==TIMER)
{
times=0;
// Request slave data
Query_Slaves();
}
}
Các file đính kèm theo tài liệu này:
- LUẬN VĂN- NGHIÊN CỨU CÁC CHUẨN TRUYỀN THÔNG VÀ XÂY DỰNG MỘT ỨNG DỤNG CHO HỆ THỐNG GIÁM SÁT, ĐIỀU KHIỂN, ĐIỀU HÀNH TÒA NHÀ CAO TẦNG.pdf