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 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, March 22, 2015

Hướng dẫn sử dụng module bluetooth HC06

Hướng dẫn sử dụng module bluetooth HC06 


Module bluetooth được tích hợp trên board cho phép bạn sử dụng nguồn  từ 3.5V đến 6V cung cấp cho board mà không cần lo lắng về chênh lệch điện áp 3V - 5V gây hỏng board.

Sunday, March 15, 2015

Hướng dẫn Dowload avr studio từ atmel miễn phí

Hướng dẫn Dowload avr studio từ atmel miễn phí

Đầu tiên các bạn vào trang web :


Kéo xuống dưới sẽ thấy nhiều phiên bản AVR Studio  và Atmel Studio (phiên bạn 6.0 trở lên được đặt tên là Atmel Studio )

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:

Sunday, January 11, 2015

Stm8 - Input


Để giao tiếp với nút nhấn, chúng ta sử dụng hàm:
GPIO_ReadInputPin(GPIOx, GPIO_PIN_x);
Trong đó GPIOx là port cần đọc tín hiệu( A, B, C, D), GPIO_PIN_x là chân có số thứ tự x của port tương ứng.
 Sau đây là chương trình mẫu

Stm8 - 7seg

     Vi điều khiển giao tiếp với led 7 đoạn thường không phải là vấn đề quá phức tạp. Tuy nhiên đối với chip stm8s003f3p6 thì mọi chuyện lại khác. Chip này không có port nào liên tục đủ 8 chân để xuất dữ liệu điều khiển led 7 đoạn.


      Để giải quyết vấn đề này, ở đây chúng ta sẽ dụng cùng lúc2 port C và D để thực hiện xuất mã led, chương trình con:
void hien_thi(unsigned char data)
{
  GPIO_Write(GPIOC,(maled[data])<<3); //dich du lieu sang ben trai 3bit de lay 5 bit thap
  GPIO_Write(GPIOD,((maled[data])>>4)); //dich du lieu sang ben phai 4bit de lay 3 bit cao
}
  Vấn đề đã được giải quyết, sau đây là chương trình đầy đủ:
 #include"stm8s_conf.h" // goi thu vien config
//***** Dinh nghi cho cac chan*****/
#define led1 (GPIO_PIN_2)
#define led2 (GPIO_PIN_3)
#define led3 (GPIO_PIN_1)
#define led4 (GPIO_PIN_5)
const unsigned long delay=16000000;
//***** Khai bao bien *****//
unsigned char maled[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int i,j;
//***** Ham tao thoi gian tre *****//
void delay_ms(unsigned int timer)
{
  while(timer--)
    {
      for(int count=0; count<(delay/1000000);count++);
    }
}
void delay_us(unsigned int timer)
{
  while(timer--);
}
//***** Ham hien thi cho led 7seg *****//
void hien_thi(unsigned char data)
{
  GPIO_Write(GPIOC,(maled[data])<<3); //dich du lieu sang ben trai 3bit de lay 5 bit thap
  GPIO_Write(GPIOD,((maled[data])>>4)); //dich du lieu sang ben phai 4bit de lay 3 bit cao
}
//***** Ham cau hinh xung clock cho he thong *****//
static void CLK_Config(void)
{
    CLK_DeInit();
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);      //f_Master = HSI/1 = 16MHz
    CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);            //f_CPU = f_Master/1 = 16MHz
    while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)!=SET);     //wait until HSI ready
}
//***** Ham chinh *****//
int main( void )
{
  CLK_Config();
  GPIO_DeInit(GPIOD);
  GPIO_DeInit(GPIOC);
  GPIO_DeInit(GPIOA);
  GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(GPIOA,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);

  GPIO_WriteHigh(GPIOA,led1);
  GPIO_WriteHigh(GPIOA,led2);
  GPIO_WriteHigh(GPIOA,led3);
  GPIO_WriteHigh(GPIOB,led4);
  while(1)
  {
        for(i=0;i<=9999;i++)
          {
            for(j=0;j<=100;j++)
            {
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteLow(GPIOA,led1);
              hien_thi(i/1000);
              delay_ms(1);
              GPIO_WriteHigh(GPIOA,led1);
           
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteLow(GPIOA,led2);
              hien_thi((i%1000)/100);
              delay_ms(1);
              GPIO_WriteHigh(GPIOA,led2);
           
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteHigh(GPIOB,led4);
              GPIO_WriteLow(GPIOA,led3);
              hien_thi(((i%1000)%100)/10);
              delay_ms(1);
              GPIO_WriteHigh(GPIOA,led3);
           
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteLow(GPIOB,led4);
              hien_thi(((i%10000)%100)%10);
              delay_ms(1);
              GPIO_WriteHigh(GPIOB,led4);
            }
          }
  }
}

inmoov finger voice test

Inmoov finger voice test