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 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 


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// SIMPLE RTOS EXAMPLE
// ----------------------------------
//
// This is a simple RTOS example. 4 LEDs are connected to lower half of
// PORTB of a PIC18F452 microcontroller. The program consists of 4
// tasks:
//
// Task task_B0 flashes the LED connected to port RB0 every 250ms.
// Task task_B1 flashes the LED connected to port RB1 every 500ms.
// Task task_B2 flashes the LED connected to port RB2 every second
// Task task_B3 flashes the LED connected to port RB3 every 2 seconds.
//
// The microcontroller is operated from a 4MHz crystal
//
// Programmer: Dogan Ibrahim
// Date: September, 2007
// File: RTOS1.C
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "C:\NEWNES\PROGRAMS\rtos.h"
#use delay (clock=4000000)
//
// Define which timer to use and minor_cycle for RTOS
//
#use rtos(timer=0, minor_cycle=10ms)
//
// Declare TASK 1 - called every 250ms
//
#task(rate=250ms, max=10ms)
void task_B0()
{
output_toggle(PIN_B0); // Toggle RB0
}
//
// Declare TASK 2 - called every 500ms
//
#task(rate=500ms, max=10ms)
void task_B1()
{
output_toggle(PIN_B1); // Toggle RB1
}
//
// Declare TASK 3 - called every second
//
#task(rate=1s, max=10ms)
void task_B2()
{
output_toggle(PIN_B2); // Toggle RB2
}
//
// Declare TASK 4 - called every 2 seconds
//
#task(rate=2s, max=10ms)
void task_B3()
{
output_toggle(PIN_B3); // Toggle RB3
}
//
// Start of MAIN program
//
void main()
{
set_tris_b(0); // Configure PORTB as outputs
rtos_run(); // Start RTOS
}
 Ví dụ 10.3 Bộ tạo số ngẫu nhiên:
Trong ví dụ RTOS hơi phức tạp này, một số ngẫu nhiên trong khoảng 0 và 255 được tạo. 8 led đơn kết nối đến portB của pic 18f452. Nút nhấn kết nối đến chân RD0 và 1 led đơn kết nối đến chân RD7
Có ba task được sử dụng trong ví dụ này: Live, Generator,  Display
Task Live chạy sau mỗi 200 ms và nhấp nháy đèn LED kết nối đến chân RD7 để báo rằng hệ thống đang hoạt động.
Task Generator tăng biến từ 0 đến 255 và kiểm trạng thái của nút nhấn. Khi nút nhấn được nhấn giá trị hiện tại của bộ đếm được gửi đến task display sử dụng hàng đợi thông điệp  
Task Display đọc số từ hàng đợi thông điệp và gửi byte nhận đến PORTB. Do đó khi nút nhấn được nhấn thì trạng thái các led kết nối với PORTB thay đổi tương ứng với số ngẫu nhiên.
Hình 10.9 Sơ đồ khối
Hình 10.10 sơ đồ mạch  
Timer 0 được sử dụng như là bộ định thời RTOS , và minor_cycle được thiết lập là 1s. Chương trình bao gồm 3 task
Task Live chạy sau mỗi 200 ms và nhấp nháy đèn LED kết nối đến chân RD7 để báo rằng hệ thống đang hoạt động.
Task Generator chạy mỗi một millisecond và gia tăng biến tên count. Khi nút nhấn được nhấn, Pin 0 của PORTD (RD0) kéo xuống mức thấp. Tại thời điểm này , giá trị hiện tại của biến count được gửi đến tác vụDisplay bằng cách gọi hàm rtos_msg_send(display, count) nơi Display là tên của tác vụ nơi thông điệp được gửi và Count là biến được gửi.
Task Display chạy sau mỗi 10 ms tác vụ này kiểm tra có thông điệp trong hàng đợi không nếu có thông điệp được trích xuất bằng cách gọi hàm rtos_msg_read(), và byte đọc khi đó được đưa đến port PORTB, do đó các led kết nối với PORTB hiển thị theo giá trị nhị phân của giá trị biến count khi phím được nhấn. Hàm đợi thông điệp nên kiểm tra bằng hàm rtos_msg_poll(). Nếu cố gắng đọc hàm đợi khi không có bất cứ byte nao trong hàm đợi có thể gây dừng chương trình
Đoạn chương trình:
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// SIMPLE RTOS EXAMPLE - RANDOM NUMBER GENERATOR
// ------------------------------------------------------------------------------------
//
// This is a simple RTOS example. 8 LEDs are connected to PORTB
// of a PIC18F452 microcontroller. Also, a push-button switch is
// connected to port RC0 of PORTC, and an LED is connected to port
// RC7 of the microcontroller. The push-button switch is normally at logic 1.
//
// The program consists of 3 tasks called "Generator", "Display", and "Live".
//
// Task "Generator" runs in a loop and increments a counter from 0 to 255.
// This task also checks the state of the push-button switch. When the
// push-button switch is pressed, the task sends the value of the count to the
// "Display" task using messaging passing mechanism. The “Display” task
// receives the value of count and displays it on the PORTB LEDs.
//
// Task "Live" flashes the LED connected to port RC7 at a rate of 250ms.
// This task is used to indicate that the system is working and is ready for
// the user to press the push-button.
//
// The microcontroller is operated from a 4MHz crystal
//
// Programmer: Dogan Ibrahim
// Date: September, 2007
// File: RTOS2.C
//
//////////////////////////////////////////////////////////////////////////////////
#include "C:\NEWNES\PROGRAMS\rtos.h"
#use delay (clock=4000000)
int count;
//
// Define which timer to use and minor_cycle for RTOS
//
#use rtos(timer=0, minor_cycle=1ms)
//
// Declare TASK "Live" - called every 200ms
// This task flashes the LED on port RC7
//
#task(rate=200ms, max=1ms)
void Live()
{
output_toggle(PIN_D7);
}
//
// Declare TASK "Display" - called every 10ms
//
#task(rate=10ms, max=1ms, queue=1)
void Display()
{
if(rtos_msg_poll() > 0) // Is there a message ?
{
output_b(rtos_msg_read()); // Send to PORTB
}
}
//
// Declare TASK "Generator" - called every millisecond
//
#task(rate=1ms, max=1ms)
void Generator()
{
count++; // Increment count
if(input(PIN_D0) == 0) // Switch pressed ?
{
rtos_msg_send(Display,count); // send a message
}
}
//
// Start of MAIN program
//
void main()
{
set_tris_b(0); // Configure PORTB as outputs
set_tris_d(1); // RD0=input, RD7=output
rtos_run(); // Start RTOS
}

No comments:

Post a Comment

inmoov finger voice test

Inmoov finger voice test