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 26-10-2005, 03:11 PM   #1
tuan795
Đệ tử 1 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 16
:
Cách khai báo biến và liên kết chương trình

có một đoạn chương trình CHÍNH như sau

;device : PIC16F84A

; ************************************************
#include <p16F84A.inc>


list P=PIC16F84A

; ************************************************

; Load Configuration bit Code protect off,WDT on,
; Poweron timer on, XT oscillator

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

; ************************************************
STARTUP CODE 0x00
goto STart

INTERRUPT CODE 0x04
goto IntSrv
; ************************************************
#include <data.h>

PROGRAM CODE
STart

banksel WDTCOUNT_HI
btfsc CheckCalH
call CalForHi

btfsc CheckCalL
call CalForLow

; ************************************************

movf WDTCOUNT_HI,w
movwf TEMPH
movf WDTCOUNT_LO,w
movwf TEMPL
call InitData
call InPort
btfss STATUS,NOT_TO
goto MeasureTemp
btfsc SET
goto WDTclr

btfss SET
goto $-1

call CalibrateSystem ...................
...................


VỚI PHẦN CHƯƠNG TRÌNH DATA.H NHƯ SAU

; data.h

; ************************************************** *******************************

; PORT B 1 TO 7 -> output for a to g of seven segemet digit
; PORT A 0 to 2 -> output
#define DIGIT0 PORTA,2 ; DIGIT0 is common anode of 7-segment display - 'LSB' <PortA,2>
#define DIGIT1 PORTA,1 ; DIGIT1 is common anode of 7-segment display - 'MSB' <PortA,1>
#define DIGIT2 PORTA,0 ; DIGIT2 is common anode of 7-segment display - 'USB' or 'SIGN'<PortA,0>

;#define UP SW1,4 ; Up key is connected to PORTB,4
;#define DOWN SW1,5 ; DOWN key is connected to PORTB,5
;#define SET SW1,6 ; SET key is connected to PORTB,6
;#define TEMP SW1,7 ; TEMP key is connected to PORTB,7

#define UP PORTB,4 ; Up key is connected to PORTB,4
#define DOWN PORTB,5 ; DOWN key is connected to PORTB,5
#define SET PORTB,6 ; SET key is connected to PORTB,6
#define TEMP PORTB,7 ; TEMP key is connected to PORTB,7

#define SecBit TEMPFlag,0
#define CheckCalH TEMPFlag,1
#define CheckCalL TEMPFlag,2
; ************************************************** *******************************
UDATA

WDTCOUNT_HI res 1
WDTCOUNT_LO res 1
TEMPL res 1
TEMPH res 1
TEMPFlag res 1
Count0 res 1
Count1 res 1
W_TEMP res 1
STATUS_TEMP res 1
USD res 1
MSD res 1
LSD res 1

C1 res 1
C2 res 1
C3 res 1
C4 res 1


; ************************************************

extern InitTmr0
extern TempCalc
extern ReadEeprom
extern WriteEeprom
extern EEDefault
extern InitWDT
extern InPort
extern OutPort
extern InitData
extern ScanKey
extern InitInt

extern IntDelay
extern Delay1
extern Delay_1
extern Delay20


; for EEPROM
extern TEMP_HI,WDT_H0,WDT_H1,Default,TEMP_LO
extern WDT_L0,WDT_L1,TempP,TempC,Neg
extern Switch,Switch1

global WDTCOUNT_HI,WDTCOUNT_LO,TEMPFlag,Count0,Count1



VÀ CÁC CHƯƠNG TRÌNH CON PHỤC VỤ CHO CHƯƠNG TRÌNH CHÍNH NHƯ SAU:
; init.asm
; *******************************************
#include <p16F84A.inc>


; *******************************************

global InitData
global InitWDT
global InPort
global OutPort
global ScanKey
global InitTmr0

global InitInt
global IntDelay
global Delay1
global Delay_1
global Delay20

global Switch,Switch1
extern Count0,Count1
extern Neg,TEMPFlag

UDATA
Switch res 1
Switch1 res 1

DB1 res 1
DB2 res 1
DB3 res 1

CODE

; *******************************************
; Configure the prescaler asigned to WDT
InitWDT
banksel OPTION_REG ; select bank for OPTION_REG
; for WDT as 1:2 prescaler
movlw 0x09 ; PSA=1,PS2:PS1=001
movwf OPTION_REG ;
bcf STATUS,RP0
return

; *******************************************
; Initialise interrupts

InitInt
clrwdt
BANKSEL OPTION_REG ; select bank for OPTION_REG
; for WDT as 1:1 prescaler
movlw 0x09 ; PSA=1,PS2:PS1=001 for 1:2 WDT rate
movwf OPTION_REG
BANKSEL TMR0
clrf TMR0
BANKSEL INTCON
clrf INTCON
bsf INTCON,T0IE ; TMR0 on
bsf INTCON,GIE
return

; ************************************************
InPort
clrwdt
banksel Switch
movlw 0xf0 ; No key pressed
movwf Switch1
movwf Switch

BANKSEL PORTA
movlw 0xE7
movwf PORTA
movlw 0xFF
movwf PORTB

BANKSEL TRISB ; bank selct for TRISB
movlw 0xf0 ; initialise PORTB <4:7> as inport
movwf TRISB ; PORTB <0:3> as output port

BANKSEL PORTB
bcf PORTB,0

return

; ************************************************
OutPort
clrwdt
banksel TRISA
clrf TRISA ; set PORTA as output port
clrf TRISB ; set PORTB as output port
banksel PORTA
movlw 0xE7
movwf PORTA
movlw 0xFF ; to blank the display
movwf PORTB
return
..............................................
...........................................

chương trình chính và chương trình con nằm riêng lẽ có nghĩa rằng chương trình con phục vụ cũng là một chương trình ASM riêng biệt khi biên dịch thì có lỗi gì xảy ra không và cách khai biến như trên có hợp lệ không . nếu chúng ta liên kết chúng cho chúng nằm chung trong một chương trình thì ta bỏ các khai biến
global InitData
global InitWDT
global InPort
global OutPort
global ScanKey
global InitTmr0

global InitInt
global IntDelay
global Delay1


ở chương trính con được không.
Mong nhận ý kiến của các anh chị và các bạn
tuan795 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2005, 12:28 PM   #2
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Khi bạn hỏi về cấu trúc chương trình, chỉ post những đoạn code quan trọng ảnh hưởng đến chương trình, hoặc vị trí viết code... Bạn hỏi về cấu trúc mà tương một chương trình dài dằng dặc lên, và không phân chia thành các đoạn code nhỏ, không ai có thể kiểm tra được.

Bạn dùng chức năng

[ code] (viết liền lại, nếu viết sát vào nó sẽ bị hiểu là đoạn mã, nên tôi phải viết thế này)
Code của bạn đặt vào đây
[ /code]

Khi viết [ c...]...[ /c...] liền lại thành [c...]...[/c...] thì bạn sẽ có kết quả như sau:

Code:
Code của bạn đặt vào đây
Để đặt đoạn code của bạn vào giữa. Nhiều file khác nhau thì đặt vào nhiều điểm khác nhau


Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-01-2006, 08:48 AM   #3
acom
Nhập môn đệ tử
 
Tham gia ngày: Dec 2005
Bài gửi: 2
:
Anh Falleaf ah em moi hoc lap trinh cho PIC6F877A. Em thay thuong o dau cac chuong trinh co doan code:"__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF"
Em biet do la doan code xet cau hinh cho PIC. Nhung em khong biet cac bit duoc xet trong doan code do co y nghi nhu the nao. Mong anh giai dap giup em giup em.
acom vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-01-2006, 09:06 AM   #4
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Em xem trong cuốn Manual của dòng Midrange, em sẽ thấy phần configuration bits.. Nó giải thích rất rõ cho câu hỏi của em.

Chúc vui.
falleaf 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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Cùng khai hoang con 16F88 noisePIC Cơ bản về vi điều khiển và PIC 27 13-04-2012 03:24 AM
Khai giảng lớp vi điều khiển ,cung cấp tài liệu tamphong Quảng cáo và bán sản phẩm 2 12-11-2006 08:40 PM


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