PDA

View Full Version : PIC 16F877A - thật là gian khổ !


PSman
10-11-2007, 10:20 PM
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.

phamthaihoa
11-11-2007, 12:33 AM
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.

sandro_bk
11-11-2007, 04:20 AM
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?

PSman
11-11-2007, 02:05 PM
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ị.

Mr.Bi
11-11-2007, 06:37 PM
#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 !

PSman
11-11-2007, 10:33 PM
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ý !

Mr.Bi
12-11-2007, 12:59 AM
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
http://i189.photobucket.com/albums/z78/NgCongMinhDN/machhoanchinh-1.jpg

Mr.Bi
12-11-2007, 01:02 AM
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

PSman
12-11-2007, 05:36 PM
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 !

honghatlhp
20-11-2011, 05:04 PM
Em làm 1 mạch về nháy led, sơ đồ trên proteus như sau:

http://i499.photobucket.com/albums/rr352/honghatl/pic16f877a.jpg

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 ạ ?

tdm
20-11-2011, 05:39 PM
Em làm 1 mạch về nháy led, sơ đồ trên proteus như sau:

http://i499.photobucket.com/albums/rr352/honghatl/pic16f877a.jpg

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

ladykiller
20-11-2011, 05:46 PM
tình hình là không được học C+ nên không biết gì lun @@

honghatlhp
20-11-2011, 06:16 PM
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
20-11-2011, 06:20 PM
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 ạ ?

Bluetek212
02-01-2012, 08:50 PM
Đ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

luuly90
08-02-2012, 11:50 PM
Mọi người ơi! cho mình hỏi là code C cho vệc hiện thị dấu chấm thập phân ở led 7 đoạn viết như thế nào đấy nhỉ? Minh đang cần.... help me