Showing posts with label Vi điều khiển. Show all posts
Showing posts with label Vi điều khiển. Show all posts

Thursday, February 25, 2016

Hướng dẫn làm đồng hồ điện tử số bằng Led 7 đoạn và 89S52


Rảnh rỗi sinh nông nổi chế 1 cái đồng hồ treo tường nho nhỏ chia sẻ với anh em yêu điện tử .
mạch này tôi đã vẽ lại PCB cho đỡ phải câu dây quá nhiều
Đầu tiên show hàng tẹo chứ nhỉ :



List linh kiên gồm có

3 con led 7 đoạn đôi loại Anot chung

6 tran sistor A1015

Pin 3V và đế pin

1 IC Ds1307

1 Thạch anh 12Mhz

1 thạch anh 32,768khz

Trở 1k : từ R1 -> R14

trở R15 10k

trở R16 và R17 4.7k loại trở dán 0805

IC 7805 1 con

tụ C1 và C3 100u 2 con

tụ C7 C8 22p 2 em

trở thanh 10k 1 con

vi điều khiển 89S52 1 con

Tổng thiệt hại khoảng 80k


Chỗ khoanh tròn màu đỏ trên hình vẽ là 2 con trở dán loại 0805
Download file PCB và file hex tại đây

p thêm cả code cho các bạn tham khảo viết bẳng trình biên dịch SDCC 
đã fix lỗi.
IC 89S52 cần được "nạp đạn" là file hex trước khi chạy nhé

Nguồn điện cung cấp

Mạch đồng hồ này sử dụng điệ áp 1 chiều từ 9 -> 12V.
Các bạn có thể dễ dàng làm được với 1 củ biến áp nhỏ với dòng tầm 1A. và 1 diot cầu

2 chân giữa nối với 2 đầu thứ cấp 9V hoặc 12V của biến áp . Còn 2 chân kia là nguồn đưa vào mạch đồng hồ.

Hướng dẫn cài đặt đồng hồ :

Sau khi làm sau và cắm điện " 1 chiều 12V " . Các bạn sẽ thấy mạch hiện thị số 00-00-80. Ok. như vậy là coi như các bạn đã hoàn thành bước đầu tiên.

Các bạn ấn nút "Set" nút ngoài bên trái để cài đặt giờ, phút, và giây.Giờ và phút thì không có gì để nói. Riêng phần giây thì các bạn ấn nút "Dow" là nút ngoài cùng bên phải để lùi "giây" lại nhỏ hơn 60 , chẳng han giây = 59 chẳng hạn.Sau đó ân "Set" lần nữa để chọn các chế độ 12h hoặc 24h.Ấn "Set" lần nữa để đồng hồ chạy.

Các bạn ùng tham gia nhóm Face với tôi nhé https://www.facebook.com/groups/dientuungdung123/

1 vài sản phẩm đồng hồ của các bạn trên Facebook

  Tác phẩm của Minh châu https://www.facebook.com/uchiha.HN

Tác phẩm của Dương

Wednesday, February 17, 2016

Cách sử dụng Arduino như 1 board lập trình ATmega328 .


   Arduino là 1 board lập trình vi điều khiển Atmega328. Lập trình trực tiếp trên IDE và nạp chương trình luôn trên đó là rất nhanh.
   Nhưng có 1 bất cập đó là khi bạn chỉ muốn coi nó là 1 board AVR thì làm thế nào nạp file hex được biên dịch bằng WinAVR hoặc codeVision đây ??????

Điều đó đã được giải quyết với phần mềm Xloader V1.0

Chỉ cần chọn Cổng Com và file hex sau đó ấn Upload là xong.
Download phần mềm tại : http://xloader.russemotto.com/


Monday, February 1, 2016

Cách lập trình vào I/O ra ATmega với WinAVR giống với VodeVision

WinAVR là 1 trình biên dịch C cho Atmega. Nó là 1 phần mềm miễn phí hiện đang sử dụng rộng rãi trên toàn thế giới mà điển hình đó là Arduino.

Như các bạn đã biết về cơ bản thì WinAVR và CodeVision là giống nhau. Nhưng chỉ có 1 vài cái hơi khác đó là về cách sử dụng các cổng vào ra của Atmega.

Với CodeVision thì điều đó thật dễ dàng.
Ví dụ cổng PB3 được cấu hình là cổng ra thì muốn có tín hiệu "1" thì chúng ta chỉ cần viết là PORTB.3=1 là xong .
Hoặc cổng PD1 được cấu hỉnh là cổng đầu vào thì để đọc được tín hiệu trên chân này chúng ta chỉ cần if(PIND.1==0) là xong.

Với WinAVR thì điều đó hơi phức tạp hơn 1 chút xíu
vẫn ví dụ trên cổng PB3 được cấu hình là cổng ra thì muốn có tín hiệu "1" thì chúng ta cần phải viết:
PORTB|=1<<PB3;
Câu lệnh này chả có gì là khó hiểu nó có nghĩa là PORTB=PORTB|(1<<PB3). Với các bạn hiểu và nắm vững C nó là "muỗi"
Và để xuất tín hiệu "0" thì chúng ta dùng dòng lệnh:
PORTB&=~(1<<PB3);
Với lệnh đọc tín hiệu trên chân PD1 chẳng hạn chúng ta dùng lệnh
if(!(PIND&(1<<PD1)))
Câu lệnh này tức là nếu PD1 về "0) thì PIND&(1<<PD1)=0 sau lệnh đảo sẽ =1 . dòng lệnh if sẽ được thực hiện.
Điều này đòi hỏi bạn phải thành thạo các lệnh logic và nắm vững kỹ năng sử dụng byte và bit.

Để lập trình WinAVR cũng dễ dàng như vậy tôi đã viết 1 file port.h hỗ trợ lập trình WinAVR như Codevision
Các bạn có thể download nó tại :


Cách sử dụng :

Chúng ta làm quen nó qua 1 ví dụ:

Chân PB3 là chân đầu ra, và chân PD1 là chân đầu vào. ấn nút bấm tại chân PD1 thì đèn led tại chân PB3 sáng , nhả tay ra thì đèn tối.

Code :
#include<avr/io.h>
#include "port.h"
void main()
{
DDRB=0x08;//cong PB la dau ra
PORTD=0x02;// gan tro treo cho cong PD1 la dau vao
while(1)
 {
if(_PIND.b1==0)
_PORTB.b3=1;
else
_PORTB.b3=0;
 }
}
Về cơ bản khi sử dụng thì các bạn dùng nó như với Codevision nhưng thêm dấu "_" và "b3".
Toàn bộ mã C và file hex các bạn download tại

Saturday, January 23, 2016

Đồng hồ để bàn đơn giản với ATmega8


Rảnh ở nhà, kiếm trong hòm đồ còn con atmega8 lôi ra làm cái đồng hồ để bàn chơi chia sẻ với anh em design chơi.
Sơ đồ mạch :
Linh kiện cần mua:
1- Atmega8 1 con
2- trở 120 ôm , trở 10k loại dán 0805.
3- nút bấm 3 cái
4- ds1307 1 con
5- thạch anh 32.768kHz 1con
4- tụ 100u 3 con
5- tụ 10u 1 con
6- tụ 22p 2 con
7- led đồng hồ 4 số 1 cái loại 0.28inch anot chung
 Lúc đâu tôi định mua loại 0.56 inch nhưng họ hết hàng chỉ còn loại 0.28 inch . thôi thì lấy tạm vậy.
8- IC 7805
9- Jac DC loại 3.5mm nhỏ

II- mạch nguyên lý hoàn chỉnh 

Những chỗ đi dây màu đỏ là đoạn câu dây.
fusebit ở tần số 8Mhz nội

Cách sử dụng:
Nút J3 là nút Setup. khi bắt đầu sử dụng thì bạn ấn nút Setup. đèn phút sẽ nhấp nháy sử dụng các phím J1 và J2 để tăng giảm thời gian.
Ấn J3 lần nữa thì đến đèn Giờ sẽ nhấp nháy. tương tự như trên.
Ấn J3 lần nữa để kết thúc . và đồng hồ bắt đầu chạy

PCB và code (C+ file hex)
các bạn download

Mọi sự trợ giúp xin đăng lên Group

Friday, January 8, 2016

Sử dụng board Arduino như 1 mạch nạp ISP.




   Chúng ta thường dùng board arduino như là 1 thiết bị lập trình thông thường. Nhưng cũng có khi để làm 1 mạch khác nhưng vẫn sử dụng code arduino vậy là chúng ta cần phải mua 1 mạch nạp nữa ư?????
Điều đó là không cần thiết vì board Arduino đã là một mạch nạp hoàn chỉnh với đầy đủ các tính năng như fusebit, nạp file hex với tốc độ cao.
Cách làm như sau :
1-   Cấu hình board Arduino như 1 mạch nạp
Mở chương trình Arduino IDE và chọn như hình vẽ :


Các bạn upload file đó xuống board Arduino


Sau khi hoàn thành bước này thì board Arduino đã là 1 mạch nạp hoàn chỉnh.

2-   Kết nối “mạch nạp” Arduino as ISP với vi điều khiển AVR cần nạp

Chân vi điều khiển AVR
Board Arduino
Reset
10
MOSI
11
MISO
12
SCK
13

3-   Chương trình nạp avrdude
Avrdude là chương trình nạp đi kèm với arduino. Nó là 1 chương trình thuộc dạng dòng lệnh. Vì vậy có thể hơi khó sử dụng với 1 số bạn. Nhưng nếu dùng quen bạn sẽ thấy rằng nó là 1 chương trình rất tuyệt vời.
Cú pháp làm việc :
Vào Start menu và gõ "cmd" .
Các bạn dùng lệnh “cd” để di chuyển đến folder chứa file hex cần nạp.
-       Cách fuse bit
Avrdude –c avrisp –P COM27 –b 19200 –p atmega8 –e –U lfuse:w:0xef:m  hfuse:w:0xc9:m
Đây là cách fuse bit
-c : đây là tham số khai báo tên mạch nạp . như ví dụ trên mạch nạp là avrisp
-P : là tham số khai báo tên cổng COM kết nối với arduino .
-b : là tham số khai báo tốc độ baund của cổng Com
-p: là tên của chíp vi điều khiển cần nạp .vd : atmega8, atmega48, atmega328
-e : là tham số xóa chíp.
-U : là tham số làm việc với chip
Lfuse:w:0xef:m đây là cách ghi giá trị vào LOW FUSE
Hfuse:w:0xC9:m là cách ghi giá trị vào HIGH FUSE        
Cách nạp chương trình
-       Cách nạp chương trình
Avrdude –c avrisp –P COM27 –b 19200 –p atmega8 –e –U flash:w:main.hex
ở đây –U flash:w:main.hex nghĩa là ghi file main.hex vào vi điều khiển.

Wednesday, November 25, 2015

Khóa học lập trình vi điều khiển


Trong tuần này mình sẽ tổ chức dạy học Lập Trình Tại Hà Nội
Bạn nào có nhu cầu đăng ký học thì liên hệ với mình nhé
Đến với khóa học bạn sẽ được hướng dẫn tận tình và chi tiết trên mạch và thiết bị thật.

Tất cả các học viên đều được hướng dẫn tận tình cho đến khi làm được mới thôi với lớp học chỉ tối đa 5 học viên
Sau khóa học:
       >> Học viên sẽ thu được những kiến thức căn bản về  kỹ thuật vi xử lý, vi điều khiển. Và đặc biệt là lắm chắc các kiến thức cơ bản liên quan đến vi điều khiển 
     >> Tự tay xây dựng được các project liên quan đến vi điều khiển 
          >> Thành thạo ứng dụng lập trình C cơ bản vào từng project.
Đề cương bài giảng
HƯớng dẫn lập trình C cơ bản (khoảng 1 buổi) (Nếu các bạn đã biết thì có thể lướt qua)



Hướng dẫn lập trình board vi điều khiển  (7 buổi)

Bài 1: Làm quen với vi điều khiển  

·         Clock của hệ thống

·         Lập trình với chức năng ouput, điểu khiển module led đơn



Bài 2: Lập trình với chức năng input và ouput



·         Lập trình input, đọc tín hiệu từ module phím bấm



·         Lập trình ouput, quét led 7 thanh

Bài 3: Giới thiệu về ngắt, lập trình điều khiển ngắt ngoài

·         Ngắt: biết cấu hình và cơ chế xử lý ngắt

·         Thực hành trên kit arduino với nút bấm, module hồng ngoại để đếm sự kiện...

Bài 4: Bộ đình thời (Timer)

·         Giới thiệu về timer, ngắt timer của Atmega328 

·         Thực hành tạo ngắt timer 1s để điều khiển bật tắt thiết bị

Bài 5: Giới thiệu về PWM

·         Tìm hiểu về PWM

·         Lập trình PWM điều khiển động cơ sử dụng pwm

Bài 6:  Bộ chuyển đổi tương tự - số (ADC)
ATmega328
·         Biết cách cấu hình và sử dụng ADC 

·         Thực hành đo điện áp và đo nhiệt độ...

Bài 7: Giao tiếp truyền thông nối tiếp UART

·         Biết cách cấu hình và sử dụng UART

·         Thực hành giao tiếp Kit arduino vơi máy tính, hiển thị các thông số điện áp, nhiệt độ...
Học phí như sau:
-Khóa C+8051 : 600.000 VNĐ
-Khóa C+AVR  : 800.000 VNĐ

Khóa C+ stm8 : 800.000 VNĐ
Áp dụng chung cho tất cả mọi người đi học và đi làm
thời gian học vào thứ 246 và chủ nhật
Địa điểm học: số 67, ngõ 345, đường Khương Trung ( gần Ngã tư sở), Thanh Xuân, Hà Nôi.
Điện thoại: 01686714114.

Gmail : ngongochuy89@gmail.com
inbox facebook : https://web.facebook.com/huy.ngo.35175
Admin group Điện tử ứng dụng : https://www.facebook.com/groups/dientuungdung/

Tuesday, September 22, 2015

Bài 7: Làm việc với UART1 trong STM8

UART là 1 ngoại vi quan trọng trong vi điều khiển. Nó có rất nhiều ứng dụng trong giao tiếp với các thiết bị khác như máy tính, các modul sử dụng UART khác. v.v.
Trong bài này tôi sẽ hướng dẫn các bạn sử dụng bộ UART1 của STM8S003.
Để sử dụng UART cần có 2 thư viện là stm8s_uart1.c và stm8s_clk.c 
các hàm trong thư viện stm8s_uart1.c
void UART1_Init
(
uint32_t BaudRate, //tốc độ truyền
UART1_WordLength_TypeDef WordLength, // độ dài byte truyền
UART1_StopBits_TypeDef StopBits, //bit stop
UART1_Parity_TypeDef Parity, // parity
UART1_SyncMode_TypeDef SyncMode, //chế độ truyền
UART1_Mode_TypeDef Mode  //kiểu truyền
)




tốc độ truyền UART thường là 9600 ,.v.v
độ dài byte là 
UART1_WORDLENGTH_8D   8 bits Data
UART1_WORDLENGTH_9D   9 bits Data 
thường sử dụng là 8bit
StopBit nên sử dụng UART1_STOPBITS_1
Parity nên sử dụng UART1_PARITY_NO
SyncMode UART1_SYNCMODE_CLOCK_DISABLE chế độ truyền không đồng bộ
Mode có các kiểu sau
UART1_MODE_RX_ENABLE  0x08 chỉ nhận dữ liệu

UART1_MODE_TX_ENABLE  0x04 chỉ truyền dữ liệu

UART1_MODE_TX_DISABLE  0x80 vô hiệu truyền

UART1_MODE_RX_DISABLE  0x40 vô hiệu đường nhận dữ liệu ( chỉ có đường truyền)

UART1_MODE_TXRX_ENABLE  0x0C kích hoạt cả đường Tx và Rx
ví dụ như sau :
  UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);

sau đây là 1 đoạn code ví dụ:
/**
  ******************************************************************************
  * @file    Project/main.c 
  * @author  MCD Application Team
  * @version V2.2.0
  * @date    30-September-2014
  * @brief   Main program body
   ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */ 


/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
 INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
 {
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
   char ch;
   ch=UART1_ReceiveData8();
   if(ch=='a')
     GPIO_WriteHigh(GPIOD,GPIO_PIN_3);
   else
   if (ch=='b')
     GPIO_WriteLow(GPIOD,GPIO_PIN_3);
 }
void main(void)
{
  GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST);
  UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
  UART1_ITConfig(UART1_IT_RXNE_OR , ENABLE);
  UART1_Cmd(ENABLE);
   enableInterrupts();
  /* Infinite loop */
  while (1)
  {
  }
  
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Link download project:

Mời các bạn tham gia thảo luận tại :

Monday, August 31, 2015

Hướng dẫn sử dụng trình biên dịch SDCC với 89S52 - Trình biên dịch mã nguồn mở cực mạnh


Lâu nay các tín đồ của 89x52 thường sử dụng KeilC để lập trình vì đó là 1 trình biên dịch mạnh nhưng điểm yếu cốt lõi là nó không phải là phần mềm miễn phí mà là 1 phần mềm trả tiền và chúng ta  phải crack mới sử dụng được.
Sau đây tôi xin hướng dẫn các bạn cách sử dụng nó với Notepad++
đầu tiên các bạn cần download SDCC và cài đặt tại địa chỉ :

Dowload Notepad++ tại :
Cài đặt thì chỉ click và click thôi.

Sau khi cài đặt các bạn mở NotePad và làm như trong hình. Vào "Tool->Options"

Ấn vào nút "Add"  và điền thông số như trong hình dưới đây

và cuối cùng là ấn ok thôi.
Làm việc với Notepad++ các bạn không cần phải lập project làm gì. mà chỉ cần tạo 1 file main.c là xong và cứ thế là lập trình thôi
1 lưu ý nhỏ cho các bạn : Thư mục chứa file main.c thì không được có dấu . tốt nhất kiểu như là D:\ten_xx\main.c
nếu đặt là D:\ten xx\ thì đó là sai . Và trình biên dịch sẽ báo lỗi
Sau khi lập trinh xong bạn vào "Tool" ấn vào lệnh "89x52" để chạy chương trình SDCC biên dịch code
Sau đây là 1 ví dụ về led trái tim mà tôi sử dụng SDCC
Các bạn có thể download mã code về tại đây
Nói 1 chút về ngắt trong SDCC
để khai báo hàm ngắt các bạn sử dụng cấu trúc sau
void ten_ham(void) __interrupt (a) 
với a=0 ngắt ngoài INT0
a=1 ngắt timer0
a=2 INT1
a=3 timer1
a=4 ngắt truyền thông UART



Mời các bạn tham gia thảo luận tại :


Sunday, August 16, 2015

Bài 6: làm việc với Timer 4 của stm8

Trong stm8 thì Timer 4 là timer đơn giản nhất. Nó tương tự với timer trong 8051.
Nó là 1 bộ timer 8 bit  có 1 sự kiện ngắt duy nhất  là overflow/update.
Nó chỉ đếm theo chiều tăng lên.
Các lệnh làm việc cơ bản gồm có:
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 10);//
-- TIM4_PRESCALER_128 : là tần số chia với F_Master. ở chế độ thông thường không cài đặt gì thì F_Master =2Mhz. Vậy timrer 4 sẽ hoạt động tại tần số 15625 Hz.
-- 10 : là số đếm .
 /* xóa cờ update */
  TIM4_ClearFlag(TIM4_FLAG_UPDATE);
 /*kích hoạt ngắt update */
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  /* kích hoạt ngắt */
  enableInterrupts();
  /* kích hoạt timer 4 */
  TIM4_Cmd(ENABLE);
như các bạn thấy đấy nó làm việc rất đơn giản phải không ? Nhưng sự đơn giản của nó lại 1 sự tiện lợi trong các ứng dụng đo thời gian hoặc tần số.
   INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
  /* Cleat Interrupt Pending bit */
  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

}
Đây là code của hàm ngắt timer4 .Câu lệnh quan trọng là câu lênh xóa cơ ngắt update.
Sau đây là 1 mã code mẫu ho các bạn tham khảo :
Yêu cầu : Dùng timer 4 để tạo độ trễ thời gian đảo trạng thái chân PC7
#include "stm8s.h"
    INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
  GPIO_WriteReverse(GPIOC,GPIO_PIN_7);
  /* Cleat Interrupt Pending bit */
  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

}

void main()
{
    GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_OUT_PP_HIGH_FAST);
  TIM4_TimeBaseInit(TIM4_PRESCALER_128, 100);
  /* Clear TIM4 update flag */
  TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  /* Enable update interrupt */
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  
  /* enable interrupts */
  enableInterrupts();

  /* Enable TIM4 */
  TIM4_Cmd(ENABLE);
while(1)
{
}
}
#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
Tới đây là các bạn đã có đầy đủ công cụ cơ bản để có thể làm việc với stm8 như 1 vi điều khiển thông thường với GPIO, ngắt ngoài, Timer.
Trong thời gian tới nếu có thời gian tôi sẽ viết tiếp về I2C, SPI, giao tiếp SDcard, Inputcapte .v.v.


Mời các bạn tham gia thảo luận tại :

Thursday, August 6, 2015

Bài 5 : Ngắt ngoài với STM8 (EXTI peripheral)

1-Giới thiệu.
1 ưu điểm rất mạnh của STM8 so với các dòng vi điều khiển 8 bit cổ điển như 89x52, AVR ,hay Pic là tất cả các chân của nó đều có thể là chân ngắt.
Điều đó là 1 sự tuyệt vời khi làm các ứng dụng với nút bấm điều khiển hoặc bàn phím, Nó giúp chúng ta không cần phải quét phím liên tục.
2- Cách làm việc
Để làm việc với ngắt ngoài chúng ta cần 2 thư viện đó là stm8_gpio.c và stm8s_exti.c
Các bạn cần add chúng vào để làm việc.
GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_PU_IT); // chân PD2 là chân vào, trở kéo lên và có ngắt ngoài
Để hiểu câu lệnh này các bạn xem lại bài 1
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);// chỉ cho phép ngắt sườn xuống ở cổng Pd
 enableInterrupts();// kích hoạt ngắt
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 3)
{

}
do 1 Port có thể có nhiều ngắt xảy ra nên bạn cần kiểm tra từng chân với lệnh GPIO_ReadInputPin()
nếu =0 thì thực hiện
Sau đây là 1 chương ví dụ : đèn led lắp tại PD3 và nút nhấn lắp tại PD2 , Khi ấn nút thì đổi trạng thái của đèn
/**
  ******************************************************************************
  * @file    Project/main.c 
  * @author  MCD Application Team
  * @version V2.2.0
  * @date    30-September-2014
  * @brief   Main program body
   ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */ 


/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  GPIO_WriteReverse(GPIOD,GPIO_PIN_3);
}
void main(void)
{
  GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW );
  GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_IN_PU_IT );
  EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);

  GPIO_WriteHigh(GPIOD,GPIO_PIN_3);
  
 enableInterrupts();// kích ho?t ng?t
  /* Infinite loop */
  while (1)
  {
  }
  
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


Mời các bạn tham gia thảo luận tại :

Tuesday, July 28, 2015

Bài 4 : Xung nhịp hoạt đông (tần số) trong STM8S003


-- Nguồn dao động thạch anh ngoài tốc độ cao từ 1 đến 16 Mhz (HSE : high speed external)
-- Nguồn dao động ngoài tốc độ cao từ máy phát dao động lên tới 16Mhz ( HSE user ext)
-- Nguồn dao động nội RC tốc độ cao HSI : high speed internal
-- Nguồn dao động nội RC tốc độ thấp LSI : Low speed internal
Tấn số măc định khi không cấu hình là 2Mhz
Tần số tối đa là 16Mhz.
Vì để tối thiểu mạch lên chúng ta ít dùng thạch anh ngoài, Nhưng với các ứng dụng đòi hỏi độ chính xác cao như đo tần số thì lên sử dụng
Sau đây là cách cấu hình tần số dao động nội
CLK_DeInit();// re set các thanh ghi clock
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); //dao dộng f_Master = HSI/8 = 16/2 = 2 MHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2); //dao đông cpu f_CPU = f_Master/2 = 1 MHz
while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)!=SET); //wait until HSI ready -- đợi HSI ổn định
Thư viện cấu hình dao động là stm8s_clk.c và .h 



Mời các bạn tham gia thảo luận tại :

Saturday, July 18, 2015

Bài 3: GPIO trong STM8S003 với thư viện STM8S/A Standard Peripherals Firmware Library

trước khi xem bài này các bạn cần biết cách thêm thư viên  STM8 Standard Peripherals tại link sau đây
http://codientu.org/threads/16110/ 
trong link này có hướng dẫn các bạn thêm thư viện vào project
Các hàm xử lý GPIO của stm8s nằm trong file stm8s_gpio.h
void GPIO_DeInit (GPIOx)
Đưa các thanh ghi của GPIO về cấu hình cơ bản
void GPIO_ExternalPullUpConfig(GPIOx,GPIO_PIN_z, NewState)
cấu hình trở treo(Pull-up) trên các trên
GPIOx là GPIOA,GPIOB,....
GPIO_PIN_x =0->7
NewState : DISABLE   : không treo
                   ENABLE    : có treo
void GPIO_Init(GPIOx,GPIO_PIN_z,GPIO_Mode)
GPIO_Mode : 
GPIO_MODE_IN_FL_NO_IT = (uint8_t)0x00, /*!< Input floating, no external interrupt */ thả nổi
GPIO_MODE_IN_PU_NO_IT = (uint8_t)0x40, /*!< Input pull-up, no external interrupt */ trở treo
GPIO_MODE_IN_FL_IT = (uint8_t)0x20, /*!< Input floating, external interrupt */ có ngắt
GPIO_MODE_IN_PU_IT = (uint8_t)0x60, /*!< Input pull-up, external interrupt */ có ngắt
GPIO_MODE_OUT_OD_LOW_FAST = (uint8_t)0xA0, /*!< Output open-drain, low level, 10MHz */ thả nổi 
GPIO_MODE_OUT_PP_LOW_FAST = (uint8_t)0xE0, /*!< Output push-pull, low level, 10MHz */
GPIO_MODE_OUT_OD_LOW_SLOW = (uint8_t)0x80, /*!< Output open-drain, low level, 2MHz */
GPIO_MODE_OUT_PP_LOW_SLOW = (uint8_t)0xC0, /*!< Output push-pull, low level, 2MHz */
GPIO_MODE_OUT_OD_HIZ_FAST = (uint8_t)0xB0, /*!< Output open-drain, high-impedance level,10MHz */
GPIO_MODE_OUT_PP_HIGH_FAST = (uint8_t)0xF0, /*!< Output push-pull, high level, 10MHz */
GPIO_MODE_OUT_OD_HIZ_SLOW = (uint8_t)0x90, /*!< Output open-drain, high-impedance level, 2MHz */
GPIO_MODE_OUT_PP_HIGH_SLOW = (uint8_t)0xD0 /*!< Output push-pull, high level, 2MHz */
uint8_t GPIO_ReadInputData(GPIOx)
-Đọc giá trị trên port GPIOx
BitStatus GPIO_ReadInputPin(GPIOx,GPIO_Pin)
-Đọc giá trị trên chân Pin của PORTx
uint8_t GPIO_ReadOutputData  ( GPIO_TypeDef *  GPIOx )   
-đọc giá trị xuất ra trên Portx
 (x = A đến I). 
void  GPIO_Write (GPIO_TypeDef *GPIOx, uint8_t PortVal) 
-Xuất giá trị PortVal ra Portx
void  GPIO_WriteHigh (GPIO_TypeDef *GPIOx, GPIO_Pin_TypeDef PortPins) 
Xuất High(=1) ra chân Pin
void  GPIO_WriteLow (GPIO_TypeDef *GPIOx, GPIO_Pin_TypeDef PortPins) 
Xuất Low(=0) ra chân Pin
void  GPIO_WriteReverse (GPIO_TypeDef *GPIOx, GPIO_Pin_TypeDef PortPins) 
Đảo trạng thái chân Pin
Nếu các bạn không muốn dùng thư viện của ST thì các bạn có thể thao tác trực tiếp với thanh ghi giống như sau :
GPIOD->DDR|=(uint8_t)(GPIO_PIN_3|GPIO_PIN_4);
GPIOD->CR1|=(uint8_t)(GPIO_PIN_3|GPIO_PIN_4);
GPIOD-.CR2&=~(uint8_t)(GPIO_PIN_3|GPIO_PIN_4);
Ở trên là toàn bộ lý thuyết về  GPIO của STM8
Sau đây tôi sẽ đưa ra 1 ví dụ nhỏ để các bạn tham khảo:

Ấn nút thì đèn sáng nhả nút thì đèn tối

#include "stm8s.h"
#include "stm8s_gpio.h"
//void Delay(uint16_t nCount)
//{
  ///* Decrement nCount value */
  //while (nCount != 0)
  //{
    //nCount--;
 // }
//}
void main()
{
GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT);
  while(1)
    {
   
      if( !GPIO_ReadInputPin(GPIOD,GPIO_PIN_4))
        GPIO_WriteHigh(GPIOD,GPIO_PIN_3);
      else
    GPIO_WriteLow(GPIOD,GPIO_PIN_3);
    }
 } 
Chúc các bạn thành công


Thursday, July 16, 2015

bài 2 : lập trình GPIO với STM8S003F3P6

Để làm việc với các chân vào ra của stm8 thì chúng ta cần quan tâm đến 5 thanh ghi :