Trong kiến trúc Harvard, bộ nhớ dữ liệu và bộ nhớ chương trình nằm riêng biệt, do đó CPUcó thể làm việc trực tiếp với cả hai bộ nhớ dữ liệu và bộ nhớ chương trình cùng một lúc, làm cho
TRƢỜNG ĐẠI HỌC THỦY LỢI Khoa Điện – Điện tử Bộ môn: KTĐK&TĐH BÀI GIẢNG THỰC HÀNH VI XỬ LÝ Giảng viên biên soạn: TS Ngô Quang Vĩ Hà Nội: 2/2021 CHƢƠNG TÌM HIỂU KIT dsPIC Cấu hình phần cứng dsPIC Ngơn ngữ lập trình Timer Ngắt Truyền thông VI ĐIỀU KHIỂN PIC họ vi điều khiển RISC sản xuất công ty Microchip Technology Dòng PIC PIC1650 phát triển Microelectronics Division thuộc General Instrument PIC bắt nguồn chữ viết tắt "Programmable Intelligent Computer" (Máy tính khả trình thơng minh) sản phẩm hãng General Instrument đặt cho dòng sản phẩm họ PIC1650 CP1600 CPU tốt, lại hoạt động xuất nhập, PIC 8-bit phát triển vào khoảng năm 1975 để hỗ trợ hoạt động xuất nhập cho CP1600 PIC sử dụng microcode đơn giản đặt ROM, mặc dù, cụm từ RISC chưa sử dụng thời bây giờ, PIC thực vi điều khiển với kiến trúc RISC, chạy lệnh chu kỳ máy (4 chu kỳ dao động) Năm 1985 General Instrument bán phận vi điện tử họ, chủ sở hữu hủy bỏ hầu hết dự án - lúc lỗi thời PIC bổ sung EEPROM để tạo thành điều khiển vào khả trình Ngày nhiều dòng PIC xuất xưởng với hàng loạt module ngoại vi tích hợp sẵn (như USART, PWM, ADC ), với nhớ chương trình từ 512 Word đến 32K Word Hiện có nhiều dịng PIC có nhiều khác biệt phần cứng, điểm qua vài nét sau: 8/16 bit CPU, xây dựng theo kiến trúc Harvard có sửa đổi FLASH ROM tuỳ chọn từ 256 byte đến 256 Kbyte Các cổng Xuất/Nhập (I/O ports) (mức logic thường từ 0V đến 5.5V, ứng với logic logic 1) 8/16 Bit Timer Công nghệ Nanowatt Các chuẩn Giao Tiếp Ngoại vi nối tiếp USART, AUSART, EUSART Bộ chuyển đổi ADC Analog-to-digital converters, 10/12 bit Bộ so sánh điện áp (Voltage Comparators) Các module Capture/Compare/PWM LCD MSSP Peripheral dùng cho giao tiếp I²C, SPI, I²S Bộ nhớ nội EEPROM - ghi/xố lên tới triệu lần FLASH (dùng cho nhớ chương trình) ghi/xóa 10.000 lần (tiêu biểu) Module Điều khiển động cơ, đọc encoder Hỗ trợ giao tiếp USB Hỗ trợ điều khiển Ethernet Hỗ trợ giao tiếp CAN Hỗ trợ giao tiếp LIN Hỗ trợ giao tiếp IRDA Một số dịng có tích hợp RF (PIC16F639, rfPIC) KEELOQ Mã hoá giải mã DSP tính xử lý tín hiệu số (dsPIC) Các họ dòng vi xử lý PIC: Vi điều khiển 8-bit PIC10 PIC12 PIC14 PIC16 PIC17 PIC18 Vi điều khiển 16-bit PIC24 Bộ điều khiển xử lý tín hiệu số 16-bit (dsPIC) dsPIC30 Setup_ADC ( mode ); Không trả giá trị, dùng xác định cách thức hoạt động biến đổi ADC Tham số mode tùy thuộc file thiết bị*.h có tên tướng ứng tên chip bạn dùng, nằm thư mục DEVICES CCS ADC_OFF % tắt hoạt động ADC (tiết kiệm điện, dành cho chân hoạt động khác) ADC_CLOCK_INTERNAL % thời gian lấy mẫu xung xung clock IC (mất 2-6us thường chung cho chip) ADC_CLOCK_DIV_2 thời gian lấy mẫu xung clock/2 (mất 0.4 us thạch anh 20MHZ) ADC_CLOCK_DIV_8 ; thời gian lấy mẫu xung clock/8 (1.6 us) ADC_CLOCK_DIV_32 ; thời gian lấy mẫu xung clock/32 (6.4us) Bài 8: Lập trình ADC hai chân RB9 RB11, xuất liệu ADC LCD #include #device *=16 ADC=12 #include #fuses HS,NOWDT,NOPROTECT #use delay(clock=10000000) #define LCD_ENABLE_PIN PIN_B6 #define LCD_RS_PIN PIN_B4 #define LCD_RW_PIN PIN_B5 #define LCD_DATA4 PIN_D4 #define LCD_DATA5 PIN_D5 #define LCD_DATA6 PIN_D6 #define LCD_DATA7 PIN_D7 #include float nhietdo,tocdo;//khai bao bien void ADC() { set_adc_channel(9); delay_us(100); tocdo=read_adc()*0.1953; lcd_gotoxy(1,2); printf(lcd_putc,"TOCDO = %f",tocdo); lcd_gotoxy(14,2); printf(lcd_putc,"V/P"); delay_us(100); printf("%.2f",tocdo); printf("D"); set_adc_channel(11); delay_us(100); } nhietdo=read_adc()*1.5625; lcd_gotoxy(1,1); printf(lcd_putc,"NHIETDO=%f",nhietdo); lcd_gotoxy(14,1); printf(lcd_putc,"DO"); delay_us(100); printf("%.2f",nhietdo); printf("n"); Chƣơng Lập trình truyền thơng kết nối máy tính Chương giúp bạn viết chương trình có sử dụng giao tiếp PC Điều cần thiết bạn muốn VĐK hoạt động truyền liệu cho PC xử lý, nhận giá trị từ PC để xử lý điều khiển (dùng PC điều khiển động nhiệt độ, hay biến PC thành dụng cụ đo đại lượng điện…) Lập trình thơng qua ngơn ngữ C dùng CCS, cung cấp nhiều hàm phục vụ cho giao tiếp qua RS232 (cổng COM) vô số hàm xử lý chuỗi Yếu tố quan trọng VĐK biết PC truyền data → lập trình bắt tay phần mềm hay đơn giản dùng ngắt CHUYỂN MỨC LOGIC BẰNG MAX232 USB to Serial Port Trên Laptop khơng có serial port mà có cổng USB Dùng cáp chuyển đổi từ USB sang Serial Port Khi sử dụng cáp chuyển đổi tốc độ truyền nhận bị giảm Đầu điện áp cáp giữ theo chuẩn RS232 Sơ đồ mạch điện IC MAX232 chuẩn giao tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều hai thiết bị, chiều dài kết nối nằm khoảng 12.5m đến 25.4m Ưu điểm có khả chống nhiễu cao MAX232 sử dụng tín hiệu điện áp chênh lệch dây dẫn đất Chân 13, 14 IC nối với chân COM FMALE để giao tiếp với máy tính Chân 11, 12 IC nối tương ứng với RXD TXD vi điều khiển Để sử dụng giao thức này, ta phải khai báo chương trình: #use delay (clock = 10000000)// VDDK dùng OSC 20MHz #use rs232 (baud=9600, parity=n,xmit=pin_F5 , rcv=pin_F4, bits=8) //baud = 9600, không chẵn lẻ, chân truyền F5, chân nhận F4, bit) KHAI BÁO TRÊN MÁY TÍNH Khai báo truyền thơng rs232 #include #FUSES NOWDT //No Watch Dog Timer #FUSES CKSFSM //Clock Switching is enabled, fail Safe clock monitor is enabled #FUSES NOPUT //No Power Up Timer #FUSES NOBROWNOUT //No brownout reset #device ICSP=1 #use delay(crystal=10000000) #use rs232(UART2, baud=9600, stream=UART_PORT1) Bài 9: Điều khiển đọng chiều qua giao diện LabVIEW #include #fuses HS,NOWDT,NOPROTECT #use delay(clock=10000000) #use rs232(UART2, baud=9600, stream=UART_PORT1) #INT_RDA2 //truyen tu may tinh xuong void Receive_isr() { char pwm; set_pwm_duty(1, 0); { pwm = getch(); set_pwm_duty(1,pwm); delay_us(200); } } void main() { enable_interrupts(INT_RDA2); enable_interrupts(GLOBAL); setup_timer2(TMR_INTERNAL | TMR_DIV_BY_1, 2499); setup_compare(1, COMPARE_PWM | COMPARE_TIMER2); while(true) { } } GIAO DIỆN LABVIEW Bài 10: Truyền nhận liệu bit thông qua cổng RS232 kết nối với giao diện LabVIEW #include // #INT_RDA2 void Receive_isr() { char c; c = getch(); output_d(c); } void main() { unsigned int pa,pc,key; //UART enable_interrupts(INT_RDA2); enable_interrupts(GLOBAL); output_d(0); while(true) { pa=input_a(); pc=input_c(); key=((pa>>12)&0x0000f)|((pc