![]() |
đúng thế đấy bạn, nếu bạn xuất led mà không có dòng CLRF PORTx là thấy chạy sai liền, Protues mô phỏng y chang...
|
Từ hôm nay, F cắt các bài trong phần Học PIC trong 1 ngày ra thành Thảo luận xung quanh Học PIC trong 1 ngày, lý do rằng một số bài đi lan man, và cứ nhấn tới các câu hỏi.
Trong luồng này, chỉ lưu các tutorial của picvietnam, nhưng câu hỏi và trả lời liên quan đến bài học, nhằm giúp đỡ những người mới học tham gia và đọc một cách dễ dàng nhất. Vì vậy, khi quyết định viết bài vào luồng này, các bạn phải thật cân nhắc, nếu không bài của các bạn sẽ bị di chuyển sang luồng khác. http://www.picvietnam.com/forum/showthread.php?t=446 Liên quan đến bài học là thế nào? Là bạn đọc bài học ở đây, làm theo và có thắc mắc, hoặc là bạn có viết thêm các tutorial để bổ sung vào luồng này cho người học có thêm tài liệu phong phú. Nếu không phải là một trong hai trường hợp này, đề nghị các bạn không viết bài vào luồng này, để tránh các thành viên mới rất khó kiếm bài và rất khó hệ thống tài liệu học. Chúc vui. |
Sao Em Download File Tập Lệnh Về Lại Ko Thể Mở Xem Duoc Vậy Nhỉ.
Nó Cứ Bảo File Damaged And Could Not Repair.... |
Nhiều người download thành công, và F cũng kiểm tra lại rồi, mọi thứ ok. Có thể đường truyền ở Việt Nam có vấn đề, cho nên đôi khi download giữa chừng nó bị hỏng, và dẫn tới file down về bị hư.
Chúc vui |
Interrupt
Cac anh cho em hoi, khi dung chuong trinh ngat theo mau nhu ben duoi ,thi co can khai bao cac vung ram ben duoi khong
Vi du: co can khai bao nhu the nay khong? ……………. Org 0x20 W_SAVE STAT_SV PCH_SV FSR_SV ORG 0X0000 ………………….. ;DAY LA CHUONG TRINH NGAT THEO MAU ;================================================= =========================================== INTERRUPT ;------------------------------------------- ;Doan ma bat buoc de vao ngat ;------------------------------------------- MOVWF W_SAVE ;W_SAVE(bank unknown!) = W SWAPF STATUS, W CLRF STATUS ; force bank 0 for remainder of handler MOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS ) ; STATUS = 0 MOVF PCLATH, W MOVWF PCH_SV ; PCH_SV = PCLATH CLRF PCLATH ; PCLATH = 0 MOVF FSR, W MOVWF FSR_SV ; FSR_SV = FSR ; 10 cycles from interrupt to here! ;----------------------------------- ;Doan chuong trinh ngat ;----------------------------------- ; cac ban se viet chuong trinh ngat o day ;-------------------------------------------------- ;Doan ma bat buoc de ket thuc ngat ;-------------------------------------------------- MOVF FSR_SV, W MOVWF FSR ; FSR = FSR_SV MOVF PCH_SV, W MOVWF PCLATH ; PCLATH = PCH_SV SWAPF STAT_SV, W MOVWF STATUS ; STATUS = swap_nibbles( STAT_SV ) SWAPF W_SAVE, F SWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit) BSF INTCON, GIE RETFIE ;================================================= ================================================== |
chắc chắn là cần lưu giữ giá trị các thanh ghi W, STATUS và PCLATH nếu bạn muốn chương trình chạy đúng sau khi trở về từ ngắt. Cách khai báo hình như không đúng...mình thường viết như thế này:
W_TEMP EQU 0X20 STATUS_TEMP EQU 0X21 PCLATH_TEMP EQU 0X22 riêng FSR có cần lưu trữ nó không nhỉ? |
Trích:
Còn cách định nghĩa hằng của em: Code:
PCLATH EQU 0X22Thân, |
ủa, thôi chết, em viết thiếu, đại loại phải như vầy (đúng là nhanh nhảu đoảng... hic)
PCLATH_TEMP EQU 0X22 cách khai báo như bạn friend vẫn đúng? anh có thể giải thích rõ hơn không? |
À, 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 0x20Thân, |
Chào bang chủ ,đệ tử nhập môn thật vất vả để viết chương trình đầu tiên !
thứ 1 : vì chưa biết gì về MPLAB thế nên sau khi cài đặt đọc mãi hướng dẫn sử dụng mới có thể làm được mong bang chủ thêm phần hướng dẫn cơ bản sử dụng MPLAB trong 1 ngày học PIC thứ 2 : Ngay trong bài tập đầu tiên Bang chủ đã gài pan thêm dấu . kế lệnh END làm trình dịch báo lổi mà ko biết mò đâu mà sửa ! dù sao thì đệ cũng đã làm được bài tập đầu tiên ! |
Trích:
http://www.picvietnam.com/forum/showthread.php?t=354 Về thứ 2: đó chưa hẳn là một pan được gài, MPLAB đã trải qua nhiều lần nâng cấp kể từ khi chú F viết bài tập đó, đến nay thì directive END được dùng cho các chương trình hợp ngữ dành cho các vi điều khiển 8-bit (PIC10, PIC12, PIC16 và PIC18, nhưng directive .END vẫn được dùng cho các chương trình hợp ngữ dành cho các vi điều khiển và DSC 16-bit (PIC24, dsPIC30, dsPIC33). Thân, |
Vì quá kém cỏi đành xin trưởng lão thọ giáo thêm chút nữa !
vì sao chương trình này em viết dịch bị lỗi ! Code:
;====================================Make: The target "E:\pic1\baitap2.o" is out of date. Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F628A "baitap2.asm" /l"baitap2.lst" /e"baitap2.err" /o"baitap2.o" Warning[215] E:\PIC1\BAITAP2.ASM 18 : Processor superseded by command line. Verify processor symbol. Message[302] E:\PIC1\BAITAP2.ASM 32 : Register in operand not in bank 0. Ensure that bank bits are correct. Error[113] E:\PIC1\BAITAP2.ASM 54 : Symbol not previously defined ( ) Error[112] E:\PIC1\BAITAP2.ASM 54 : Missing operator Error[113] E:\PIC1\BAITAP2.ASM 57 : Symbol not previously defined (f ) Error[113] E:\PIC1\BAITAP2.ASM 58 : Symbol not previously defined (d1 ) Halting build on first failure as requested. BUILD FAILED: Sat Aug 12 18:02:25 2006 |
Chương trình này không có lỗi cú pháp, tất nhiên cái warning về bộ xử lý do MPLAB chọn tại dòng lệnh và cái message về thanh ghi không nằm trong bank 0 là hợp lý. Tôi cho là bạn đang gặp khó khăn trong việc biên dịch chương trình. Nhân tiện bạn cho biết bạn đang dùng MPLAB phiên bản nào.
Với các bản MPLAB IDE mới, cách đơn giản để bạn biên dịch chương trình chỉ gồm 1 tập tin .asm là chọn loại bộ xử lý cho đúng trong mênu "Configure", lệnh "Select Device ...", sau đó bạn chọn trong mênu "Project" lệnh "Quickbuild <tentaptin.asm>", với <tentaptin.asm> là tập tin .asm mà bạn đang soạn thảo (nó đã được mở ra và đang active). Thân, |
O Day Cac Bac Noi Ve Cach Dung Pic Co Ban Nhat
Nhung Nhung Ung Dung Khac Thi Chua Thay Cac Bac De Cap Nhieu Hi Vong Cac Bac Post Them Nhieu De Anh Em Ta Cung Hoc Nhanh Hon Vi Du Nhu Timer0, 1, 2 Truyen Thong Du Lieu Pwm... Thank You |
Cac Bac Toan Viet Delay Nho Decfsz A
Cai Lay Dung Cung Duoc Nhung Ma Thoi Gian De Lay Khong Chinh Xac Lam Em Thu Dung Timer0 Cua 16f877a De Tao Tre Nhung Ma Tim Mai Khong Thay Lenh Khoi Dong Timer0 Dau Bac Nao Viet Chuong Trinh Tao Tre Nho Timer0 Thi Chi Cho Em Voi Hinh Nhu Voi Con Pic877a No Tu Khoi Dong Timer0 Hay Sao Day Bac Nao Ro Thi Giup Em Voi Thank You! |
rất cám ơn trưởng lão !
|
Nếu mẫu khai báo biến như faleaf trình bày bên trên không tối ưu thì mong bác namp viết lại cho chuẩn. Đây là mẫu khai báo biến của faleaf:
;================================================= ======== ; KHAI BAO BIEN ;-------------- ; Bien nam o bank 0 ;---------------------------------------------------------------------- ORG 0x020 COUNT_L RES 1 COUNT_H RES 3 ;---------------------------------------------------------------------- ; BiEn NAM O bank 1 ;---------------------------------------------------------------------- ORG 0x0A0 COUNT1_L RES 1 ;---------------------------------------------------------------------- ; Bien nam o bank 2 ;---------------------------------------------------------------------- ORG 0x120 ;================================================= ======= 2. Trong chuong trình ngắt theo tôi chỉ cần lưu giá trị của thanh ghi W và STATUS vì thanh ghi PC đã được lưu trong stack. Đồng thời trong quá trình xử lý 1 ngắt thì bit toàn cục GIE đã bị clear nên sẽ không có ngắt nào khác hoạt động được nữa lên không sợ tràn stack. 3. Ở cuối chuong trình ngắt không cần phải set bit GIE vì khi ra khỏi chương trình ngắt thì bit GIE tự động được set lên. Chỉ phải clear flag trước khi ra khỏi chương trình ngắt. |
Trích:
vì thế không cần lưu trữ giá trị thanh ghi PCLATH chỉ chính xác với những dòng PIC có bộ nhớ chương trình <=2K (2^11=2048 địa chỉ). |
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?
|
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?
|
Trích:
Thân, |
Trích:
Trích:
Thân, |
Bây giờ thì đã thông. Thanks namqn
|
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:
|
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, |
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!
|
Trích:
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ế |
Trích:
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, |
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 ??? |
Trích:
Trích:
Thân, |
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
|
cho em hỏi có cách nào hay hơn không
Trích:
|
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. |
minh khong dao duoctai lieu cacban goi cho monh duockhong minh cam on nhieu lam
binhdt04@yahoo.com |
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" |
Thử xem lại việc quản lý các cờ ngắt.
Chúc vui |
HIC HIC, anh nào giup em di
|
a anh ơi~! em viết chạy ổn rồi ne!
Code:
#include "E:\ccs c\chuong_trinh_ccsc\banh_kem_duc_thanh\chuong_trinh.h" |
+ Cho em hỏi về phần nút bấm với điện trở kéo lên. Khi bấm thì chân ở mức thấp (ok); khi ko bấm thì lam sao biết được trạng thái của chân? (do chân mắc với nguồn qua điện trở nên điện áp ở chân ko biết xác định thế nào, vẫn có thể là H hoặc L).
+ Đặt chân là input với điện áp là 0. Nếu nối chân đó với nguồn 5V thì nó sẽ chuyển từ 0-->5V và dòng điện sẽ chạy từ nguồn vào chân Pic? Còn nếu là output thì sao dòng điện sẽ chạy đi đâu? Mấy cái này em vẫn chưa thông lắm... |
Trích:
2. Câu này bạn hỏi không rõ ràng: 'Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?'. Nếu bạn muốn biết khi bạn xuất mức cao hay thấp thì dòng điện sẽ chạy ra sao thì câu trả lời thế này: khi bạn xuất mức cao, MOSFET phía cao của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 5V và PIC cấp dòng cho tải, nếu có tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ bị giảm nhiều hay ít do áp rơi trên MOSFET phía cao. Khi bạn xuất mức thấp, MOSFET phía thấp của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 0V và PIC rút dòng từ tải xuống Vss, nếu có tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ cao hơn Vss nhiều hay ít do áp rơi trên MOSFET phía thấp. Bạn xem thêm mục I/O Ports trong các datasheet của chip sẽ thấy họ vẽ cấu trúc của ngõ ra. Thân, |
| Múi giờ GMT. Hiện tại là 12:52 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