PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Cách khai báo biến và liên kết chương trình (http://www.picvietnam.com/forum/showthread.php?t=163)

tuan795 26-10-2005 03:11 PM

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

falleaf 27-10-2005 12:28 PM

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.

acom 13-01-2006 08:48 AM

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.

falleaf 13-01-2006 09:06 AM

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.


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