PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và 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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 10-11-2007, 10:20 PM   #1
PSman
Nhập môn đệ tử
 
Tham gia ngày: Nov 2006
Bài gửi: 9
:
PIC 16F877A - thật là gian khổ !

Thật là gian khổ với PIC quá.

Em làm xong board mạch test PIC16F877A, nạp source qua Tiny bootloader đã OK. Làm cái file hex đơn giản nhất trên đời là test port B bằng CCS. Mô phỏng proteus OK. Đổ vào mạch qua TinyBL OK. Nhưng triệu chứng như sau :

- Nếu test đơn giản là cho port B = 0x00 hoặc 0xFF hoặc từng bit riêng thì PIC chạy đúng, Led sáng hoặc tắt đúng. Nhưng mà thêm phần lặp delay để nó nháy led thì PIC chạy nửa chừng rồi treo. Đo áp port B cũng bằng 0V k thay đổi gì cả.

- Nạp hex trực tiếp bằng mạch nạp ngoài (đã nạp firmware bootloader tốt) thì nó vẫn không chạy đúng (nhấp nháy Led).

- Dùng MPLAB biên dịch thử đoạn asm nháy led (của bác ntc), proteus vẫn chạy tốt, nhưng qua mạch thật Led vẫn k chịu nháy.

- Tình hình là cứ đến delay_ms là nó đứng.

Suy luận của em : đã nạp fw bootloader cho PIC và chạy tốt, bật/tắt vài con Led PIC chạy đúng. Vậy chứng tỏ mạch nạp đúng, mạch test đúng, mạch Bootloader đúng.
Vậy hà cớ gì nhấp nháy không được ?

Em đã thử trên 2 con, và phản ứng là như nhau. Sure là PIC không điên.
Thạch anh 20MHz, tụ 33p (chắc k quan trọng).

Mấy bác gỡ dùm em với. Hiện tượng hiếm có

#include <16F877A.h>
#include "def_877A.h"
#device *=16
#device adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

trisb = 0x00;
trisc = 0x00;
portc = 0x00;
portb = 0xff;

While(1)
{
portb = 0x00; // <-- nếu thay bằng 0xFF thì Port B sáng, 0x00 là Led tắt luôn.
delay_ms(250); //<-- dừng ở đây thì phải (?)
portb = 0xff;
delay_ms(250);
}
}

proteus và hex nằm trong rar bên dưới. Chú thích nhỏ là em lười cắm mass rời cho Led nên cắm nguyên bus vào 1 port c và dập nó xuống đất.
File Kèm Theo
File Type: rar Test PIC 16F877A.rar (14.5 KB, 263 lần tải)

thay đổi nội dung bởi: PSman, 12-11-2007 lúc 05:36 PM.
PSman vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2007, 12:33 AM   #2
phamthaihoa
Đệ tử 3 túi
 
Tham gia ngày: Jun 2005
Bài gửi: 56
:
Tớ không dùng CCS, nhưng đoán nguyên nhân gây lỗi nằm ở 1 trong 2 lệnh này: setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

Có thể hàm delay_ms dựa trên 1 trong 2 timer trên, bạn disable nó thì chạy sao đây, có lẽ trong hàm delay_ms nó hỏi vòng cờ ngắt của timer để tính thời gian. Timer không chạy thì nó mắc ở đấy.
phamthaihoa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2007, 04:20 AM   #3
sandro_bk
Đệ tử 4 túi
 
sandro_bk's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 66
:
nếu bác ko xài ADC,SPI,Timer1,Timer2 thì khai báo làm gì?mấy cái lệnh delay ko đụng gì đến timer cả nên ko cần khai báo làm gì,CCS có hỗ trợ hàm output_X(value);sao bác ko xài?

thay đổi nội dung bởi: sandro_bk, 11-11-2007 lúc 04:30 AM.
sandro_bk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2007, 02:05 PM   #4
PSman
Nhập môn đệ tử
 
Tham gia ngày: Nov 2006
Bài gửi: 9
:
Các bác ơi,
Em không hiểu được, vì sao mạch lại không chạy đến nơi đến chốn cái ví dụ đơn giản đó.

- Mạch chạy tốt, vì mạch không chạy thì nó đã k nhận được data từ tinyBL gởi xuống. Thậm chí TinyBL detect PIC rất tốt và nhạy.

- Test port thì luôn OK, bật/tắt từng chân ở bất kì port nào đều OK hết. Gởi qua TinyBL là thấy Led ngay.

- Nạp trực tiếp từ mạch nạp (FENG 3), PIC vẫn không nhấp nháy Led. Mạch này đã nạp firmware BLoader cho PIC chạy tốt, nên mạch nạp không vấn đề gì.

- Không dùng CCS nữa, em load vd asm sẵn của bác NTC, về biên dịch bằng MPLAB, đổ vào nó cũng không chạy. Vẫn là nhấp nháy Led, chứ sáng luôn asm vẫn làm nó sáng. Hiện tượng tương tự như CCS ở trên.

- Tất cả các source đều chạy tốt với Proteus. Mô phỏng cái đơn giản ấy Proteus chắc không sai.

- Test trên 2 con PIC, phản ứng là như nhau !

Chừng đó mà làm không xong nữa, nói chi đến viết code dài rồi đổ vào nó chạy lung tung chắc em điên quá.

Bao nhiêu code Keil-C bên 8951 giờ lại phải chuyển sang CCS, cũng hơi mệt. Ngày trước em làm 8951 cũng gặp cái lỗi hết sức vớ vẩn là quên nối chân 31 lên nguồn, thế là port 8951 cứ nhảy loạn xị.
PSman vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2007, 06:37 PM   #5
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Code:
#include <16F877A.h>
#include <def_877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NOLVP
#use delay(clock=20000000)

void main()
{ set_tris_b(0x00);   
   
  While(1)
  {
    portb = 0x00; 
    delay_ms(1000); 
    portb = 0xff;
    delay_ms(1000);
  } ;
}
đúng là bạn viết code phức tạp wa ! cái nào ko dùng thì viết vào làm gì cho rắc rối !
bạn delay 250ms thì đố ai thấy đc nó nháy !

thay đổi nội dung bởi: Mr.Bi, 11-11-2007 lúc 06:40 PM. Lý do: delay hơi ít
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2007, 10:33 PM   #6
PSman
Nhập môn đệ tử
 
Tham gia ngày: Nov 2006
Bài gửi: 9
:
Em delay từ 250 -> 2000 không có cái nào chạy hết. Code asm chuẩn còn không chạy nữa là.
Mai em chuyển PIC sang board test cắm chân, làm lại mạch mới thử xem sao. Thật vô lý !
PSman vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2007, 12:59 AM   #7
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
mình đang test thấy nó chạy rầm rầm ấy mà ! Bạn bị lỗi kết nối phần cứng rùi !
bạn bỏ những phần như LCD , Key ko dùng đi ! nối y như thế , đảm bảo chạy ngay ! bạn nối led vào portB nha
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2007, 01:02 AM   #8
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Mình lấy luôn hình đồ án đang làm nên chắc bạn rối ! cứ nhìn chân con PIC là bạn nối biết rùi
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2007, 05:36 PM   #9
PSman
Nhập môn đệ tử
 
Tham gia ngày: Nov 2006
Bài gửi: 9
:
Em tức quá, làm cái board test mới, loại cắm chân. Cũng chẳng buồn gắn mấy con tụ 33p nữa. Vậy mà mạch chạy ngon lành.

Chắc board mạch in kia bị lỗi gì rồi.

Nhưng vẫn thắc mắc mãi, tại sao bị lỗi mà tiny vẫn nhận OK, tải hex xuống điều khiển port vẫn OK, vậy mà k nháy được.

Thôi vứt quách cái board kia đi, làm board mới thế là xong. Đỡ nhức đầu.
Cám ơn mọi người nhiều !

PIC 16F877A - thật là ... đơn giản !
PSman vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-11-2011, 05:04 PM   #10
honghatlhp
Nhập môn đệ tử
 
Tham gia ngày: Nov 2011
Bài gửi: 3
:
Em làm 1 mạch về nháy led, sơ đồ trên proteus như sau:



em dùng file hex của anh psman nạp vào pic thì chạy ngon lành, nhưng copy code của anh ấy vào css, chọn compile thì nó báo undefined trisb, trisc, em làm thêm cái int8 trisb,trisc thì compile ra được file hex, nhưng nạp vào thì pic không chạy.

Như vậy là em gặp lỗi gì ạ ? Khắc phục như nào ạ ?
honghatlhp vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-11-2011, 05:39 PM   #11
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi honghatlhp View Post
Em làm 1 mạch về nháy led, sơ đồ trên proteus như sau:



em dùng file hex của anh psman nạp vào pic thì chạy ngon lành, nhưng copy code của anh ấy vào css, chọn compile thì nó báo undefined trisb, trisc, em làm thêm cái int8 trisb,trisc thì compile ra được file hex, nhưng nạp vào thì pic không chạy.

Như vậy là em gặp lỗi gì ạ ? Khắc phục như nào ạ ?
trong thư mục chứa code của bạn thiếu file này: "def_877A.h"
copy file sau vào thư mục chứa code thì sẽ hết lỗi
File Kèm Theo
File Type: zip file.zip (2.4 KB, 30 lần tải)
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-11-2011, 05:46 PM   #12
ladykiller
Đệ tử 3 túi
 
Tham gia ngày: Nov 2011
Bài gửi: 58
:
tình hình là không được học C+ nên không biết gì lun @@
ladykiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-11-2011, 06:16 PM   #13
honghatlhp
Nhập môn đệ tử
 
Tham gia ngày: Nov 2011
Bài gửi: 3
:
ngon rồi ạ, thanks anh tdm

thầy giáo em bảo làm nghiên cứu khoa học về pic 16f877a, thực hành thì em làm được cái này rùi, bi giờ trình bày thế nào ạ ? Theo form nào ? Phải trình bày những vấn đề gì ạ ?
honghatlhp vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-11-2011, 06:20 PM   #14
honghatlhp
Nhập môn đệ tử
 
Tham gia ngày: Nov 2011
Bài gửi: 3
:
và code trên có thể rút gọn lại được không ạ ? Nên bỏ những code nào không dùng đến ạ ?
honghatlhp vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-01-2012, 08:50 PM   #15
Bluetek212
Đệ tử 1 túi
 
Tham gia ngày: Sep 2008
Bài gửi: 12
:
Đoạn code này đơn giản chớp tắt cả port B thôi,
Nếu chỉ đơn giản là bật tắt port thì không cần phải setup ADC,SPI... nó chẳng liên quan gì cả.
Hy vọng giúp ích cho bạn!
//Start of code
#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NOLVP
#use delay(clock=20000000)
#use fast_io(b)//dùng port B

void main()
{
set_tris_b(0); //set Port B ở chế độ output

While(1)
{
output_b(0x00);
delay_ms(200);
output_b(0xff);
delay_ms(200);
} //end of while
}//end of void main()
//-----End of code
Bluetek212 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à 08:45 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