PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 17-05-2010, 10:10 PM   #1
baquyen
Đệ tử 2 túi
 
baquyen's Avatar
 
Tham gia ngày: May 2007
Bài gửi: 31
:
Giúp em về ngắt nối tiếp trong pic 16f887 với

Em đang lập trình phần ngắt nt cho 16f887, em thử nghiệm ngắt khi nhận được tín hiệu từ máy tính, em dùng #int_RDA nhưng ko thành công, chương trình của em như sau:

Code:
#include <16f887.h>
#device adc=8
#include <def_877a.h>
#include <stdio.h>
#include <stdlib.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use fast_io(D)
#use fast_io(b)
#use delay(clock=12000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8) 
                         //thiet ke nguoc hai chan C7 va C6//
int8 q;                  // q = 1 chieu thuan, q = 0 chieu nghich
signed int16 gtdem = 0;  // dem vi tri encoder 
signed int16 gtdat = 100;  // gia tri dat 
signed int16 y     = 0;  // do lech giua vi tri dat va gt dem 
//int16 count        = 0;  // bien dem trong timer0, max = 65536
int8 i=0;
int8 x1=0;
int8 x2=0;

//=============== ngat TIMER0 ========================//
         // thoi diem khac nhau thi gtdat khac nhau //
 
/*#int_timer0
void interrupt_timer0()
{
   set_timer0(4); // 256 - 4 = 252 so nay chia het cho 3
   count++; // count tang len  1 sau 256*(256-4)*4/12M = 21.504 ms
   
   if(count==50) // 21.504*500 = 10.752 s
      {
      gtdat=100;  //90 do
      }
   if(count==100) //21.504 s
      {
      gtdat=200; //180 do
      }
   if(count==150) //32.256 s
      {
      gtdat=300;  //270 do
      }
   if(count==200) //43.008 s
      {
      gtdat=400;  //360 do
      }
   if(count==250)   //53.76 s
      {
      count=0;
      gtdat=0;
      }
   
}*/



#INT_RDA
void gtdat_RDA()
{
   /*++i;
   if(i==1)
   {
   x1=getc();
   }
   if(i==2)
   {
   x2=getc();
   }
   gtdat=make16(x1,x2);
   i=0;*/
   
   printf("OK");
}
//=============== ngat ngoai RB0 va RB1 ========================//
        //dem vi tri encoder (gtdem) va chieu quay (q)//
#INT_EXT
void encoder_EXT()
{
  // y=gtdat-gtdem;// de o day la ko on//
  
   if(rb1==0) // chieu thuan
   {
      gtdem++;
      q=0x00;
   }
   else       // chieu nghich
   {
      gtdem--;
      q=0xff;
   }
}

//====================== HAM CHINH ==============================//

void main()
{ 
   //printf("khong phai em");
   //=================== INTERRUPT ====================//
   
   //set_tris_b(0xff);
   set_tris_D(0x00);            // tat ca ngo d la output
   //portd=0x00;
   //set_timer0(4);
   //enable_interrupts(int_timer0);
   //setup_timer_0(RTCC_internal|RTCC_div_128);
   ext_int_edge(l_to_h);
   //ext_int_edge(h_to_l);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_RDA);
   enable_interrupts(Global);
   
   
   //===================== PWM ========================//
   
   setup_ccp1(ccp_pwm);
   setup_ccp2(ccp_pwm);
   setup_timer_2(T2_div_by_4,140,1); //TR2 = 140, prescale = 4
      // T = 4/12M*(140+1)*4 = 1.88*10^-4 s
      // f = 1/T = 5.319 kHz
      // Prescale value = ((1/PWM Frequency)/Prescale value * (4/OSC frequency))-1
      // PWM resolution = ( log ( OSC freq / PWM freq ) ) / log 2
   set_pwm1_duty(0);
   set_pwm2_duty(0);
      
   //================== DIEU KHIEN ===================//
   
   
 
   while(true)
     {
         y=gtdat-gtdem;
         portd=q; // xem chieu dong co qua tt PORTD
         if(y>0) // chua toi vi tri nen cho dc chay theo chieu thuan
           {
               set_pwm2_duty(0);
               set_pwm1_duty(30);
           }
         if(y==0) // ok roi`
           {
               set_pwm1_duty(0);
               set_pwm2_duty(0);
           }
         if(y<0)    // chay qua' roi, cho chay nguoc lai 
                    //(tai sao ko dung ELSE o day dc?)
           {
               set_pwm1_duty(0);
               set_pwm2_duty(30);
           }
     }

}

 //========================== KET THUC=============================//
- ban đầu em thử đặt hàm printf("khong phai em")trong main(), thì trên máy tính hiện lên chuỗi ký tự "khong phai em" trên màn hình của chương trình trên máy tính. Vậy là việc gửi chuỗi ký tự lên PC là bình thường.
- sau đó em đặt hàm printf("OK") vào hàm ngắt #int_RDA, ý tưởng của em là khi máy tính gửi 1 ký tự bất kỳ đến PIC thì Pic sẽ gửi chữ OK lên màn hình máy tinh, nhưng em thử nghiệm thì ko đc gì cả.
- chú ý là trong thiết kế phần cứng em nối nhầm 2 chân C6 và C7, em thay đổi khai báo trong rs232 thì hàm printf() hoạt động bình thường, không biết việc nhầm lẫn này có ảnh hưởng đến ngắt #int_RDA ko, hay là do code của em có lỗi
Mong được mọi người giúp đỡ
baquyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-05-2010, 10:15 PM   #2
baquyen
Đệ tử 2 túi
 
baquyen's Avatar
 
Tham gia ngày: May 2007
Bài gửi: 31
:
PS: em dùng ct giao tiếp mtty anh Ngô Hải Bắc giới thiệu trên diễn dàn
File Kèm Theo
File Type: rar mttty.rar (16.4 KB, 158 lần tải)
baquyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-06-2010, 12:14 AM   #3
tungbka
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Mình cũng đang gặp vấn đề với ngắt RS232 của PIC đây. Chương trình của mình cũng có 3 ngắt như bạn, ngắt RDA, RB0 và Timer. Việc truyền nhận mình cũng chỉ truyền được 1 lần từ PC xuống, nếu ko disable ngắt RDA ngay khi nhận được thì PIC còn bị treo nữa cơ. Thật là khó hiểu.
Hy vọng có pro nào đọc được thread này thì cho cao kiến để giúp giải quyết vấn đề này./.
tungbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2010, 12:32 AM   #4
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
k nên dùng quá nhìu ngắt , loạn lên thì heo en cả lũ . Tại mấy u k chịu đọc tài liệu đâu cần phải dùng ngắt nối tiếp mới lấy đc dữ liệu
Code:
#include <18F4331.h>
#fuses  XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOCPD,NODEBUG,NOFCMEN,NOCPB
#use    delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)

main()
{while(1)
   { if(RCIF) { RCIF=0;c=RCREG;}; };
}
đó , h dữ liệu nằm trong biến c , ưa sử dụng thế nào thì tùy . Đâu cần phải dùng ngắt nối tiếp , đúng k ?
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2010, 12:45 AM   #5
tungbka
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Chỉ cần thế thôi hả anh. Để em thử xem. Tại mới tập tọe làm nhúng, nên cũng chưa có kinh nghiệm gì, em chỉ tham khảo mọi người hay làm rồi chế khác đi theo mục đích của mình thôi.
Anh cho em hỏi thêm cái khai báo bits=9 ý. Em khai báo bits=8 hoặc bits=9 mà thấy như nhau cả, đều truyền nhận đúng dữ liệu.
tungbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-06-2010, 04:45 PM   #6
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi tungbka View Post
Chỉ cần thế thôi hả anh. Để em thử xem. Tại mới tập tọe làm nhúng, nên cũng chưa có kinh nghiệm gì, em chỉ tham khảo mọi người hay làm rồi chế khác đi theo mục đích của mình thôi.
Anh cho em hỏi thêm cái khai báo bits=9 ý. Em khai báo bits=8 hoặc bits=9 mà thấy như nhau cả, đều truyền nhận đúng dữ liệu.
bits=9 ==> 1 start 7 data 1 stop
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-06-2010, 07:35 AM   #7
baquyen
Đệ tử 2 túi
 
baquyen's Avatar
 
Tham gia ngày: May 2007
Bài gửi: 31
:
Cảm ơn anh Mr.Bi , em cũng cải tiến theo hướng dùng biến kbhit() trong CCS và nó đã chạy được

Code:
 if(kbhit())
         {
         //gtdat=getc();
         }
Cho em hỏi thêm 1 chút nhé, em muốn gửi một số có ba chữ số từ trên máy tính xuống PIC mà chưa biết làm thế nào hết, các hướng dẫn trên diễn đàn đều là gửi ký tự hết. Ém chưa nghĩ ra cách nào, bây giờ nếu em muốn có một giá trị là 31 dưới PIC thì em phải gửi ký tự a trong bảng mã ascii, làm vậy bất tiện. Em muốn đánh số vào bảng điều khiển và gửi xuống .
baquyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-06-2010, 06:41 PM   #8
dobaduy
Đệ tử 1 túi
 
dobaduy's Avatar
 
Tham gia ngày: Apr 2010
Bài gửi: 11
:
các bạn giúp mình với. mình dùng asm để viết chương trình cho pic 16f877a giao tiếp nối tiếp với pc. sử dụng ngắt nhận, mình muốn hỏi là:
+ giả sử trên pc truyền xuống 2 byte, khi nhận được bit stop của byte thứ 1 thì pic nhảy vào ngắt, nếu chưa thoát ngắt mà byte 2 được truyền xuống thì píc có nhận được ko?nếu nhận được thì sau khi thoát ngắt nó lại nhảy vào ngắt(vì đã nhận bit stop của byte 2) hay sao?
+ giả sử pic đang truyền 1byte lên pc, lỡ như chưa kịp truyền hết byte đó mà xảy ra ngắt nhận thì nó sẽ tiếp tục truyền cho hết byte đó hay là tạm ngừng việc truyền lại,sau khi thoát ngắt sẽ truyền tiếp?
ai biết thì giải đáp giúp mình với. thanks
dobaduy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-06-2010, 04:01 PM   #9
thuc101
Nhập môn đệ tử
 
Tham gia ngày: Mar 2009
Bài gửi: 8
:
Mình cũng đang làm truyền nối tiếp giữa pic 16f877a và pc nè!
câu hỏi thứ 2 của bạn thì mình xin trả lời chắc chắn rằng khi chưa truyền xong nhưng xảy ra ngắt thì nó sẽ vào xử lý ngắt xong rồi mới thoát ngắt và quay trở lại chương trình để làm tiếp
Còn với câu hỏi 1 thì mình cũng không rõ lắm nhưng theo mình thi khi truyền ta sẽ truyền một chuỗi chứ không truyền từng byte một nên khi bạn truyền số 123 từ pic lên thì pc sẽ nhận số 123 vào một biến dạng variant.Còn khi pc truyền xuóng thì mình không biết pic của mình phải làm sao để nhạn cho đúng
Nếu có gì thì bạn gửi mail cho minh với nhé mail minh là :"le_van_thuc_101@yahoo.com"
thuc101 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-07-2010, 01:46 PM   #10
minhcuong1122
Đệ tử 1 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 17
:
Thật khó hiểu, e đọc datasheet của PIC 16F887. Trong đó có nói: cờ RCIF không thể xóa bằng phần mềm (read-only). Thắc mắc sao mọi người lại xóa cờ??????? HIC.

thay đổi nội dung bởi: minhcuong1122, 01-07-2010 lúc 02:32 PM.
minhcuong1122 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-07-2010, 02:42 PM   #11
baquyen
Đệ tử 2 túi
 
baquyen's Avatar
 
Tham gia ngày: May 2007
Bài gửi: 31
:
Trích:
Nguyên văn bởi minhcuong1122 View Post
Thật khó hiểu, e đọc datasheet của PIC 16F887. Trong đó có nói: cờ RCIF không thể xóa bằng phần mềm (read-only). Thắc mắc sao mọi người lại xóa cờ??????? HIC.
Tớ copy trong một bài luận văn tớ tìm được, hi vọng đó là câu trả lời cho bạn.

Cờ ngắt nhận RCIF=1 khi bộ nhận EUSART được kích hoạt và có một ký tự
đã được nhận trong bộ đệm nhận FIFO và chưa được đọc. Bit RCIF là bit chỉ
đọc, không thể ghi bằng phần mềm. Ngắt nhận được kích hoạt khi cấu hình
các bit sau: RCIE=1, PEIE=1 và GIE=1. Sau khi đã thiết lập các bit như trên,
ngắt nhận xảy ra ngay khi nhận xong một ký tự trong bộ đệm nhận. Cờ RCIF
được xóa bằng phần cứng khi không có ký tự nào chưa đọc trong bộ đệm
nhận.
__________________
Biển học mênh mông -- Quay đầu là bờ!
My blog

thay đổi nội dung bởi: baquyen, 01-07-2010 lúc 02:42 PM. Lý do: Viết sai chính tả :))
baquyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-03-2012, 12:35 AM   #12
lambaotrung
Đệ tử 5 túi
 
Tham gia ngày: Jan 2010
Bài gửi: 96
:
giúp đở về nắt RDA

Trích:
Nguyên văn bởi baquyen View Post
Cảm ơn anh Mr.Bi , em cũng cải tiến theo hướng dùng biến kbhit() trong CCS và nó đã chạy được

Code:
 if(kbhit())
         {
         //gtdat=getc();
         }
Cho em hỏi thêm 1 chút nhé, em muốn gửi một số có ba chữ số từ trên máy tính xuống PIC mà chưa biết làm thế nào hết, các hướng dẫn trên diễn đàn đều là gửi ký tự hết. Ém chưa nghĩ ra cách nào, bây giờ nếu em muốn có một giá trị là 31 dưới PIC thì em phải gửi ký tự a trong bảng mã ascii, làm vậy bất tiện. Em muốn đánh số vào bảng điều khiển và gửi xuống .

bác ởi giúp mình với mình cũng bị vướng ở chổ dùng ngắt RDA và truyền 1 dãy số như 123 qua rs232. hix chưa biết sao luôn. bạn có thể chia sẽ với mình tý ko. cam on nhé
lambaotrung vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-03-2012, 01:09 AM   #13
yukul
Đệ tử 1 túi
 
Tham gia ngày: Aug 2010
Bài gửi: 22
:
hoi ve ngat_timer0

trong bài của bạn có đoạn
count++; // count tang len 1 sau 256*(256-4)*4/12M = 21.504 ms
mình không hiểu chỗ này.theo nhiều bạn làm thì sẽ không nhân với 256 nữa tức là
(256-4)*4/12M =50.4 us.
mong người người giả đáp giùm được không ah.tại sao lại nhân thêm 256????
yukul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam