View Full Version : I/O Ports
Các bác cho em hỏi:em dùng dsPic30f6010a, port C và Port E em có thể đọc vào từng bít được mà sao em không thể đọc được bất cứ bít nào của Port B vậy?em đã khai báo hướng của cổng rất chính xác rồi.Các bít vào em đều treo lên Vcc qua trở 4,7k rồi.Riêng Port B em đặt các bít đều là hướng vào hết.Nhưng nếu e đặt 1 bít của Port B là hướng ra thì em có thể đặt nó bằng 0 hoặc bằng 1 bình thường. Các bác giải thích cho em với ạ.em mới làm việc với dspic nên còn nhiều điều bỡ ngỡ quá.
namqn
01-03-2009, 05:09 PM
Các bác cho em hỏi:em dùng dsPic30f6010a, port C và Port E em có thể đọc vào từng bít được mà sao em không thể đọc được bất cứ bít nào của Port B vậy?em đã khai báo hướng của cổng rất chính xác rồi.Các bít vào em đều treo lên Vcc qua trở 4,7k rồi.Riêng Port B em đặt các bít đều là hướng vào hết.Nhưng nếu e đặt 1 bít của Port B là hướng ra thì em có thể đặt nó bằng 0 hoặc bằng 1 bình thường. Các bác giải thích cho em với ạ.em mới làm việc với dspic nên còn nhiều điều bỡ ngỡ quá.
Sơ đồ mạch và code của bạn ra sao?
Thân,
code của em đây:
int main(void)
{
//TRISA=0xFFFF;
TRISB=0xFFFC;
TRISC=0x800A;
TRISD=0x00;
TRISE=0x03E0;
TRISF=0;
TRISG=0x03C0;
_RD6=1;
//_RD14=1;
//UART_init();
Timer1_init();
//_RD14=_RE5;
delay();
_LATD2=_RG6;
if(_RB7==1) _LATD10=1;if(_RB7==0) _LATD10=0;
//_LATB9=0;
_LATD14=_RE5;
_LATD15=_RE6;
_LATC14=0;
_LATF4=_RC3;
_LATF5=_RC1;
while(1)
{
for(j=1;j<55;j++)
{
if(i==50) _LATD6=1;
if(i==180) _LATD6=0;
}
i++;
__asm__ ("CLRWDT");
}
}
nếu em gán _LATD10=_RE5 hoặc _RC1 hay bất cứ chân vào nào của Port E, C, G thì PortD10 đều lên 1, còn nếu em gán _LATD10 bằng bất cứ bít nào của Port B thì đều đo được mức 0.Trong khi em vẫn để tất cả các đầu vào này bằng 1.Bác xem hô e với ạ!
namqn
01-03-2009, 06:24 PM
nếu em gán _LATD10=_RE5 hoặc _RC1 hay bất cứ chân vào nào của Port E, C, G thì PortD10 đều lên 1, còn nếu em gán _LATD10 bằng bất cứ bít nào của Port B thì đều đo được mức 0.Trong khi em vẫn để tất cả các đầu vào này bằng 1.Bác xem hô e với ạ!
Code mà bạn đã post chưa đầy đủ: không rõ bạn cấu hình dsPIC ra sao, các chương trình con (delay(), Timer1_init()) thực hiện những việc gì?
Bạn có các tụ ceramic 100 nF (104) giữa các cặp chân nguồn hay không?
Thân,
code đầy đủ của em đây ạ, em mới thử test các cổng I/O thôi, chưa dùng đến Timer1 cả, em không có các tụ 104 giữa các cặp chân nguồn,chỉ có 3 tụ 104 lọc nguồn đầu vào thôi:
#include <p30fxxxx.h>
#include <libpic30.h>
_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF& MCLR_EN);
unsigned char pc[24]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 20,21,22,23,24};
unsigned char pcin,i;
unsigned int count,j,k;
//void UART_init();
void Timer1_init();
void _ISR _T1Interrupt();
//void _ISR _U1RXInterrupt();
void delay();
//////////////////////////////////////////////////////////////////
int main(void)
{
//TRISA=0xFFFF;
TRISB=0xFFFC;
//TRISC=0x800A;
TRISD=0x00;
TRISE=0x03E0;
TRISF=0;
TRISG=0x03C0;
//_RD6=1;
//_RD14=1;
//UART_init();
//Timer1_init();
//_RD14=_RE5;
delay();
_LATD10=_RB6;
while(1)
{
for(j=1;j<550;j++)
{
if(i==50) _LATD6=1;/ Led nhap nhay
if(i==180) _LATD6=0;
}
i++;
}
}
/////////////////////////////////////////////////////////////////
void delay()
{
for (i=0;i<250;i++)
for(j=0;j<5000;j++);
}
namqn
01-03-2009, 08:47 PM
code đầy đủ của em đây ạ, em mới thử test các cổng I/O thôi, chưa dùng đến Timer1 cả, em không có các tụ 104 giữa các cặp chân nguồn,chỉ có 3 tụ 104 lọc nguồn đầu vào thôi:
...
Nếu phần cứng của bạn không ổn định, chuyện lạ gì cũng có thể xảy ra. Vì vậy, kiểm tra code của bạn không giúp ích được nhiều. Code hiện thời của bạn không có gì bất thường.
Bạn cần thêm các tụ decoupling 100 nF vào giữa 5 cặp chân nguồn của dsPIC. Đảm bảo tần số thạch anh nằm trong khoảng 4 - 10 MHz, và cũng chú ý mục 14 của errata sheet sau:
http://ww1.microchip.com/downloads/en/DeviceDoc/80258G.pdf
Thân,
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.