Showing posts with label PIC. Show all posts
Showing posts with label PIC. Show all posts

Monday, April 20, 2015

Hệ thống đa tác vụ và thời gian thực với vi điều khiển Pic (phần 4)

Ví dụ 10.3 Đo điện áp và xuất đến cổng RS232
Trong ví dụ này, có nhiều phức tạp hơn hai ví dụ trước, điện áp đọc bằng cách sử dụng bộ chuyển đổi A/D gửi đến máy tính thông qua cổng nối tiếp. Ví dụ này sử dụng ba tác vụ: LiveGet_voltage, và To_RS232
Task Live chạy mỗi 20 ms, nhấp nháy đèn led kết nối đến port RD7 của vi điều khiển để báo rằng hệ thống đang hoạt động.

Hệ thống đa tác vụ và thời gian thực với vi điều khiển Pic (phần 3)

Ví dụ 10.1 - LEDs
Ví dụ đơn giản dựa trên RTOS, bốn LED đơn kết nối 4 chân thấp PORTB của vi điều khiển PIC18F452. Phần mềm bao gồm 4 tác vụ, mỗi tác vụ có nhiệm vụ điều khiển nhấp nháy một đèn led với tốc độ khác nhau
Tác vụ 1 , gọi task_B0, nhấp nháy led kết nối đến port RB0 tại tốc độ 250ms
Tác vụ 2 , gọi task_B1, nhấp nháy led kết nối đến port RB1 tại tốc độ 500ms
Tác vụ 3, gọi task_B2, nhấp nháy led kết nối đến port RB2 mỗi một giây
Tác vụ 4, gọi task_B3, nhấp nháy led kết nối đến port RB3 mỗi 2 giây
Hình 10.7 sơ đồ kết nối . Mạch sử dụng thạch anh 4 MHZ các led nối với chân RB0-RB3 thông qua điện trở hạn dòng 

Hệ thống đa tác vụ và thời gian thực với vi điều khiển Pic (phần 2)

Trong một hệ thống thời gian thực một tác vụ có thể rơi vào một trong các trạng thái sau đây (xem hình 10.6):
- Sẵn sàng để chạy.
Chạy.Bị chặn.
     Khi một tác vụ lúc đầu được tạo ra, nó thường ở trạng thái sẵn sàng để chạy  được nhập vào trong danh sách tác vụTừ trạng thái này, tùy thuộc vào các thuật toán lập lịch trình, nhiệm vụ có thể trở thànhmột nhiệm vụ đang chạy. Theo các điều kiện của lịch ưu tiên, nhiệm vụ sẽ chạy nếu nó  nhiệm vụ ưu tiên cao nhất trong hệ thống và không phải đợi một nguồn tài nguyên. Một nhiệm vụ chạy trở thành một nhiệm vụ chặn nếu nó cần một nguồn tài nguyên chưa có sẵn. Ví dụ, một tác vụ có thể cần dữ liệu từ một bộ chuyển đổi  A/D (bộ chuyển đổi từ tương tự sang số)  và bị chặn cho đến khi bộ chuyển đổi A/D hoàn tấtMột khi các nguồn tài nguyên có thể được truy suất, các nhiệm vụ bị chặn trở thành một nhiệm vụ chạy nếu nó là nhiệm vụ ưu tiên cao nhất trong hệ thống, nếu không nó chuyển sang trạng thái sẵn sàng.Chỉ một nhiệm vụ đang chạy có thể bị chặn. Một nhiệm vụ sẵn sàng chạy không thể bị chặn.
     
Khi một nhiệm vụ chuyển từ trạng thái này sang trạng thái khác, bộ vi xử lý lưu bối cảnh của nhiệm vụ đang chạy vào trong bộ nhớ, nạp bối cảnh nhiệm vụ mới từ bộ nhớ,  sau đó thực thi lệnh mới như yêu cầu.


Hệ thống đa tác vụ và thời gian thực với vi điều khiển Pic (Phần 1)

      Gần như tất cả các hệ thống dựa trên vi điều khiển đều thực hiện nhiều hơn một tác vụ. Ví dụ hệ thống giám sát nhiệt độ tạo ra ba tác vụ lặp lại trong một thời gian ngắn đó là:
Tác vụ 1: Đọc nhiệt độ
Tác vụ 2: Định dạng nhiệt độ
Tác vụ 3:  Hiển thị nhiệt độ

Sunday, January 18, 2015

Giao tiếp lcd chỉ với 1 dây tín hiệu

Thông thường, để giao tiếp với lcd ở chế độ 4-bit, ta cần sử dụng 7 chân của Vi Điều Khiển. Bằng cách sử dụng ic mở rộng chân ta có thể chỉ sử dụng 1 chân của Vi Điều Khiển để có thể giao tiếp với lcd.
Chương trình mẫu các bạn có thể download ở đây:

Friday, December 12, 2014

Đo nhiệt độ sử dụng nhiệt điện trở

 Đo nhiệt độ sử dụng nhiệt điện trở


Nhiệt điện trở (tiếng anh: Thermistor) là loại điện trở mà trở kháng của nó thay đổi một cách rõ rệt dưới tác dụng nhiệt, hơn hẳn so với các loại điện trở thông thường. Từ thermistor được kết hợp bởi từ themal (nhiệt) và resistor (điện trở). Nhiệt điện trở được ứng dụng rộng rãi trong việc hạn chế các dòng xung kích, làm cảm biến nhiệt.
Sử dụng Nhiệt điện trở ưu điểm hơn hẳn các loại cảm biến thường dùng như thời gian đáp ứng nhanh, có thể đo ở nhiệt độ cao, và rất rẻ ....

Phương trình phụ thuộc nhiệt độ và điện trở của Nhiệt điện trở:

[​IMG] 

Trong đó: T, T0 tính theo độ Kevin.
R0 là điện trở khi nhiệt độ T0 = 25 độ C, phụ thuộc loại Nhiệt điện trở.
B là hệ số phụ thuộc vào loại Nhiệt điện trở.
Ở đây chúng ta sẽ sử dụng ADC để tìm giá trị điện trở của nhiệt điện trở, rồi từ đó dễ dàng tìm ra được nhiệt độ theo công thức.

Sơ đồ kết nối vi điều khiển:

[​IMG] 
Hình ảnh thực tế: (Trời hơi lạnh )
[​IMG]

Mình sử dụng Nhiệt điện trở có R0=10k, hệ số B=3470.

Sau đây là code sử dụng chip 16f887:
#include <main.h>
#include <math.h>
#define LCD_ENABLE_PIN PIN_C2
#define LCD_RS_PIN PIN_C0
#define LCD_RW_PIN PIN_C1
#define LCD_DATA4 PIN_C3
#define LCD_DATA5 PIN_C4
#define LCD_DATA6 PIN_C5
#define LCD_DATA7 PIN_C6
#include <lcd.c>

float value,A,C,T;
int16 R=4700,B=3470,R0=10000;


void main()
{
setup_adc (ADC_CLOCK_INTERNAL);
setup_adc_ports (sAN0);
delay_us (20);
set_adc_channel (0);

lcd_init();
printf(lcd_putc,"ready....");
delay_ms(500);

unsigned char mychar[8] = {12, 18, 18, 12, 0, 0, 0, 0};
lcd_set_cgram_char(1,mychar);

while(TRUE)
{

value = read_adc ();
delay_us (20);
float RT=(value*R)/(1024 - value);
A=log(RT/R0);
C=(A/B) + 0.003355704698; // 1/(25+273)
T=(1/C) - 273;

printf(lcd_putc,"\fT=%lf",T);
lcd_putc(1);
lcd_putc("C");
delay_ms(100);
}
}
File "main.h":
#include <16F887.h>
#device adc=10
#device *=16

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=20000000)
Cám ơn các bạn đã theo dõi!

Tác giả : Ngô Thiện Đức

Version 2: download


inmoov finger voice test

Inmoov finger voice test