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

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.

pdf108 trang | Chia sẻ: lylyngoc | Lượt xem: 2450 | Lượt tải: 0download
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:

  • pdfLUẬ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
Luận văn liên quan