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 28-02-2010, 11:21 AM   #1
saobang_1010
Nhập môn đệ tử
 
Tham gia ngày: Jan 2009
Bài gửi: 5
:
Mở rộng đầu ra của pic 18f4431

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.
Code:
#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)
			()	
			}

thay đổi nội dung bởi: namqn, 28-02-2010 lúc 04:21 PM. Lý do: định dạng code
saobang_1010 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-02-2010, 04:23 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-02-2010, 05:21 PM   #3
saobang_1010
Nhập môn đệ tử
 
Tham gia ngày: Jan 2009
Bài gửi: 5
:
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.
saobang_1010 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-02-2010, 07:28 PM   #4
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saobang_1010 View Post
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):
Code:
//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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-03-2010, 07:51 AM   #5
saobang_1010
Nhập môn đệ tử
 
Tham gia ngày: Jan 2009
Bài gửi: 5
:
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 .
saobang_1010 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à 10:00 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