[C7] Bài giảng TIMER

zbloodelfz

Cố Vấn CLB
Staff member
hê hê, anh đã mod xong cái xì lai bài để cho mấy đứa coi rồi. Xem xong rồi thì làm bt này :
Dùng Timer + Led7Seg để làm đồng hồ giây đếm từ 00->59
Tính add luôn project mà thôi mấy đứa chịu khó gõ lại =)) ( mà chắc toàn copy n paste) cho nhớ bài với quen tay code ;)
<<Tổng hợp Bài giảng và Drivers C7 >>

Mirror link:
Code:
http://www.mediafire.com/?xnbv2xt0pb5sqd3
 

ctcngh

Thành Viên PIF
Sao e cấp nguồn 5v từ board cho cái mạch LED 7 đoạn, con 7805 nóng kinh.
Mình đưa vào giá trị từ 0 đến 9 mà nó chỉ hiển thị đc những giá trị từ 0 đến 7 thôi chắc hư con decoder rồi phải k mọi người?
 

omega5161

Thành Viên PIF
cho em hỏi khi TIMER chạy đến 65536 và reset về 0 thì các biến trong chương trình ngắt cũng bị reset về giá trị ban đầu hết phải không ak?
 
biến nào em khai báo trong ngắt sẽ bị reset về giá trị ban đầu thôi. (khai báo trong chương trình __interrupt)
biến khai báo ngoài ngắt thì không bị ảnh hưởng (thực ra có thể có, nhưng vấn đề này là nâng cao và các em không cần biết).
 

Kisses Hacker

Art Supporter
Staff member
biến nào em khai báo trong ngắt sẽ bị reset về giá trị ban đầu thôi. (khai báo trong chương trình __interrupt)
biến khai báo ngoài ngắt thì không bị ảnh hưởng (thực ra có thể có, nhưng vấn đề này là nâng cao và các em không cần biết).
Anh ấy thật là nguy hiểm O.o"
 

omega5161

Thành Viên PIF
bây giờ e chỉ cho hiện được một giá trị cố định có hai chữ số trên module led 7 đoạn, a chị gợi ý giúp em nếu ko sử dụng biến thì làm sao cho nó đếm tăng dần lên được ko?
 

Manhdd

Cố Vấn CLB
Staff member
Sao e cấp nguồn 5v từ board cho cái mạch LED 7 đoạn, con 7805 nóng kinh.
Nóng kinh là thế nào? Vẫn có nguồn ra cho mạch chạy phải không? Em kiểm tra toàn mạch xem có chạm chập ở chỗ nào không nhé!

bây giờ e chỉ cho hiện được một giá trị cố định có hai chữ số trên module led 7 đoạn, a chị gợi ý giúp em nếu ko sử dụng biến thì làm sao cho nó đếm tăng dần lên được ko?
Sao không dùng mảng lưu trữ ngoài ngắt cho đơn giản nhỉ? Trước giờ anh toàn dùng thế :-p
 

ctcngh

Thành Viên PIF
Nóng kinh là thế nào? Vẫn có nguồn ra cho mạch chạy phải không? Em kiểm tra toàn mạch xem có chạm chập ở chỗ nào không nhé!


Sao không dùng mảng lưu trữ ngoài ngắt cho đơn giản nhỉ? Trước giờ anh toàn dùng thế :-p
Gắn cái tản nhiệt vô nên cũng đỡ rồi a ơi, chắc e hàn nóng quá nên hư con IC hay sao mà xuất đến số 8, 9 thì nó k hiện, các số khác thì bình thường.
 

Manhdd

Cố Vấn CLB
Staff member
Gắn cái tản nhiệt vô nên cũng đỡ rồi a ơi, chắc e hàn nóng quá nên hư con IC hay sao mà xuất đến số 8, 9 thì nó k hiện, các số khác thì bình thường.
Uhm. Không hiện gì luôn hả? Con đó em có gắn trên đế IC không? Làm vậy dễ thay thế IC hơn.
 

ctcngh

Thành Viên PIF
Uhm. Không hiện gì luôn hả? Con đó em có gắn trên đế IC không? Làm vậy dễ thay thế IC hơn.
Đúng rồi a. Mấy số kia hiện bình thường, còn 8 với 9 thì nó k hiện gì hết, hồi trc làm biếng hàn trực tiếp luôn.
 

Manhdd

Cố Vấn CLB
Staff member
Đúng rồi a. Mấy số kia hiện bình thường, còn 8 với 9 thì nó k hiện gì hết, hồi trc làm biếng hàn trực tiếp luôn.
Gay à nha. Chắc phải dùng hút chì gỡ con đó ra rồi hàn đế vô, thử con khác á :d
 

Manhdd

Cố Vấn CLB
Staff member
Xin nhắc lại về các công việc mà các bạn C7 cần chuẩn bị cho buổi tới nhé! :)
+ Thứ nhất là coi lại bài Timer cho kĩ càng, có gì không hiểu cứ hỏi Adviser của các bạn
+ Thứ hai là làm bài tập của anh Khoa: Viết code cho module led 7 đoạn đếm vòng từ 00 -> 99. Pro hơn thì viết cho 4 con led 7 đoạn đếm phút và giây. Vì mỗi cá nhân chưa có hết module này nên có thể làm theo nhóm, tuy nhiên, khuyến khích tất cả các bạn đều có module này.
Hướng dẫn một tí về quét led trên module led 7 đoạn. Giả sử các bạn set Port1 là output và nối bus tương ứng từ P1.7->P1.0 vào B1->B8 của 74HC245 thì:​
- Code hiện số 2 trên led 7 đoạn thứ nhất: P1OUT = 0x2E; // 0010-1110
- Code hiện số 0 trên led 7 đoạn thứ hai : P1OUT = 0x0D; // 0000-1101
- Code hiện số 6 trên led 7 đoạn thứ ba : P1OUT = 0x6B; // 0110-1011
- Code hiện số 9 trên led 7 đoạn thứ tư : P1OUT = 0x97; // 1001-0111
Để quan sát được 4 led hiện đồng thời, chúng ta phải lần lượt xuất số ra 4 led thật nhanh (quét led). Như vậy, nên có 1 timer với chu kì ngắt khoảng 2-3 ms điều khiển việc quét led. Hơn nữa, chúng ta nên có 1 mảng toàn cục 4 phần tử để lưu giá trị cần hiển thị trên 4 led. Ngắt timer sẽ đọc mảng này và điều chỉnh hiển thị, bên cạnh đó, mảng này có thể được thay đổi giá trị trong main() để thay đổi 4 số được hiển thị . Chi tiết của việc quét led các bạn có thể hỏi Adviser hoặc tham khảo google.com
+ Thứ ba là về việc các module IO cần thiết cho C7 (đã nói qua tại đây). Module LCD làm mạch rất dễ (chỉ tốn tiền mua LCD) và viết code đơn giản nên mỗi bạn nhất thiết phải có LCD. Như vậy, mỗi bạn C7 nên nhanh chóng làm mạch này để thứ bảy chúng ta viết code cho LCD chạy. Việc viết code sẽ dựa trên các file driver (library) đính kèm. Các file này đều có comment rõ ràng, các bạn cần đọc trước và bạn nào tự tin thì có thể chạy thử (với sự hướng dẫn của Adviser).
Với các module còn lại, mỗi nhóm phải có đầy đủ, và hơn nữa, BCN khuyến khích mỗi bạn nên có đầy đủ để nâng cao tay nghề làm mạch và viết code. Riêng module Led ma trận vì vẫn còn phải chỉnh sửa vài chỗ nên thứ bảy tuần này mới có layout cho các bạn xem :(​
Tóm lại, việc chính của tuần này chỉ là viết code cho led 7 đoạn và làm module LCD. Mong các bạn hoàn tất để chúng ta theo kịp tiến độ học tập :d
 

Attachments

lechihieu

Thành Viên PIF
Các anh chị giúp giùm em, em viết chương trình chớp tắt led vs chu kỳ 2s, dùng nguồn 32khz, nhưng không hiểu sao nó chờ nó chớp tắt không đúng (3s sáng, 3s tắt)

Code:
#include <msp430g2553.h>
 
void main(void)
 
{
 
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
 
P1DIR |= 0x01; // P1.0 output
 
CCTL0 = CCIE; // CCR0 interrupt enabled
 
CCR0 = 32768;
 
TACTL = TASSEL_1 + MC_1 + ID_0; // ACLK, upmode
 
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
 
}
 
// Timer A0 interrupt service routine
 
#pragma vector=TIMER0_A0_VECTOR
 
__interrupt void Timer_A (void)
 
{
 
P1OUT ^=0X01;
 
}
 

Manhdd

Cố Vấn CLB
Staff member
Các anh chị giúp giùm em, em viết chương trình chớp tắt led vs chu kỳ 2s, dùng nguồn 32khz, nhưng không hiểu sao nó chờ nó chớp tắt không đúng (3s sáng, 3s tắt)

Code:
#include <msp430g2553.h>
 
void main(void)
 
{
 
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
 
P1DIR |= 0x01; // P1.0 output
 
CCTL0 = CCIE; // CCR0 interrupt enabled
 
CCR0 = 32768;
 
TACTL = TASSEL_1 + MC_1 + ID_0; // ACLK, upmode
 
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
 
}
 
// Timer A0 interrupt service routine
 
#pragma vector=TIMER0_A0_VECTOR
 
__interrupt void Timer_A (void)
 
{
 
P1OUT ^=0X01;
 
}
Nghe mô tả cứ như clock ACLK dùng VLO nội 12kHz vậy, cho nên em mới thấy thời gian trễ gấp 3 lần.
Em thử sample code của TI xem, ngắt timer (tràn ở 65535)
Code:
//******************************************************************************
//  MSP430G2xx3 Demo - Timer_A, Toggle P1.0, Overflow ISR, 32kHz ACLK
//
//  Description: Toggle P1.0 using software and the Timer_A overflow ISR.
//  In this example an ISR triggers when TA overflows. Inside the ISR P1.0
//  is toggled. Toggle rate is exactly 0.5Hz. Proper use of the TA0IV interrupt
//  vector generator is demonstrated.
//  ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO
//  //* An external watch crystal on XIN XOUT is required for ACLK *//   
//
//          MSP430G2xx3
//        ---------------
//    /|\|            XIN|-
//      | |              | 32kHz
//      --|RST        XOUT|-
//        |              |
//        |          P1.0|-->LED
//
//  D. Dang
//  Texas Instruments Inc.
//  December 2010
//  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
 
#include  <msp430g2553.h>
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  TACTL = TASSEL_1 + MC_2 + TAIE;          // ACLK, contmode, interrupt
 
  _BIS_SR(LPM3_bits + GIE);                // Enter LPM3 w/ interrupt
}
 
// Timer_A3 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
  switch( TA0IV )
  {
    case  2:  break;                        // CCR1 not used
    case  4:  break;                        // CCR2 not used
    case 10:  P1OUT ^= 0x01;                // overflow
              break;
  }
}
Cố gắng tự ngâm cứu nhé ^^
 

omega5161

Thành Viên PIF
#include <msp430g2553.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt

_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}

// Timer_A3 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
switch( TA0IV )
{
case 2: break; // CCR1 not used
case 4: break; // CCR2 not used
case 10: P1OUT ^= 0x01; // overflow
break;
}
}
cho em hỏi tại sao mình thay đoạn em đánh dấu ở trên bằng P1OUT ^=0X01; lại ko dc vậy
 

messier

Ban Chủ Nhiệm
Cũng được nếu em chỉ xài mỗi ngắt overflow của timer0. Vì thanh ghi TA0IV dùng chung cho cả 3 ngắt CCR1, CCR2 và timer nên phải có lệnh switch để xem ngắt nào xảy ra. :D
Em thay luôn lệnh switch bằng P1OUT ^= 0X01 thì sẽ được.
 

pas_mgcaru

Thành Viên PIF
Các anh chị giúp giùm em, em viết chương trình chớp tắt led vs chu kỳ 2s, dùng nguồn 32khz, nhưng không hiểu sao nó chờ nó chớp tắt không đúng (3s sáng, 3s tắt)

Code:
#include <msp430g2553.h>
 
void main(void)
 
{
 
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
 
P1DIR |= 0x01; // P1.0 output
 
CCTL0 = CCIE; // CCR0 interrupt enabled
 
CCR0 = 32768;
 
TACTL = TASSEL_1 + MC_1 + ID_0; // ACLK, upmode
 
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
 
}
 
// Timer A0 interrupt service routine
 
#pragma vector=TIMER0_A0_VECTOR
 
__interrupt void Timer_A (void)
 
{
 
P1OUT ^=0X01;
 
}
cho em hỏi LPM3_bits và VLO nội 12kHz là gì vậy anh?:-( mấy cái clock này sao thấy lung tung ghê
 
Top