PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Ngắt RB0 và MCLR ? (http://www.picvietnam.com/forum/showthread.php?t=4124)

thaithien 15-05-2009 10:15 PM

Ngắt RB0 và MCLR ?
 
1 Attachment(s)
Mình viết đoạn code như sau,sử dụng ngắt ngoài RB0 và mạch reset.Mô phỏng bằng proteus thì rất tốt nhưng khi nạp vào pic thì lại không như mô phỏng.Đúng ra thì bắt đầu chương trình thì sẽ thực hiện các lệnh nằm trong main() trước nhưng thực tế thu được là :khi bắt đầu cấp nguồn cho pic thì nó thực hiện ngắt trước ,sau đó mới chạy vào hàm main() và chạy.Sau đó nếu nhấn reset thì lại tiếp tục như vậy.Mình xài ngắt ngoại,liệu reset ở MCLR có được hiểu là một laọi ngắt ngoại không ?Phải cấu hình cho pic thê nào để nó chạy đúng như mô phỏng trong trường hợp này ?

meishun 16-05-2009 12:26 AM

MCLR la ngắt có mức độ ưu tiên cao nhất ! Có thể chương trình bạn có bugs. Hãy dò lại 1 cách kỹ lưỡng xem. Tôi thấy hàm ngắt thực hiện việc hiển thị giống hàm main. Có khi nào bạn lầm lẫn trog việc quan sát kết quả? Bugs nằm ở đó. Thêm nữa, bạn đừng nghĩ sử dụng hàm xây dựng sẵn của trình biên dịch thì có nghĩa là ko cần quan tâm các bit cấu hình cũng như các thanh ghi ko liên quan đến module mình đang dùng. Ở đây bạn dùng ngắt ngoài, nên để ý các thanh ghi liên quan ngắt.

thaithien 16-05-2009 05:39 AM

Vậy phải cấu hình như thế nào?Hàm ngắt làm công việc giống hàm main() nhưng chuỗi hiển thị thì khác (đó là ý đồ chính ).Có lẽ vấn đề ở đây là cấu hình pic để nó giống với mô phỏng thôi vì mô phỏng đâ chạy được

thaithien 10-06-2009 02:11 AM

Vấn đề sao vậy trời .Mô phỏng Proteus chính xác mà.

bien_van_khat 10-06-2009 09:57 AM

Trích:

Nguyên văn bởi thaithien (Post 26650)
Vấn đề sao vậy trời .Mô phỏng Proteus chính xác mà.

Vấn đề là mô phỏng ko thể mô phỏng được tất cả mọi yếu tố mà chúng ta gặp khi chạy thực tế.

Trong chuơng trình chính bạn nên xóa cờ ngắt ngoài trước khi enable ngắt ngoài.

phamhoangthong 10-06-2009 12:23 PM

Em thử sd POR(power on reset) & PWTR(power up timer)
anh nghỉ mạch em bị nhiểu trên chân RB0

thaithien 10-06-2009 02:05 PM

Ngay khi cấp nguồn cho nó chạy thì nó lại nhảy vô chương trình ngắt luôn vậy đó.Để em thử cách cua anh phamhoangthong.Cảm ơn 2 anh phamhoangthong và bien_van_khat.

thienlong 07-10-2009 10:25 AM

ngat rb0
 
minh dang lam ve dieu khien dong co mot chieu.minh dung ngat rb0 de dk toc do dong co theo cac cap khac nhau.nhung khi minh mo phong thi ko ngat dc.bac nao da lam roi cho minh them y khien dc ko???

lequocbao 07-10-2009 11:18 AM

Trích:

Nguyên văn bởi thienlong (Post 30020)
minh dang lam ve dieu khien dong co mot chieu.minh dung ngat rb0 de dk toc do dong co theo cac cap khac nhau.nhung khi minh mo phong thi ko ngat dc.bac nao da lam roi cho minh them y khien dc ko???

cho code lên coi thử bạn!

Delfy_Coltech 29-11-2009 11:55 PM

Ngắt ngoài bị nhiễu! Help help!
 
Hi all!
Em cũng đang gặp rắc rối với chú ngắt ngoài RB0. Xin ý kiến của các tiền bối.
Em làm một hệ thống đếm sản phẩm hiển thị 3 LED 7 đoạn.

Gồm 1 MCU điều khiển chung và các module nhỏ.
Riêng module hiển thị LED 7. Em dùng hẳn 1 chú 16F877(Pic_Slave) để điều khiển việc hiển thị LED.

http://i560.photobucket.com/albums/s...on/LED_DIS.jpg

Cứ mỗi lần tín hiệu truyền về chân RC7(Xảy ra ngắt RDA), thì thực hiện đoạn mã:

Code:

output_high(PIN_A0)
delay_ms(100);
output_low(PIN_A0);
delay_ms(100);

Mục đích là tạo ngắt ngoài RB0 cho Pic_Slave. Và tăng biến đếm sản phẩm.

Về code thì đã OK.

Xong khi Em làm mạch và test thì xảy ra hiện tượng chân RBO bị nhiễu mỗi lần cắm Adapter nguồn, hoặc bật công tắc nguồn.
Ngay cả sờ tay vào đường mạch nối tới chân RB0 đó, cũng xảy ra ngắt!
Em nghĩ có thể do mình không phủ mass nên mạch bị nhiễu.

Đây là mạch in của Em.

http://www.fileden.com/files/2009/5/...718/LED_in.jpg

Bi giờ phải khác phục sao đây các bác! (Em không muốn làm lại mạch! :))
Thanks alot!

bien_van_khat 30-11-2009 08:35 AM

Dựa trên sơ đồ, mình nghĩ con PIC bên trái của bạn sẽ kéo chân RA0 lên logic 1 hoặc xuống logic 0 để gây ngắt ở con PIC bên phải.

Nhưng vấn đề là khi khởi động chân RA0 là Tris-state, do đó có 1 khoảng thời gian chân RB0 của PIC-phải sẽ lơ lửng nên nhiễu từ môi trường sẽ tác động làm thay đổi mức logic trên chân RB0 gây ra ngắt.

Ngay khi khởi động bạn cần đưa chân RA0 về logic 0 hoặc logic 1.
Tốt hơn, bạn nên hàn 1 con điện trở 10K nối thằng từ RB0 lên Vdd, khi nào cần gây ngắt thì xuất logic 0 ra chân RA0.

Delfy_Coltech 30-11-2009 10:48 AM

Thank U!
 
Trích:

Nguyên văn bởi bien_van_khat (Post 31798)
Dựa trên sơ đồ, mình nghĩ con PIC bên trái của bạn sẽ kéo chân RA0 lên logic 1 hoặc xuống logic 0 để gây ngắt ở con PIC bên phải.

Nhưng vấn đề là khi khởi động chân RA0 là Tris-state, do đó có 1 khoảng thời gian chân RB0 của PIC-phải sẽ lơ lửng nên nhiễu từ môi trường sẽ tác động làm thay đổi mức logic trên chân RB0 gây ra ngắt.

Ngay khi khởi động bạn cần đưa chân RA0 về logic 0 hoặc logic 1.
Tốt hơn, bạn nên hàn 1 con điện trở 10K nối thằng từ RB0 lên Vdd, khi nào cần gây ngắt thì xuất logic 0 ra chân RA0.

Cảm ơn Anh nhé!
Em cũng đã khắc phục được bằng các khởi động MCU trước! Rồi khởi động module LED Drive sau.

Nhưng cách hàn thêm trở của Bác chắc là tối ưu hơn đó! Để Em thử nào.
Many thanks!

Delfy_Coltech 01-12-2009 01:43 AM

Cảm ơn Anh Biển nha!
Bây giờ mới có thời gian sửa lại!
Tuyệt vời! Đã hết nhiễu nhờ hàn thêm trở cho chân RBO của Slave_Pic.

Mời bác 1 ly cafe nào!

http://www.tinnhanhblog.com/images/a.../u16_coffe.jpg

Delfy_Coltech 19-12-2009 01:07 AM

[Help] Continue with RDA interrupts question...???
 
Hi all!
Em gặp một lỗi về thời gian xảy ra ngắt RDA.

Tiếp tục với cái project của Em như ở bài trên.
Tư tưởng như sau:
- Khi có tín hiệu về chân RC7, xảy ra ngắt RDA. Biến đếm tăng lên 1 đơn vị.
--> Tăng biến đếm led, hiển thị LCD.
Code của Em như sau:

Code:

// LCD Display function

VOID LCD_Display()
  {
      LCD_init();
      Printf(LCD_putchar,"START...");
      delay_ms(500);
      LCD_putcmd(0x80);// The first line
      Printf(LCD_putchar,"PRODUCT COUNTER");
      delay_ms(500);
      LCD_putcmd(0xC0); // The second line
      Printf(LCD_putchar,"PRO.NUMBER: ");
    } 
     
// Interrupts function
   
#INT_RDA
    VOID src_rda()
      {             
          ................
          sanpham++;
          // Create interrupts for PIC_Slave
          OUTPUT_HIGH(PIN_A0);
          OUTPUT_LOW(PIN_A0);
        // Clear interrupts flag. 
      RCIF=0x00;
      }
           
//4. Main program
VOID main()

  TRISA=0X00;
  PORTA=0XFF;
  LCD_Display();
  enable_interrupts(GLOBAL);
  enable_interrupts(INT_RDA);
  WHILE(TRUE)   
       
        {   
          delay_ms(100);         
        }
 }

Lỗi Em gặp phải là hàm ngắt không thực thi được ở lần khởi động đầu tiên và phải reset lại Master_Pic thì mới thực hiện được.

Em nghĩ là do hàm LCD_Display().
Khi Em bỏ hàm LCD_Display() trong void main() đi thì ngắt được, nhưng phải đến lần thứ 2 mới xảy ra ngắt (sản phẩm đầu bị bỏ qua không đếm)--> Why?

Các bác cho Em hỏi:
1. Đối với ngắt RDA thì nó cần bao nhiêu ms để khởi tạo xong và phải làm thế nào để khắc phục lỗi trên của Em.
2. Viết lệnh thế nào để dòng thứ 2 của LCD hiển thị số thứ tự sản phẩm chạy qua? (Chú LCD_putchar(sanpham) đặt ở đâu? Vì đặt trong hàm ngắt thì Em thấy có warning.)

Cảm ơn các bác rất nhiều!

Delfy_Coltech 21-12-2009 10:48 PM

Up nào! Các hảo huynh đệ đâu hết rùi. Bắt lỗi giúp Em với!


Múi giờ GMT. Hiện tại là 10:17 AM.

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