PDA

View Full Version : Mở rộng đầu ra của pic 18f4431


saobang_1010
28-02-2010, 11:21 AM
Chào các anh chị và các bạn trên diễn đàn, em muốn hỏi vấn đề liên quan đến việc mở rộng đầu ra cho pic .Ở đây em mở rộng bằng cách quét 74151 (dmux), em viết chương trình và mô phỏng trên protues chạy đúng nhưng khi nạp xuống mạch thật lại chạy không đúng.Cụ thể là trong chương trình tại một thời điểm em chỉ quét một địa chỉ và đợi tín hiệu tác động vào đúng chân ứng với địa chỉ đó , ví dụ như a=0,b=0,c=0 ứng với D0 nhưng khi chạy thực tế thì lại không đúng như vậy tác động vào bất kì đầu vào nào ví dụ như D1,d2... đều chạy các chương trình như nhau , em không hiểu tại sao, mong mọi người giúp em với không biết chương trình em sai ở đâu ạ.
Đây là chương trình của em.
#include <18f4431.h>
#use delay (clock=20M)
#fuses nowdt, hs,noprotect, nolvp,hpol_low
#include <lcd_lib_4bitrobo.c>
//*********************************************
#byte TRISE = 0xF96
#byte TRISD = 0xF95
#byte TRISC = 0xF94
#byte TRISB = 0xF93
#byte TRISA = 0xF92
#byte LATE = 0xF8D
#byte LATD = 0xF8C
#byte LATC = 0xF8B
#byte LATB = 0xF8A
#byte LATA = 0xF89
#byte PORTD = 0xF83
#byte PORTC = 0xF82
#byte PORTA = 0xF80
#byte PORTE = 0xF84
#byte PORTB = 0xF81
#bit d1= portd.4
#bit c1= portc.7
#bit b1= portc.6
#bit a1=portc.5
#bit y=portc.4
int8 a,b,c,d;
//------------------------------------------------
void main ()
{ trisb=0x00;
trisc=0b00010000;
trisd=0x00;
trisa=0xff;
trise=0x00;
output_high (pin_b1);
output_high (pin_b3);
output_high (pin_b4);
output_high (pin_d7);

setup_power_pwm(PWM_CLOCK_DIV_4 | PWM_FREE_RUN ,1,0,300,0,1,0);
setup_power_pwm_pins(PWM_ODD_ON,PWM_ODD_ON,PWM_ODD _ON,PWM_ODD_ON);
set_power_pwm0_duty(0);
set_power_pwm2_duty(0);
set_power_pwm4_duty(0);
set_power_pwm6_duty(0);
{

set_power_pwm0_duty(300);
while (true)
{
d=0;c=1;b=0;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{

set_power_pwm0_duty(0);
set_power_pwm2_duty(500);
break;}}
delay_ms(500);

while (true)
{
d=0;c=0;b=1;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{
set_power_pwm2_duty(0);

set_power_pwm4_duty(300);
break;}}
delay_ms(500);

while (true)
{
d=0;c=0;b=0;a=1;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{ set_power_pwm4_duty(0);

set_power_pwm6_duty(300);

break;}}

while (true)
{
d=0;c=0;b=0;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{ // set_power_pwm4_duty(0);

set_power_pwm6_duty(0);

break;
}
while (true)
()
}

namqn
28-02-2010, 04:23 PM
Một chương trình mà có đến 5 lệnh while (true) là không ổn. Bạn xem lại thuật toán và cách thể hiện thuật toán.

Thân,

saobang_1010
28-02-2010, 05:21 PM
EM cảm ơn bác nhưng em thấy tuy dùng 5 vong lặp while (true) nhưng khi có điều kiện đúng thì thoát ra khỏi vòng lặp luôn nhờ lệnh break mà. Như vậy em thấy không sai.

namqn
28-02-2010, 07:28 PM
EM cảm ơn bác nhưng em thấy tuy dùng 5 vong lặp while (true) nhưng khi có điều kiện đúng thì thoát ra khỏi vòng lặp luôn nhờ lệnh break mà. Như vậy em thấy không sai.
Đành rằng về logic thì không sai, nhưng đoạn code của bạn viết cứ vòng đi vòng lại những dòng lệnh thiết lập trạng thái các bit ngõ ra, rồi đọc ngõ vào ngay sau đó, cho đến khi đạt điều kiện break (Nếu trình dịch xử lý không tốt, dễ bị ảnh hưởng của hiệu ứng read-modify-write).

Tại sao không làm theo cách sau (code hình thức):
//Trường hợp 1

{Các lệnh thiết lập ngõ ra cho trường hợp 1}
while (ngõ vào == 0); //Chờ đến khi ngõ vào chuyển sang trạng thái '1'
{Thực hiện các thao tác cần thiết cho trường hợp 1}

// Trường hợp 2

{Các lệnh thiết lập ngõ ra cho trường hợp 2}
while (ngõ vào == 0); //Chờ đến khi ngõ vào chuyển sang trạng thái '1'
{Thực hiện các thao tác cần thiết cho trường hợp 2}

...

// Trường hợp n

{Các lệnh thiết lập ngõ ra cho trường hợp n}
while (ngõ vào == 0); //Chờ đến khi ngõ vào chuyển sang trạng thái '1'
{Thực hiện các thao tác cần thiết cho trường hợp n}

while (true) ; //Vòng lặp vô tận chính, không làm gì cả

Bạn cũng chú ý kiểu dữ liệu của a, b, c, và d không giống với của a1, b1, c1, và d1 (tùy theo trình dịch mà có thể gây ra vấn đề hay không). Và với PIC18, bạn nên xuất ra thanh ghi LATx, và đọc về từ thanh ghi PORTx.

Thân,

saobang_1010
01-03-2010, 07:51 AM
Vâng em đã cảm ơn sự chỉ bảo tận tình của bác , em đã sửa và chạy được chương trình, em sẽ cố gắng hoàn thiện hơn kiến thức của mình .