PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   các bác nào giúp em khởi tạo timer1 zoiii (http://www.picvietnam.com/forum/showthread.php?t=6387)

kiemkhach10 19-05-2010 05:10 PM

các bác nào giúp em khởi tạo timer1 zoiii
 
bác nào khởi tạo timer1 để tạo thời gian trễ 5s dùm em với:(
cám ơn các bác nhiều
à em dùng em 16f88
GIE=1;
PIE1=1;
TMR1IE=1;
TMR1IF=0;
TMR1CS=0;
T1SYNC = 0;
T1OSCEN = 0;
T1CKPS1=1;
T1CKPS0=1;
em khởi tạo vậy đúng ko nhỉ? sao ko thấy chạy nhỉ?

kiemkhach10 20-05-2010 08:03 AM

ko bác nào giúp em à?em đang cần gấp lắm mà!
em đã thử cả 100 lần rùi mà ko được. đã gãy chân mất 2 em 16f88 rùi.cứ phải tháo ra tháo vào mà ko xong.
bác nào đã khởi tạo thành công 5s trong timer1 của pic 16f88 thì giúp em cái
cám ơn các bác nhiều!
em sài Hi-TechPic:(

kiemkhach10 20-05-2010 09:59 AM

Trích:

Nguyên văn bởi ngocthanh07 (Post 36156)
Bạn thử giải thích từng dòng code của bạn đi, comment từng dòng để nguời khác hiểu ý bạn, con số 5s bạn thể hiện nó ở chỗ nào trong đoạn trên vậy. Bạn làm sao biết code không chạy ?
Bạn làm không đuợc thì phải bình tĩnh suy nghĩ, đọc tài liệu, làm không đuợc mà bạn nạp chết 100 con Pic cũng ko đuợc chứ đừng nói nạp 100 lần.

mình muốn khởi tạo hàm dùng timer1,cái này nếu khởi tạo được thì mình sẽ viết tiếp cho nháy led chẳng hạn.
nhưng khởi tạo mãi ko được do vậy chẳng thể làm gì.
còn kiểm tra thì đơn giản mà bạn.chỉ việc tính đúng 5s thì cho 1 led nháy
nhưng cái đó đòi hỏi phải khởi tạo thành công timer1 đã:(
chẳng nhẽ mọi người ko ai sử dụng timer1 hay sao ý:(
buồn quá!

kiemkhach10 21-05-2010 08:26 AM

hic mình đã đợi gần 1 tuần mà chuă thấy bạn nào hồi âm hết.
đây là code mình viết:

MÌNH DÙNG PIC 16F88.

void main(void)
{
timer1_init();
while(1)
{
if(RA2==1)
{
RA3=1;//RA3 NỐI VỚI CÒI BÍP
}
}
}
//////
timer1_init()
{
GIE=1;//cho phep ngắt tổng
PIE1=1;// cho phép ngắt ngoại vi
TMR1IE=1;//cho phép ngắt timer1
TMR1IF=0;//xóa cờ ngắt
TMR1H =0;// giá trị ban đầu của timer1
TMR1L =0;
TMR1CS=0;//chon xung fso/4
T1RUN=0;//cái nay mới thấy lần đầu,chắc là cho phép chạy chế độ timer1
T1OSCEN = 1;
T1CKPS1=1;//chọn độ chia 1:8
T1CKPS0=1;
TMR1ON=1; //bắt đầu chạy timer1
}
void interrupt inter1(void)
{
RA2=1//RA2 NỐI VỚI 1LED đơn
TMR1H =0;
TMR1L =0;
TMR1IE=1;
TMR1IF=0;
TMR1ON=1;
}

CODE MÌNH KO THẤY GÌ SAI,NHƯNG SAO TIMER1 KO CHẠY NHỈ?
CÁC CAO THỦ XEM DÙM EM CÁI!
CÁM ƠN RẤT NHIỀU!

nhamdtk4 21-05-2010 08:34 AM

Bạn vào đây C:\program files\PICC\Examples đọc bài EX_STWT.C của CCS xem họ khởi tạo Timer thế nào rồi tính tiếp.

kiemkhach10 21-05-2010 10:40 AM

Trích:

Nguyên văn bởi nhamdtk4 (Post 36182)
Bạn vào đây C:\program files\PICC\Examples đọc bài EX_STWT.C của CCS xem họ khởi tạo Timer thế nào rồi tính tiếp.

khổ lỗi mình lại viết bằng Hi-TechPic bây giờ chắc phải download lại ccs mà dùng thui,
khổ thân tui thế:(
bạn có thê port cái EX_STWT.C của CCS cho mình xem được ko?mạng chỗ mình yếu lắm ,chắc download lâu quá mà lại hay bị đứt mang nứa.
cám ơn bạn nhiều!

kiemkhach10 21-05-2010 11:54 AM

Trích:

Nguyên văn bởi ngocthanh07 (Post 36189)
Mình không dùng cái Hi-techPic gì đó, nhưng mình thấy bạn viết chuơng trình ngắn mà có vẽ như hơi bị thiếu. Không biết có phải Hi-tech Pic có chức năng tự tạo cho bạn nhẫn chức năng thiếu đó ?.
Ví dụ:
- Chiều cho chân RA2 là in hay out. Chân này có trùng chân analog không ? , có bỏ chức năng analog ra chưa,
- Thêm một điều nữa là bạn nên lưu tâm tới việc xóa cờ ngắt truớc hay sau khi enable ngắt.
-Chuơng trình của bạn có ngắt thì đèn cháy àh, vậy bạn làm sao biết đuợc nó ngắt bao nhiêu lần, ban đầu chưa có ngắt đèn có cháy chưa. Thời gian giữa hai lần ngắt theo tính toán của bạn là bao nhiêu, có đủ để bạn nhận biết đuợc hiện tượng mà bạn tạo ra để thử chưa, Bạn có làm đuợc led cháy/ tắt khi không có timer 1 chưa ?
Timer 1 không chạy là "chẩn đoán của bạn, suy đoán của bạn", hoàn toàn không phải là cái lỗi của chuơng trình. Suy đoán sai hay đúng thì chưa biết!
Thời gian 1 tuần là hơi ít nhưng cũng đủ để bạn viết một chuơng trình cho nó đàng hoàng....thay vì ngồi đợi, bạn tự làm, tự tính, 100% là được. Ngồi đợi, khả năng cũng đuợc nhưng chẳng hiểu đến đâu cả.

cái đó mình có làm mà,mình chỉ port nhưng phần liên quan đến timer1 thui,còn các khai báo mình cũng đã khai báo đủ mà.
bạn port hộ mình cái ví dụ dùng timer1 trong ccs ,để mình tham khảo cái,vì mình download hoài mà ko được.
cám ơn bạn nhiều

kiemkhach10 21-05-2010 10:52 PM

Trích:

Nguyên văn bởi ngocthanh07 (Post 36192)
Code:

/////////////////////////////////////////////////////////////////////////
////                          EX_STWT1.C                            ////
////                                                                ////
////  This program uses timer 1 and interrupts to keep a            ////
////  real time seconds counter.  A simple stop watch function is    ////
////  then implemented.                                              ////
////                                                                ////
////  Jumpers:                                                      ////
////    PCM,PCH    pin C7 to RS232 RX, pin C6 to RS232 TX          ////
////                                                                ////
////  This example will work with the PCM and PCH compilers.  The    ////
////  following conditional compilation lines are used to include a  ////
////  valid device for each compiler.  Change the device, clock and  ////
////  RS232 pins for your hardware if needed.                        ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2004 Custom Computer Services        ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written      ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#if defined(__PCM__)
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif

#define INTS_PER_SECOND 19        // (20000000/(4*4*65536))

int8 seconds;      // A running seconds counter
int8 int_count;    // Number of interrupts left before a second has elapsed


#INT_TIMER1                        // This function is called every time
void clock_isr() {                // timer 1 overflows (65535->0), which is
                                  // approximately 19 times per second for
    if(--int_count==0) {          // this program.
      ++seconds;
      int_count = INTS_PER_SECOND;
    }
}


void main() {
  int_count = INTS_PER_SECOND;
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
  set_timer1(0);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);

  while(TRUE) {
      printf("Press any key to begin.\n\r");
      getc();
      int_count = INTS_PER_SECOND;
      seconds = 0;
      printf("Press any key to stop.\n\r");
      getc();
      printf("%u seconds.\n\r", seconds);
  }
}

Code:


////////////////////////////////////////////////////////////////// Timer 1
// Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1
// Constants used for SETUP_TIMER_1() are:
//      (or (via |) together constants from each group)
#define T1_DISABLED        0
#define T1_INTERNAL        0x85
#define T1_EXTERNAL        0x87
#define T1_EXTERNAL_SYNC    0x83

#define T1_CLK_OUT          8

#define T1_DIV_BY_1        0
#define T1_DIV_BY_2        0x10
#define T1_DIV_BY_4        0x20
#define T1_DIV_BY_8        0x30

////////////////////////////////////////////////////////////////// Timer 2

Thứ lỗi cho mình hỏi, bạn căn cứ vào đâu để biết
1. Pic chạy
2. Timer của bạn không chạy.

Với những gì bạn làm và chưong trình bạn viết, từ "đủ" của bạn tớ không tin!, đó chỉ là cảm giác và suy nghĩ chủ quan của bạn.

mình đã test bằng delay.cứ 1s thì led nhấp nháy 1 lần.nhưng khi chuyển dùng timer1 thì led ko nhấp nháy nữa.do đó 100% do mình khởi tạo hàm timer1 sai.
bạn cho mình hỏi thêm (#define T1_INTERNAL 0x85) thì các bít nào =1 và các bít nào =0.và nó ở thanh ghi nào?
cám ơn nhiều

ngocthanh07 21-05-2010 11:18 PM

1 Attachment(s)
Bạn có thể post nguyên cái code của bạn ko, bạn hỏi nguời khác, mà bạn cứ cắt xén câu hỏi như vậy, nguời ta phải đoán bạn làm gì rồi, chưa làm gì rồi
rất là khó
Code:

/* service routine for timer 0 interrupt */
void interrupt
timer0_isr(void)
{
        if(reload == 0){
                // effect a change on PORTB whenever our desired period is reached.
                // Note this timing will contain a margin of error.
                reload = RELOADS + 1;
                seconds++;
                PORTB++;        // effect a change on PORTB
        }
        reload--;
        T0IF = 0;
}

Đó là một ví dụ về ngắt timer 0 trong HT PIC, tớ không rành về cách viết HT PIC, nhưng liệu bạn có chắc chuơng trình của bạn sẽ nhảy vào ngắt không.

Tớ up cho bạn mổ cái file manual của HT PIC, trong chuơng năm nguời ta có 1 ví dụ về timer1 thì phải.

kiemkhach10 22-05-2010 07:11 AM

Trích:

Nguyên văn bởi ngocthanh07 (Post 36210)
Bạn có thể post nguyên cái code của bạn ko, bạn hỏi nguời khác, mà bạn cứ cắt xén câu hỏi như vậy, nguời ta phải đoán bạn làm gì rồi, chưa làm gì rồi
rất là khó
Code:

/* service routine for timer 0 interrupt */
void interrupt
timer0_isr(void)
{
        if(reload == 0){
                // effect a change on PORTB whenever our desired period is reached.
                // Note this timing will contain a margin of error.
                reload = RELOADS + 1;
                seconds++;
                PORTB++;        // effect a change on PORTB
        }
        reload--;
        T0IF = 0;
}

Đó là một ví dụ về ngắt timer 0 trong HT PIC, tớ không rành về cách viết HT PIC, nhưng liệu bạn có chắc chuơng trình của bạn sẽ nhảy vào ngắt không.

Tớ up cho bạn mổ cái file manual của HT PIC, trong chuơng năm nguời ta có 1 ví dụ về timer1 thì phải.

hi! cám ơn ngocthanh07
đêm qua mình ngồi suy nghi lại và đọc thêm 1 số bài.hóa ra mình thiếu cho phép ngắt ngoaij vi PEIE=1, vì tmer1 là mọt ngoại vi.
mình đã bổ xung và timer1 chạy ngon lành cành đào vui quá:))
nhưng lại có thêm 1 vấn đề nữa
khi mình dùng timer0 và timer1 cùng 1 lúc, thì trình dịch báo lỗi (symbol "interrupt_function" defined more than) có nghĩa là khai báo hàm ngắt quá 1 lần.
mính gọi hai hàm ngắt liên tục như thế này

void interrupt inter0(void)
{
//thực hiện lênh1.
}
void interrupt inter1(void)
{
//thực hiện lênh2.
}

có ki nào xung đột ko nhỉ mà khi dịch thì nó báo lỗi hoài?

ngocthanh07 22-05-2010 09:03 AM

Hì, việc này bạn xem ví dụ của HT PIC nhé, theo như ví dụ này, bạn chỉ có một hàm ngắt chung cho các ngắt, trong hàm ngắt bạn phải kiểm tra cờ ngắt của từng đứa. (Liên quan đến vụ vector ngắt và source ngắt của con PIC của bạn, hình như nó chỉ có 1 vector ngắt thôi). Tức là bạn phải kiểm tra cờ T0IF, T1IF trong chuơng trình ngắt. Không dùng hai hàm ngắt được.

Thêm một điều, bạn có thể không QUOTE bài của mìnhd duợc không vậy, vui lòng bỏ phần QUOTE đó ra dùm. Các bài đó có giá trị gì đâu QUOTE làm gì, để tài nguyên cho cái nào có ý nghĩa hơn.

kiemkhach10 22-05-2010 06:23 PM

ok.cám ơn bạn nhiều, để mình xem lại.
đúng là pic chỉ có 1 vecter ngắt ở địa chỉ 0x04.
dù sao cũng cám ơn ban nhiều.đã giúp mình khá nhiều:D
chúc vui!


Múi giờ GMT. Hiện tại là 04:04 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam