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 16-08-2006, 08:28 PM   #61
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 tinhthanthep
Tiện thể hỏi thêm một câu nữa: để chuyển giá trị các thanh ghi đặc biệt vào các thanh ghi lưu trữ thì chỉ cần dùng các lệnh mov là được sao thấy trong tài liệu hướng dẫn và cũng thấy một số bạn trên này hay dùng lệnh swapf?
Lệnh swapf không làm thay đổi cờ Z, còn lệnh movf thì làm thay đổi cờ Z. Nếu trước đó bạn đã phục hồi thanh ghi STATUS, sau đó bạn phục hồi thanh ghi khác bằng lệnh movf thì cờ Z có thể bị đổi trạng thái, lúc đó có phải việc phục hồi thanh ghi STATUS trở thành công cốc hay không?

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 16-08-2006, 08:48 PM   #62
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 tinhthanthep
Các bác cho hỏi trong khi thực hiện chương trình ngắt ta thường lưu giá trị các thanh ghi W và status vào địa chỉ 0x70, 0x71.... Mấy cái địa chỉ này nằm ở bank 0. Nhưng nếu khi vào chương trình ngắt mà ta đang ở bank 1 thì sao nhỉ? Theo tôi hiểu là trước khi lưu giá trị thanh ghi W và STATUS ta phải chuyển về bank 0 trước đúng không? nhưng tôi thấy các chương trình ngắt viết mẫu đều không thấy làm điều này? Hình như nó tự động hiểu được à? Các bác có thể giải thích cái địa chỉ ghi tạm giá trị thanh ghi W, status được không?
Tôi dịch phần hướng dẫn của Microchip về lưu ngữ cảnh khi ngắt (lấy từ datasheet của PIC16F87xA):

Trích:
Khi xử lý ngắt, chỉ có giá trị trở về của PC được lưu vào ngăn xếp. Thông thường, người dùng có thể muốn lưu các thanh ghi chính khi xử lý ngắt (nghĩa là thanh ghi W và thanh ghi STATUS). Điều này phải được thực hiện bằng phần mềm.

Với các chip PIC16F873A/874A, thanh ghi W_TEMP phải được định nghĩa trong cả bank 0 lẫn bank 1 và phải được định nghĩa ở cùng offset từ địa chỉ nền của bank (nghĩa là, nếu W_TEMP được định nghĩa tại 0x20 trong bank 0, nó cũng phải được định nghĩa tại 0xA0 trong bank 1). Các thanh ghi PCLATH_TEMP và STATUS_TEMP chỉ được định nghĩa trong bank 0.

Vì có tối đa 16 byte của mỗi bank (người dịch: địa chỉ 0x70-0x7F) là được dùng chung trong các chip PIC16F876A/877A, các thanh ghi tạm nên được đặt ở đây. 16 ô nhớ này không cần chuyển bank và do đó sẽ làm cho việc lưu và phục hồi ngữ cảnh dễ dàng hơn.
Hy vọng là bạn đã nắm được các lý do khiến chương trình mẫu được viết như vậy.

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

thay đổi nội dung bởi: namqn, 16-08-2006 lúc 08:51 PM.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-08-2006, 09:29 PM   #63
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Bây giờ thì đã thông. Thanks namqn
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-08-2006, 12:14 PM   #64
newuser
Đệ tử 4 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 66
:
Trong P16F877A, một vài thanh ghi SFR có mặt trong cả 4 bank như: PCL, FSR, STATUS, PCLATH... như thế giá trị của chúng sẽ được tham chiếu qua lại và ta đều có thể truy cập đến mà không cần quan tâm đến vị trí bank hiện tại. Việc lưu trữ giá trị thanh ghi Status theo em chỉ có ý nghĩa đối với các bit cờ C, DC, Z,PD\ và TO\ thôi, còn các bit chọn bank thì không cần vì mỗi khi cần truy cập đến thanh ghi nào thì chỉ cần banksel thanhghi là ổn, hoặc có thói quen luôn có dòng page0 mỗi khi hoàn thành việc truy cập đến SFR.
riêng về PCLATH thì dòng note trang 30/phần PCL và PCLATH đã có chú ý rồi.
còn phần này:
Trích:
Vì có tối đa 16 byte của mỗi bank (người dịch: địa chỉ 0x70-0x7F) là được dùng chung trong các chip PIC16F876A/877A, các thanh ghi tạm nên được đặt ở đây. 16 ô nhớ này không cần chuyển bank và do đó sẽ làm cho việc lưu và phục hồi ngữ cảnh dễ dàng hơn.
như thế theo em hiểu thì giá trị nằm trong các thanh ghi ở địa chỉ này cũng có khả năng tham chiếu qua lại? sao trogn datasheet em không thấy nói đến nhỉ? Anh Nam có thể giải thích dùm em được không?
newuser vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-08-2006, 07:35 PM   #65
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
Cái này được dịch từ datasheet của PIC16F87xA mà em, có điều em tìm ở chỗ không có nói, còn chỗ này có nói đến nó thì có lẽ em chưa tìm. Nó nằm ở mục 14.12 của DS39582B, trang 154.

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 24-08-2006, 02:18 AM   #66
leduy173
Đệ tử 2 túi
 
leduy173's Avatar
 
Tham gia ngày: Jun 2006
Bài gửi: 28
:
em đang làm chớp tắt trên led bằng TMR0 ;ngõ ra là porta ;sao khi làm em thấy 1 số lệnh như Comf portA và incf portA khi thực hiện nó ko xuất ra portA dc, muốn thực hiện điều đó thì em phải tác động qua 1 thanh ghi trung gian sau đó mới chuyển giá trị từ thanh ghi trung gian đó vào portA thì nó mới hiển thị!!!không hiểu tai sao lun!!!mong được chỉ thêm!
leduy173 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-08-2006, 05:15 PM   #67
newuser
Đệ tử 4 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 66
:
Trích:
Nguyên văn bởi leduy173
em đang làm chớp tắt trên led bằng TMR0 ;ngõ ra là porta ;sao khi làm em thấy 1 số lệnh như Comf portA và incf portA khi thực hiện nó ko xuất ra portA dc, muốn thực hiện điều đó thì em phải tác động qua 1 thanh ghi trung gian sau đó mới chuyển giá trị từ thanh ghi trung gian đó vào portA thì nó mới hiển thị!!!không hiểu tai sao lun!!!mong được chỉ thêm!
bạn viết hai lệnh đó không có thêm chỉ số nào đằng sau thanhghi à? nếu tôi nhớ không lầm thì chương trình biên dịch sẽ tự hiểu là bạn đang ghi giá trị đó vào thanh ghi W (bạn kiểm tra lại dùm)
COMF PORTA; lấy bù PORTA rồi ghi giá trị này vào W, giá trị PORTA không thay đổi.
bạn sửa lại như thế này: COMF PORTA,F; lấy bù PORTA rồi ghi vào chính nó.
và nhớ thiết lập PORTA là ngõ xuất:
MOVLW H'FF'; W=0xFF
MOVWF TRISA
chắc bạn đang tư duy theo tập lệnh 8051 nên mới thế
newuser vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-08-2006, 07:01 PM   #68
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 newuser
bạn viết hai lệnh đó không có thêm chỉ số nào đằng sau thanhghi à? nếu tôi nhớ không lầm thì chương trình biên dịch sẽ tự hiểu là bạn đang ghi giá trị đó vào thanh ghi W (bạn kiểm tra lại dùm)
COMF PORTA; lấy bù PORTA rồi ghi giá trị này vào W, giá trị PORTA không thay đổi.
bạn sửa lại như thế này: COMF PORTA,F; lấy bù PORTA rồi ghi vào chính nó.
và nhớ thiết lập PORTA là ngõ xuất:
MOVLW H'FF'; W=0xFF
MOVWF TRISA
chắc bạn đang tư duy theo tập lệnh 8051 nên mới thế
Không đúng vậy đâu newuser, mặc định là ghi vào thanh ghi f. Vấn đề ở đây là hoạt động read-modify-write của các lệnh thao tác dữ liệu như COMF, BSF chẳng hạn. Lấy ví dụ, khi dùng lệnh COMF PORTA, PIC sẽ đọc trạng thái từ PORTA trước, lấy bù giá trị đó, và xuất ra PORTA. Do đó nếu dùng PORTA nối vào các LED đã được nối theo kiểu anode chung (nghĩa là PORTA xuất 0x00 để làm cho tất cả các LED sáng) thì khi đó PIC đọc vào sẽ được 0xFF, và sau đó COMF sẽ có 0x00, các LED sẽ sáng. Đến lần chạy lênh COMF kế tiếp thì tình trạng vẫn diễn ra như vậy, khiến chúng ta nghĩ rằng lệnh không tác động lên PORTA được.

Vấn đề sẽ không xảy ra nếu bạn dùng một ô nhớ để lưu trạng thái của PORTA, khi đó bạn sẽ thao tác trạng thái của PORTA thông qua biến trung gian, và không bị ảnh hưởng của hoạt động read-modify-write (vì ô nhớ không bị ảnh hưởng của hoạt động này).

Bạn newuser viết nhầm chỗ thanh ghi TRISA luôn, để PORTA là các ngõ ra thì phải đặt TRISA = 0x00.

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 25-08-2006, 12:32 AM   #69
leduy173
Đệ tử 2 túi
 
leduy173's Avatar
 
Tham gia ngày: Jun 2006
Bài gửi: 28
:
bạn newuser ah mình cũng đã đặt portA la output và cũng đặt các đích nguồn của lệnh comf là thanh ghi F mà vẫn bị như vậy!
Anh namqn có thể nói rõ hơn về vấn đề đó ko , và những lệnh nào bi ảnh hưởng theo kiểu đó , nếu em ko lầm thì chỉ có những lệnh toán học thôi phải ko?phải bắt buộc phải thao tác qua thanh ghi trung gian như để có thể có kết quả hiển thị trên các port khi mình thao tác trực tiếp trên nó sao ???
leduy173 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-08-2006, 11:54 PM   #70
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 leduy173 View Post
bạn newuser ah mình cũng đã đặt portA la output và cũng đặt các đích nguồn của lệnh comf là thanh ghi F mà vẫn bị như vậy!
Anh namqn có thể nói rõ hơn về vấn đề đó ko , và những lệnh nào bi ảnh hưởng theo kiểu đó , nếu em ko lầm thì chỉ có những lệnh toán học thôi phải ko?phải bắt buộc phải thao tác qua thanh ghi trung gian như để có thể có kết quả hiển thị trên các port khi mình thao tác trực tiếp trên nó sao ???
Ví dụ như vậy là rõ lắm rồi, làm sao nói rõ hơn được. Về các lệnh thuộc loại read-modify-write thì đoạn trích sau đây từ tài liệu của Microchip đã nói (mặc dù vẫn không liệt kê hết các lệnh):
Trích:
Actually, any instruction that depends on a value currently in the register is going to be a Read-Modify-Write instruction. This includes ADDWF, SUBWF, BCF, BSF, INCF, XORWF, etc... Instructions that do not depend on
the current register value, like MOVWF, CLRF, and so on are not R-M-W instructions.
Tạm dịch: Thực tế, bất kỳ lệnh nào phụ thuộc vào một giá trị hiện hành trong một thanh ghi sẽ là một lệnh Read-Modify-Write (R-M-W). Điều này bao gồm các lệnh ADDWF, SUBWF, BCF, BSF, INCF, XORWF, v.v... Các lệnh không phụ thuộc vào giá trị hiện hành của thanh ghi, như MOVWF, CLRF, và tương tự thì không phải là các lệnh R-M-W.

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 19-10-2006, 01:05 PM   #71
duylinh28
Nhập môn đệ tử
 
Tham gia ngày: Oct 2006
Bài gửi: 3
:
aho em hoi chut. bao gio co lop hoc pic moi day ? Neu ai biet thi nhan cho em qua dia chi sau khungbohanhtinh2000. thanks
duylinh28 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2006, 11:29 PM   #72
tranhuyky
Đệ tử 2 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 39
:
Send a message via Yahoo to tranhuyky
cho em hỏi có cách nào hay hơn không

Trích:
Nguyên văn bởi namqn View Post
À, anh xem lướt qua nên không phát hiện lỗi ở lần đầu.

Phần khai báo của bạn friends dịch không có lỗi, nhưng chạy chương trình sẽ bị sai (vì các địa chỉ biến được đặt không đúng). Toàn bộ 4 biến đó đều sẽ có địa chi 0x20. Bạn friends cần phải chỉnh lại như sau thì mới có chương trình đúng:
Code:
Org 0x20
W_SAVE res 1
STAT_SV res 1
PCH_SV res 1
FSR_SV res 1
ORG 0X0000
Giải thích thêm về phần này. Directive org chỉ làm thay đổi bộ đếm địa chỉ của trình hợp dịch. Với đoạn code như trên, chúng ta sẽ có W_SAVE là nhãn ở địa chỉ 0x20, STAT_SV là nhãn ở địa chỉ 0x21, và cứ thế. Từ khóa res và giá trị 1 sẽ làm bộ đếm địa chỉ tăng 1 đơn vị. Cách này không hay vì các địa chỉ biến thực chất là địa chỉ của các nhãn được hiểu là sẽ được dùng làm đích của các lệnh chuyển điều khiển (hay nói cách khác chúng là các địa chỉ của các từ lệnh), nếu dùng chúng trong các PIC18 chẳng hạn thì sẽ bị sai (vì các từ lệnh cách nhau 2 byte, và PIC18 dùng địa chỉ byte).

Thân,
Theo lời bác namqn nói cách dùng org không hay nếu chuyển sang PIC18 thì sai, em cũng thử rồi, làm như vậy phải sửa lại nhiều. Xin hỏi các bác có cách nào hay hơn không? cảm ơn các bác.
tranhuyky vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-12-2006, 10:29 PM   #73
giaosucan
Đệ tử 1 túi
 
Tham gia ngày: Jan 2006
Bài gửi: 17
:
xin hỏi 1 tí ,tui có 1 con 18F45 có thể dùng mạch của 16F877 cho con này dc ko ,vì tui chưa tìm dc sơ đồ mạch của chon 18F45

namqn: theo tôi biết thì không có PIC18 nào có số hiệu là PIC18F45, do đó câu hỏi của bạn chưa rõ ràng.
__________________
TRUNG TÂM ĐÀO TẠO ĐIỆN TỬ VÀ TỰ ĐỘNG HOÁ MTC
MTC khai giảng khóa mới
http://blog.360.yahoo.com/blog-kHh38....lgCr0J4220m40

thay đổi nội dung bởi: namqn, 18-12-2006 lúc 11:42 PM.
giaosucan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-05-2007, 12:25 AM   #74
binhdt04
Đệ tử 2 túi
 
Tham gia ngày: Mar 2007
Bài gửi: 43
:
minh khong dao duoctai lieu cacban goi cho monh duockhong minh cam on nhieu lam
binhdt04@yahoo.com
binhdt04 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-05-2007, 08:46 AM   #75
tranvanthuong
Đệ tử 2 túi
 
Tham gia ngày: Mar 2007
Bài gửi: 45
:
chương trình em viet đề điều khiển 4 led chớp tắt và dùng ngắt RB để kết hợp điều chỉnh tốc độ không biết tại sao chương trình không chạy rồi có khi chạy rút nguồn ra ghim lại thì chương trình không chay nhờ các anh chỉ giúp
chương trình em viet như sau:
Code:
include "E:\ccs c\chuong_trinh_ccsc\banh_kem_duc_thanh\chuong_trinh.h"
#int_RB
RB_isr()
{
int8 y;
  disable_interrupts(INT_RB);
  disable_interrupts(GLOBAL);
  
  if ( input(PIN_B6) )         //tang gia tri trong o nho
     {
       y = read_eeprom(0x00);
       y = y + 20;
       write_eeprom (0x00,y);
     }

 if ( input(PIN_B7) )          //giam gia tri trong o nho
    {

       y = read_eeprom(0x00);
       y = y - 20;
       write_eeprom (0x00,y);
      }
   
    delay_ms(1000);
    
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RB);
    
}
//===========CAC CHUONG TRINH CON==============



void tao_tre(int16 x);




//============================================



void main()
{ int8 x=10,y;


   output_B(0x00);
   output_A(0x00);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);




   while(1)
    {
      output_high(pin_B0);
      tao_tre(1);
      output_low(pin_B0);
      tao_tre(1);

      output_high(pin_B1);
      tao_tre(1);
      output_low(pin_B1);
      tao_tre(1);

      output_high(pin_B2);
      tao_tre(1);
      output_low(pin_B2);
       tao_tre(1);

      output_high(pin_B3);
      tao_tre(1);
      output_low(pin_B3);
      tao_tre(1);

      output_low(pin_B0);
      output_low(pin_B1);
      output_low(pin_B2);
      output_low(pin_B3);
      tao_tre(1);

      output_high(pin_B0);
      output_high(pin_B1);
      output_high(pin_B2);
      output_high(pin_B3);
      tao_tre(1);

      output_low(pin_B0);
      output_low(pin_B1);
      output_low(pin_B2);
      output_low(pin_B3);
      tao_tre(1);


    }
}
//============================================

void tao_tre(int16 x)
   {
        int16 z,i;

        z = x + read_eeprom (0x00);
          delay_ms(100);
         for(i=0;i<z;++i)
          delay_ms(2);

   }

//===========================================
và file.h
#include <16F84A.h>

#FUSES NOWDT,NOPUT,PROTECT                 	//No Watch Dog Timer
#FUSES HS
#use delay(clock=10000000)
__________________
Cổng trường Đại học cao vời vợi
Đồng ruộng mênh mong đón em về!

thay đổi nội dung bởi: falleaf, 28-05-2007 lúc 08:55 AM.
tranvanthuong 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à 12:34 AM.


Đượ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