PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   Mach den trang tri (http://www.picvietnam.com/forum/showthread.php?t=855)

tmtm 03-09-2008 10:44 PM

Em đang thử với portA, em dùng 1 đoạn code sau để kiểu tra xem chân RA0 đã thành 1 chân I/O chưa.
Code:

#include <16F877a.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT, NOLVP
#use delay(clock=4000000)
#use fast_io(a)
main()
{
ADCON1 = 0x06;
TRISA = 0x00;
While(1);
{
output_a(1);
delay_ms(1000);
output_a(0);
}
}

Chân RA0 được nối tới Anot của một led, Katot của led nối mass. Vậy mà led cứ sáng suốt. Ko hiểu sai chỗ nào. Việc thiết lập portA dựa vào hướng dẫn của anh Nam tại đây http://www.picvietnam.com/forum//showthread.php?t=901
Các bác xem giúp em với!

namqn 03-09-2008 11:06 PM

Sau output_a(0) bạn cần delay một khoảng thời gian thì mới thấy nó bị tắt (thêm vào delay_ms(1000) chẳng hạn).

Thân,

0509592 04-09-2008 01:56 AM

uh! thì tôi cũng dùng CCS C mà!
Trích:

nguyên văn bởi: tmtm
ví dụ, ta muốn tất cả các đầu ra ở mức cao thì ta phải gửi tới A2 dữ liệu là 0x07 phải ko ah? Vấn đề là chỉ nối 1 chân vi điều khiển tới A2 thì bạn sẽ làm thế nào để gửi 0x07 tới được? Bạn có thể giúp mình chỗ này được chứ?
bạn muốn làm được điều này thì bạn phải viết một thủ tục gửi từng bit dữ liệu cho ic ghi dịch!
đơn giản thế này nhe!
Code:

void send(unsigned char data)
{
portb0=0;//nối portb0  với chân clock và cho reset về mức 0
portb1=0x01&data;//chân portb1 nối vào một chân data. vậy giá trị đầu ra là một bit
//đầu tiên ở mức cao hay thấp tùy vào biến data
portb0=1;//kích chân clock lên mức cao
delay_us(10);
portb0=0;//nối portb0  với chân clock và cho reset về mức 0
portb1=0x02&data;//chân portb1 nối vào một chân data. vậy giá trị đầu ra là một bit
//thứ hai ở mức cao hay thấp tùy vào biến data
portb0=1;//kích chân clock lên mức cao
//.......... cứ tiếp tục cho đến đầu ra số 7 (QH)

}
void main()
{

//rồi vào chương trình chính thì bạn chỉ viêc gọi thủ tục ra với mong muốn đầu ra
//nào được set lên cao đầu ra nào ở mức thấp.
//giả sử mình muốn đầu ra QA và QB là cao còn lại là thấp thì gọi ra
send(0x03);
//như vậy là QA và QB mức cao.
//tương tụ với các đầu ra khác.
}

như vậy bạn có thể điều khiển đầu ra của thanh ghi dịch theo ý muốn.

Trích:

nguyên văn bởi: tmtm
Vấn đề là khai báo như thế nào? Ở trên thì bác Nam đã chỉ ra cách làm, mình hay dùng CCSC, mình cũng chưa kịp thử. Bạn làm như thế nào với vấn đề này bằng CCSC?
thì bạn định nghĩa porte như sau:
#byte porte =0x09
#byte trise=0x89;
khi vào chương trình chính thì bạn chỉ cần khai báo
porte là cổng I/O
trise=0x00;//cổng ra
chúc bạn thành công.
code của bạn được sửa và tôi thêm doạn porte vào cho bạn như sau:
Trích:

#include <16F877a.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT, NOLVP
#use delay(clock=4000000)
#use fast_io(a)
main()
{
ADCON1 = 0x06;
TRISA = 0x00;
trise=0x00;
While(1);
{
output_a(1);
delay_ms(1000);
output_a(0);
delay_ms(1000);
output_port_e(0x07);//cả porte cùng sáng
delay_ms(1000);
output_port_e(0x00);//cả porte cùng tắt
delay_ms(1000);//nếu bạn muốn dùng từng bit một thì định nghĩa như bạn đã làm
//cho porta.

}
}
-------------**^^o0o^^**-------------
"tháng ngày dong duổi cuộc đời
nhớ người cố hữu hẹn ngày tái ngộ"

tmtm 04-09-2008 08:17 AM

Trích:

Nguyên văn bởi 0509592 (Post 18620)
//giả sử mình muốn đầu ra QA và QB là cao còn lại là thấp thì gọi ra
send(0x03);

Bạn có thể giải thích rõ hơn về dòng lệnh này dược ko? Nếu ta sử dụng 2 chân RB2 & RB3 để điều khiển 1 IC74HC164 thứ 2 ... RB4 & RB5 điều khiển IC74HC164 thứ 3... thì ta phải xử lý như thế nào?

cskiller 04-09-2008 10:24 AM

Trích:

Nguyên văn bởi tmtm (Post 18624)
Bạn có thể giải thích rõ hơn về dòng lệnh này dược ko? Nếu ta sử dụng 2 chân RB2 & RB3 để điều khiển 1 IC74HC164 thứ 2 ... RB4 & RB5 điều khiển IC74HC164 thứ 3... thì ta phải xử lý như thế nào?

Khi bạn thiết kế với nhiều Port bạn có thể gom chúng lại để việc điều khiển và quản lý code dễ dàng hơn.
Nếu ngoài output bạn muốn sử dụng nhiều nhiều hiệu ứng hơn thì đồng thời với xuất ra led bạn nên dùng 1 buffer đi kèm theo để lưu lại.
Code:

//////////////////////////////////Data - CLK, Data - CLK, ...
#define PORT_NUMBER    4
const unsigned long PORT_TABLE[PORT_NUMBER*2]={PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7};
unsigned char PortData[PORT_NUMBER];

//prototype
void Write2Led();
void WritePort2Led(int port_num,unsigned char data);
void WriteByte(int port_num,unsigned char data);
void WriteBit(int bit_num,unsigned short data);
void WriteInt32(int32 data);
void WriteArray(unsigned char data[PORT_NUMBER]);

//Update all data to leds
void Write2Led()
{
  int i,j;
  for(i=0;i<PORT_NUMBER;i++){
      WritePort2Led(i,PortData[i]);
  }
}

//Update data port to leds
void WritePort2Led(int port_num,unsigned char data)
{
  int i;
  for(i=0;i<8;i++){
      output_bit(PORT_TABLE[port_num],data&0x01);
      output_high(PORT_TABLE[port_num+1]);
      delay_us(1);
      data>>=1;
      output_low(PORT_TABLE[port_num+1]);
  }
}

//Write 1 byte data to buffer and update to leds
void WriteByte(int byte_num,unsigned char data)
{
  PortData[byte_num]=data;
  WritePort2Led(byte_num,data);
}

//Write 1 bit data to buffer and update to leds
void WriteBit(int bit_num,unsigned short data)
{
  PortData[bit_num/8]=(data == 0x01)?(PortData[bit_num/8]|(data&0x01)<<(bit_num%8)):(PortData[bit_num/8]&(~(data&0x01)<<(bit_num%8)));
  WritePort2Led(bit_num/8,PortData[bit_num/8]);
}

//Write 1 integer 32 bits data to buffer and update to leds
void WriteInt32(int32 data)
{
  int i;
  for(i=0;i<PORT_NUMBER;i++){
      PortData[i]=data&0xFF;
      data>>=8;
  }
  Write2Led();
}

//Write 1 array data to buffer and update to leds
void WriteArray(unsigned char data[PORT_NUMBER])
{
  int i;
  for(i=0;i<PORT_NUMBER;i++){
      PortData[i]=data[PortData];
  }
  Write2Led();
}

Good luck!

0509592 04-09-2008 01:50 PM

Trích:

nguyên văn bởi: tmtm
Trích:
Nguyên văn bởi 0509592
//giả sử mình muốn đầu ra QA và QB là cao còn lại là thấp thì gọi ra
send(0x03);

Bạn có thể giải thích rõ hơn về dòng lệnh này dược ko? Nếu ta sử dụng 2 chân RB2 & RB3 để điều khiển 1 IC74HC164 thứ 2 ... RB4 & RB5 điều khiển IC74HC164 thứ 3... thì ta phải xử lý như thế nào?
thứ nhất dòng lệnh send(0x03);
đây là lệnh gọi chương trình con void send(unsigned char data)
đã viết ở trên
bạn nhìn vào hàm send ở trên thì thấy nếu gọi send(0x03); thì data =0x03
//
portb0=0;//nối portb0 với chân clock và cho reset về mức 0
portb1=0x01&data;//chân portb1 nối vào một chân data. vậy giá trị đầu ra là một bit
//đầu tiên ở mức cao hay thấp tùy vào biến data
portb0=1;//kích chân clock lên mức cao

portb0=0;//nối portb0 với chân clock và cho reset về mức 0
portb1=0x02&data;//chân portb1 nối vào một chân data. vậy giá trị đầu ra là một bit
//đầu tiên ở mức cao hay thấp tùy vào biến data
portb0=1;//kích chân clock lên mức cao
//
thì ở đây sẽ có hai giá trị được tính đó là portb1=0x01&0x03; ta được 0x01; QA mức cao.
và portb1=0x02&0x03; ta được 0x02//QB=1; mức cao.
tương tự nếu bạn làm cho các đầu ra QAN ; QGN khác!
còn khi bạn sử dụng 2 chân data của một IC và dùng hai IC thì cũng làm tương tự.
nếu bạn nối vào 2 chân RB2 & RB3 thì đầu ra là kết quả của phép and giữa RB2 và RB3, bạn cũng làm tương tự như trên .
chúc bạn thàng công.
------------**^^o0o^^**-------------
"tháng ngày dong duổi cuộc đời
nhớ người cố hữu hẹn ngày tái ngộ"

thaobeo 27-09-2008 11:09 AM

em cũng muốn tìm hiểu thêm xem thế nào các anh cứ chỉ giáo đi rồi em học hỏi

thaobeo 27-09-2008 11:15 AM

thử xem nào


Múi giờ GMT. Hiện tại là 08:37 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