2013.04.25 11:18

TIMER COUNT를 사용하여 들어오는 신호의 길이를 확인하고 데이터 입력을 받아 저장하는 부분입니다.

RF 수신에서 주로 사용하였습니다.

 

GET_RXD_RF
 MOVLW .7
 MOVWF TEMP2
 CALL START_TMR0_8US
 BTFSC INTCON, T0IF
 RETLW .0;에러
 CLRWDT
 BTFSS RXD_RECEIVER;RXD_RF;싱크헤드시작지점찾기위해H체크
 GOTO $-4
CHK_SYNCHEAD_START;┐싱크헤드시작지점하강에지찾음
 CALL START_TMR0_8US
 BTFSC INTCON,T0IF
 RETLW .0;에러
 CLRWDT
 BTFSC RXD_RECEIVER;RXD_RF
 GOTO $-4
CHK_SYNCHEAD_TIME;└────┘싱크헤드구간측정
 CALL START_TMR0_8US
 BTFSC INTCON,T0IF
 RETLW .0;에러
 CLRWDT
 BTFSS RXD_RECEIVER; RXD_RF
 GOTO $-4
 MOVF TMR0,W
 MOVWF BUF_TMR0
 MOVLW .188
 SUBWF BUF_TMR0,W
 BTFSS STATUS,CF;1500US보다짧으면에러
 RETLW .0;에러
 MOVLW .250
 SUBWF BUF_TMR0,W
 BTFSC STATUS,CF;2000US보다길면에러
 RETLW .0;에러
CHK_STARTBIT_H;스타트비트H구간시간체크 ┌┐
 CALL START_TMR0_4US
 BTFSC INTCON,T0IF
 RETLW .0;에러
 CLRWDT
 BTFSC RXD_RECEIVER;RXD_RF
 GOTO $-4
 MOVF TMR0,W
 MOVWF BUF_TMR0
 MOVLW .60
 SUBWF BUF_TMR0,W
 BTFSS STATUS,CF;240US보다짧으면에러
 RETLW .0;에러
 MOVLW .125
 SUBWF BUF_TMR0,W
 BTFSC STATUS,CF;500US보다길면에러
 RETLW .0;에러
 MOVLW BUF_RXD_RF
 MOVWF FSR
CHK_EDGE_RXD_RF
 INCF FSR
 MOVLW .8
 MOVWF TEMP1
CHK_EDGE_RXD_RF2
 CALL DELAY_500US
 CALL START_TMR0_2US
 BTFSC RXD_RECEIVER;RXD_RF
 GOTO CHK_DOWNEDGE
CHK_UPEDGE
 BTFSC INTCON,T0IF
 RETLW .0;에러
 CLRWDT
 BTFSS RXD_RECEIVER;RXD_RF
 GOTO $-4
; GOTO $-2
 MOVF TMR0,W
 MOVWF BUF_TMR0
 MOVLW RCONPULSE_SHORT;.50
 SUBWF BUF_TMR0,W
 BTFSS STATUS,CF;100US보다짧으면에러
 RETLW .0;에러
 MOVLW .250
 SUBWF BUF_TMR0,W
 BTFSC STATUS,CF;500US보다길면에러
 RETLW .0;에러
 BCF  STATUS,CF
 GOTO GET1BYTE_RXD_RF
CHK_DOWNEDGE
 BTFSC INTCON,T0IF
 RETLW .0;에러
 CLRWDT
 BTFSC RXD_RECEIVER;RXD_RF
 GOTO $-4
; GOTO $-2
 MOVF TMR0,W
 MOVWF BUF_TMR0
 MOVLW RCONPULSE_SHORT;.50
 SUBWF BUF_TMR0,W
 BTFSS STATUS,CF;100US보다짧으면에러
 RETLW .0;에러
 MOVLW RCONPULSE_LONG;.200
 SUBWF BUF_TMR0,W
 BTFSC STATUS,CF;400US보다길면에러
 RETLW .0;에러
 BSF  STATUS,CF
GET1BYTE_RXD_RF
 RRF  BUF_RXD_RF
 DECFSZ TEMP1
 GOTO CHK_EDGE_RXD_RF2
 MOVF BUF_RXD_RF,W
 MOVWF INDF
 DECFSZ TEMP2
 GOTO CHK_EDGE_RXD_RF
 RETLW .1

 

START_TMR0_2US
 MOVLW B'00000000' ;TMR0 PRE(1:2)타이머0를2분주(4MHz=0.25US,*4CLK,*2분주=2US)
 GOTO START_TMR0_INIT
START_TMR0_4US
 MOVLW B'00000001' ;TMR0 PRE(1:4)타이머0를4분주(4MHz=0.25US,*4CLK,*4분주=4US)
 GOTO START_TMR0_INIT
START_TMR0_8US
 MOVLW B'00000010' ;TMR0 PRE(1:8)타이머0를8분주(4MHz=0.25US,*4CLK,*8분주=8US)
START_TMR0_INIT
 CLRWDT
 SELBANK1
 MOVWF OPTIONR
 SELBANK0
 BCF  INTCON,T0IF
 CLRF TMR0
 BCF  INTCON,GIE;전체INT사용중지
 BCF  INTCON,T0IE;T0INT사용중지
 RETURN

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

수신부 모듈  (0) 2013.04.25
시뮬레이터 실행하기  (0) 2011.07.12
포트 설정하기  (0) 2010.08.03
13. 레지스터 설정하기  (0) 2010.08.02
12. 레지스터 정의하기  (0) 2010.08.02
11. 포트 정의하기  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2011.07.12 11:06

 


Debugger -> Select Tool -> MPLAB SIM을 실행합니다.

 

우측 상단에 Animate(>>표시)를 누르면 한단계씩 설정해 놓은 시간대로 실행이 됩니다.

만일 들어간 루프에서 빠져 나와 다음 실행을 하고 싶을 경우에는 일시 정지 버튼을 누른 후 Step Out를 눌러주면 돌고 있는 루프를 빠져 나옵니다.

시뮬레이션 도중 프로그램을 변경하게 되는 경우에는 다시 한번 Quickbuild를 해주고 돌려야 됩니다.

View 에서 원하는 것들을 빼서 보면서 돌리면 레지스터 값 변화나 프로그램의 용량 W레지스터 값등을 확인 하면서 돌릴 수 있습니다.

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

수신부 모듈  (0) 2013.04.25
시뮬레이터 실행하기  (0) 2011.07.12
포트 설정하기  (0) 2010.08.03
13. 레지스터 설정하기  (0) 2010.08.02
12. 레지스터 정의하기  (0) 2010.08.02
11. 포트 정의하기  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.03 20:16
프로그램을 작성하기 전에 포트를 미리 설정해주어야 합니다.
물론 만들다보면 포트 조건이 맞지 않거나 원하는 동작을 해주지 않아 바꾸는 경우도 있지만, 미리 설정해 주지 않으면 단가가 올라가거나(풀업 저항을 따로 달아줘야한다거나) 원하는 동작을 지원해주지 않아 프로그램이 복잡해지는 경우가 생기기도 합니다.(I2C나 UART, ADCON등)

사용자 삽입 이미지

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

수신부 모듈  (0) 2013.04.25
시뮬레이터 실행하기  (0) 2011.07.12
포트 설정하기  (0) 2010.08.03
13. 레지스터 설정하기  (0) 2010.08.02
12. 레지스터 정의하기  (0) 2010.08.02
11. 포트 정의하기  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:46

;----- Register Files------------------------------------------------------

;BANK0
INDF  EQU     0x00
TMR0  EQU     0x01
PCL  EQU     0x02
STATUS  EQU     0x03
FSR  EQU     0x04
PORTA  EQU     0x05
PORTB  EQU     0x06
PORTC  EQU     0x07
PCLATH  EQU     0x0A
INTCON  EQU     0x0B
PIR1  EQU     0x0C
PIR2  EQU     0x0D
TMR1L  EQU     0x0E
TMR1H  EQU     0x0F
T1CON  EQU     0x10
TMR2  EQU     0x11
T2CON  EQU     0x12
SSPBUF  EQU     0x13
SSPCON  EQU     0x14
CCPR1L  EQU     0x15
CCPR1H  EQU     0x16
CCP1CON  EQU     0x17
RCSTA  EQU     0x18
TXREG  EQU     0x19
RCREG  EQU     0x1A
PWM1CON EQU     0x1C
ECCPAS  EQU     0x1D
ADRESH  EQU     0x1E
ADCON0  EQU     0x1F

;BANK1
OPTIONR  EQU     0x01
TRISA  EQU     0x05
TRISB  EQU     0x06
TRISC  EQU     0x07
PIE1  EQU     0x0C
PIE2  EQU     0x0D
PCON  EQU     0x0E
PR2  EQU     0x12
SSPADD  EQU     0x13
SSPSTAT  EQU     0x14
WPUA  EQU     0x15
IOCA  EQU     0x16
TXSTA  EQU     0x18
SPBRG  EQU     0x19
SPBRGH  EQU     0x1A
BAUDCTL  EQU     0X1B
ADCON1  EQU     0x1F

;BANK2
EEDAT  EQU     0x0C
EEADR  EQU     0x0D
EEDATH  EQU     0x0E
EEADRH  EQU     0x0F
WPUB  EQU     0X15
IOCB  EQU     0X16
ANSEL  EQU     0x1E
ANSELH  EQU     0x1F

;BANK3
EECON1  EQU  0x0C
EECON2  EQU  0x0D


;----- STATUS Bits --------------------------------------------------------

IRP  EQU     .7
RP1  EQU     .6
RP0  EQU     .5
TO  EQU     .4
PD  EQU     .3
ZF  EQU     .2
DC  EQU     .1
CF  EQU     .0

;----- INTCON Bits --------------------------------------------------------

GIE  EQU     .7
PEIE  EQU     .6
T0IE  EQU     .5
INTE  EQU     .4
RABIE  EQU     .3
T0IF  EQU     .2
INTF  EQU     .1
RABIF  EQU     .0


;----- PIR1 Bits ----------------------------------------------------------

;PSPIF                        EQU     .7
ADIF  EQU     .6
RCIF  EQU     .5
TXIF  EQU     .4
SSPIF  EQU     .3
CCP1IF  EQU     .2
TMR2IF  EQU     .1
TMR1IF  EQU     .0

;----- PIR2 Bits ----------------------------------------------------------

OSFIF                    EQU     .7
C2IF  EQU     .6
C1IF  EQU     .5
EEIF  EQU     .4

;----- T1CON Bits ---------------------------------------------------------

T1GINV  EQU     .7
TMR1GE  EQU     .6
T1CKPS1  EQU     .5
T1CKPS0  EQU     .4
T1OSCEN  EQU     .3
NOT_T1SYNC EQU     .2
TMR1CS  EQU     .1
TMR1ON  EQU     .0

;----- T2CON Bits ---------------------------------------------------------

TOUTPS3  EQU     .6
TOUTPS2  EQU     .5
TOUTPS1  EQU     .4
TOUTPS0  EQU     .3
TMR2ON  EQU     .2
T2CKPS1  EQU     .1
T2CKPS0  EQU     .0

;----- SSPCON Bits --------------------------------------------------------

WCOL  EQU     .7
SSPOV  EQU     .6
SSPEN  EQU     .5
CKP  EQU     .4
SSPM3  EQU     .3
SSPM2  EQU     .2
SSPM1  EQU     .1
SSPM0  EQU     .0

;----- CCP1CON Bits -------------------------------------------------------

PIM1  EQU     .7
PIM0  EQU     .6
DC1B1  EQU     .5
DC1B0  EQU     .4
CCP1M3  EQU     .3
CCP1M2  EQU     .2
CCP1M1  EQU     .1
CCP1M0  EQU     .0

;----- RCSTA Bits ---------------------------------------------------------

SPEN  EQU     .7
RX9  EQU     .6
SREN  EQU     .5
CREN  EQU     .4
ADDEN  EQU     .3
FERR  EQU     .2
OERR  EQU     .1
RX9D  EQU     .0

;----- PWM1CON Bits --------------------------------------------------------

PRSEN  EQU     .7
PDC6  EQU     .6
PDC5  EQU     .5
PDC4  EQU     .4
PDC3  EQU     .3
PDC2  EQU     .2
PDC1  EQU     .1
PDC0  EQU     .0

;----- ECCPAS Bits --------------------------------------------------------

ECCPASE  EQU     .7
ECCPAS2  EQU     .6
ECCPAS1  EQU     .5
ECCPAS0  EQU     .4
PSSAC1  EQU     .3
PSSAC0  EQU     .2
PSSBD1  EQU     .1
PSSBD0  EQU     .0

;----- ADCON0 Bits --------------------------------------------------------

ADFM  EQU     .7
VCFG  EQU     .6
CHS3  EQU     .5
CHS2  EQU     .4
CHS1  EQU     .3
CHS0  EQU     .2
GODONE  EQU     .1
ADON  EQU     .0

;----- CCP2CON Bits -------------------------------------------------------

;CCP2X                        EQU     .5
;CCP2Y                        EQU     .4
;CCP2M3                       EQU     .3
;CCP2M2                       EQU     .2
;CCP2M1                       EQU     .1
;CCP2M0                       EQU     .0

;----- OPTION Bits --------------------------------------------------------

RABPU  EQU     .7
INTEDG  EQU     .6
T0CS  EQU     .5
T0SE  EQU     .4
PSA  EQU     .3
PS2  EQU     .2
PS1  EQU     .1
PS0  EQU     .0

;----- TRISE Bits ---------------------------------------------------------

;IBF  EQU     .7
;OBF  EQU     .6
;IBOV  EQU     .5
;PSPMODE  EQU     .4
;TRISE2  EQU     .2
;TRISE1  EQU     .1
;TRISE0  EQU     .0

;----- PIE1 Bits ----------------------------------------------------------

;PSPIE  EQU     .7
ADIE  EQU     .6
RCIE  EQU     .5
TXIE  EQU     .4
SSPIE  EQU     .3
CCP1IE  EQU     .2
TMR2IE  EQU     .1
TMR1IE  EQU     .0

;----- PIE2 Bits ----------------------------------------------------------

OSFIE  EQU     .7
C2IE  EQU     .6
C1IE  EQU     .5
EEIE  EQU     .4

;----- PCON Bits ----------------------------------------------------------

ULPWUE  EQU     .5
SBOREN  EQU     .4
NOT_POR  EQU     .1
NOT_BOR  EQU     .0

;----- SSPSTAT Bits -------------------------------------------------------

SMP  EQU     .7
CKE  EQU     .6
D_A  EQU     .5
P  EQU     .4
S  EQU     .3
R_W  EQU     .2
UA  EQU     .1
BF  EQU     .0

;----- TXSTA Bits ---------------------------------------------------------

CSRC  EQU     .7
TX9  EQU     .6
TXEN  EQU     .5
SYNC  EQU     .4
SENDB  EQU    .3
BRGH  EQU     .2
TRMT  EQU     .1
TX9D  EQU     .0

;----- ADCON1 Bits --------------------------------------------------------

ADCS2  EQU     .2
ADCS1  EQU     .1
ADCS0  EQU     .0

;----- EECON1 Bits --------------------------------------------------------

EEPGD  EQU  .7
WRERR  EQU  .3
WREN  EQU  .2
WR   EQU  .1
RD   EQU  .0

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

시뮬레이터 실행하기  (0) 2011.07.12
포트 설정하기  (0) 2010.08.03
13. 레지스터 설정하기  (0) 2010.08.02
12. 레지스터 정의하기  (0) 2010.08.02
11. 포트 정의하기  (0) 2010.08.02
10. 레지스터 클리어  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:45

;----------------------------------------------------------;
;                           PROGRAM DEFINITION                            ;
;----------------------------------------------------------;
COUNT1  EQU  0x20
COUNT2  EQU  0x21
COUNT3  EQU  0x22
GET_DATA EQU  0x23
ADDR_BUFF EQU  0x24
BIT_CNT  EQU  0x25
REG_ALL_CNT EQU  0x26
ADDR_REG EQU  0x27

M_COUNT1 EQU  0x30
M_COUNT2 EQU  0x31
M_COUNT3 EQU  0x32
TEMP1  EQU  0x33
TEMP2  EQU  0x34
B_TEMP1  EQU  0x35

DATA_EE_ADDR EQU 0x4A
DATA_EE_DATA EQU 0x4B

MODE  EQU 0x50
PERIOD  EQU 0x51
ID1  EQU 0x52
ID2  EQU 0x53
ID3  EQU 0x54
ID4  EQU 0x55
CHKSUM  EQU 0x56

BUF_RXD_RF  EQU 0x60
RXD_RF_MODE  EQU 0x61
RXD_RF_PERIOD  EQU 0x62
RXD_RF_ID1  EQU 0x63
RXD_RF_ID2  EQU 0x64
RXD_RF_ID3  EQU 0x65
RXD_RF_ID4  EQU 0x66
RXD_RF_CHKSUM  EQU 0x67

BUF_TMR0  EQU 0x68;;
BUF_TMR1  EQU 0x69;;
TIMEFLAG  EQU 0x6A;;
TMR1_CNT1  EQU 0x6B;;
FLAG_RXD_RF  EQU 0x74
CNT_UNI2  EQU 0x75
CNT_UNI   EQU 0x76

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

포트 설정하기  (0) 2010.08.03
13. 레지스터 설정하기  (0) 2010.08.02
12. 레지스터 정의하기  (0) 2010.08.02
11. 포트 정의하기  (0) 2010.08.02
10. 레지스터 클리어  (0) 2010.08.02
9. 딜레이 설정  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:43

;------------------------------------------;
;    PORT DEFINITION                                  ;
;------------------------------------------;

#DEFINE REG_SW  PORTA,.0;NC
#DEFINE TESTSW  PORTA,.1;DCLK CC1020->MCU
#DEFINE WAKEUPPIN PORTA,.2

#DEFINE TXD  PORTC,.0;PDIO MCU<->CC1020
#DEFINE POWDOWN PORTC,.1;PSEL MCU->CC1020 LOW ACTIVE INTER PULLUP
#DEFINE CS  PORTC,.2
#DEFINE SCL  PORTC,.3;PCLK MCU->CC1020
#DEFINE SDA  PORTC,.4;PDO  MCU->CC1020
#DEFINE LED  PORTC,.5
#DEFINE ADC  PORTC,.6
#DEFINE ADCPOW  PORTC,.7


#DEFINE PIN3 PORTB,.4;3 OUT
#DEFINE PIN2 PORTB,.5;2 OUT
#DEFINE PIN7 PORTB,.6;4 IN
#DEFINE PIN8 PORTB,.7;6 IN

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

13. 레지스터 설정하기  (0) 2010.08.02
12. 레지스터 정의하기  (0) 2010.08.02
11. 포트 정의하기  (0) 2010.08.02
10. 레지스터 클리어  (0) 2010.08.02
9. 딜레이 설정  (0) 2010.08.02
8. TMR0 설정하기.  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:42
프로그램을 시작하기 전에 레지스터 값을 클리어 해주지 않으면 더미값으로 인해 원하지 않는 행동이 발생하기도 합니다.

RAMCLEAR
 MOVLW 0X20
 MOVWF FSR
RAMCLEAR1
 CLRWDT
 CLRF INDF
 INCF FSR
 MOVLW 0X80
 XORWF FSR, W
 BTFSS STATUS, ZF
 GOTO RAMCLEAR1
 RETURN

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

12. 레지스터 정의하기  (0) 2010.08.02
11. 포트 정의하기  (0) 2010.08.02
10. 레지스터 클리어  (0) 2010.08.02
9. 딜레이 설정  (0) 2010.08.02
8. TMR0 설정하기.  (0) 2010.08.02
7. 내부 EEPROM 사용하기  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:41
4MHz X-TAL 사용시 딜레이 타임 설정
딜레이 설정시 명령어당 사이클 수를 계산하여 설정해주어야 합니다.

DELAY_200US   
 MOVLW .49  
 MOVWF COUNT1
 GOTO D_US
DELAY_400US
 MOVLW .99  
 MOVWF COUNT1
 GOTO D_US
DELAY_500US   
 MOVLW .124
 MOVWF COUNT1
 GOTO D_US
DELAY_550US   
 MOVLW .136
 MOVWF COUNT1
 GOTO D_US
DELAY_600US
 MOVLW .150
 MOVWF COUNT1
 GOTO D_US
DELAY_800US
 MOVLW .200
 MOVWF COUNT1
 GOTO D_US
DELAY_1MS
 MOVLW .250
 MOVWF COUNT1
 GOTO D_US
D_US
 CLRWDT
 DECFSZ COUNT1
 GOTO D_US
 RETLW 0x00

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

11. 포트 정의하기  (0) 2010.08.02
10. 레지스터 클리어  (0) 2010.08.02
9. 딜레이 설정  (0) 2010.08.02
8. TMR0 설정하기.  (0) 2010.08.02
7. 내부 EEPROM 사용하기  (0) 2010.08.02
6. 동기 엣지 검출하기  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:39
내부 TMR0 설정하기

START_TMR0_2US
 MOVLW B'00000000' ;TMR0 PRE(1:2)타이머0를2분주(4MHz=0.25US,*4CLK,*2분주=2US)
 GOTO START_TMR0_INIT
START_TMR0_4US
 MOVLW B'00000001' ;TMR0 PRE(1:4)타이머0를4분주(4MHz=0.25US,*4CLK,*4분주=4US)
 GOTO START_TMR0_INIT
START_TMR0_8US
 MOVLW B'00000010' ;TMR0 PRE(1:8)타이머0를8분주(4MHz=0.25US,*4CLK,*8분주=8US)
 GOTO START_TMR0_INIT
START_TMR0_16US
 MOVLW B'00000011' ;TMR0 PRE(1:16)타이머0를16분주(4MHz=0.25US,*4CLK,*16분주=16US)
 GOTO START_TMR0_INIT
START_TMR0_32US
 MOVLW B'00000100' ;TMR0 PRE(1:32)타이머0를32분주(4MHz=0.25US,*4CLK,*32분주=32US)
 GOTO START_TMR0_INIT
START_TMR0_128US
 MOVLW B'00000110' ;TMR0 PRE(1:128)타이머0를128분주(4MHz=0.25US,*4CLK,*128분주=128US)
 GOTO START_TMR0_INIT
START_TMR0_256US
 MOVLW B'00000111' ;TMR0 PRE(1:256)타이머0를256 분주(4MHz=0.25US,*4CLK,*256분주=256US)
START_TMR0_INIT
 SELBANK1
 MOVWF OPTIONR
 SELBANK0
 BCF  INTCON,T0IF
 CLRF TMR0
 BCF  INTCON,GIE;전체INT사용중지
 BCF  INTCON,T0IE;T0INT사용중지
 RETURN

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

10. 레지스터 클리어  (0) 2010.08.02
9. 딜레이 설정  (0) 2010.08.02
8. TMR0 설정하기.  (0) 2010.08.02
7. 내부 EEPROM 사용하기  (0) 2010.08.02
6. 동기 엣지 검출하기  (0) 2010.08.02
5. TMR 사용하기.  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:38

EEPROM_WR
 CLRWDT
 SELBANK0
 MOVF DATA_EE_ADDR, W;데이터를 넣을주소값
 SELBANK2
 MOVWF EEADR
 SELBANK0
 MOVF DATA_EE_DATA, W;;넣을데이터값
 SELBANK2
 MOVWF EEDAT
 SELBANK3
 BCF  EECON1, EEPGD ;Point to DATA memory
 BSF  EECON1, WREN;쓰기 허용
 BCF INTCON, GIE ;Disable INTs.
 BTFSC INTCON, GIE ;SEE AN576
 GOTO $-2
 MOVLW 0x55
 MOVWF EECON2
 MOVLW 0xAA
 MOVWF EECON2
 BSF  EECON1, WR;쓰기 시작
 BTFSC EECON1, WR;쓰기가 다끝났는지 확인.
 GOTO $-1 ;현재 어드레스에서 한단계전으로 이동.
 BCF  EECON1, WREN;쓰기 금지
 SELBANK0
 RETURN

EEPROM_RD
 CLRWDT
 SELBANK0
 MOVF DATA_EE_ADDR, W;데이터를읽어올주소 값
 SELBANK2
 MOVWF EEADR ;Data Memory Address to read
 SELBANK3
 BCF EECON1, EEPGD ;Point to DATA memory
 BSF EECON1, RD ;EE Read
 BTFSC EECON1, RD
 GOTO $-1;리딩을 다했는지 확인
 SELBANK2
 MOVF EEDAT, W ;W = EEDAT
 SELBANK0
 RETURN

'초보의 아웅다웅 설계하기 > PIC' 카테고리의 다른 글

9. 딜레이 설정  (0) 2010.08.02
8. TMR0 설정하기.  (0) 2010.08.02
7. 내부 EEPROM 사용하기  (0) 2010.08.02
6. 동기 엣지 검출하기  (0) 2010.08.02
5. TMR 사용하기.  (0) 2010.08.02
4. 내부 풀업 사용하기  (0) 2010.08.02
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:37




GET_RXD_RF
;결과값1:W<-1,0(1:정상,0:에러)
;결과값2:RXD_RF_MODE
;결과값3:RXD_RF_PERIOD
;결과값4:RXD_RF_ID1
;결과값5:RXD_RF_ID2
;결과값6:RXD_RF_ID3
;결과값7:RXD_RF_ID4
;결과값8:RXD_RF_CHKSUM

     CALL START_TMR0_8US
     BTFSC INTCON,T0IF
     RETLW .0;에러
     BTFSS TXD;싱크헤드시작지점찾기위해H체크
     GOTO $-3;현위치에서 3칸 위로 돌아가라(BTFSC INTCON,T0IF 지점으로 이동)
CHK_SYNCHEAD_START;┐싱크헤드시작지점하강에지찾음
     CALL START_TMR0_8US;2048US동안
     BTFSC INTCON,T0IF
     RETLW .0;에러
     BTFSC TXD
     GOTO $-3
CHK_SYNCHEAD_TIME;└────┘싱크헤드구간측정
     CALL START_TMR0_8US
     BTFSC INTCON,T0IF
     RETLW .0;에러
     BTFSS TXD
     GOTO $-3
     MOVF TMR0,W
     MOVWF BUF_TMR0
     MOVLW .188
     SUBWF BUF_TMR0,W
     BTFSS STATUS,CF;1500US보다짧으면에러
     RETLW .0;에러
     MOVLW .250
     SUBWF BUF_TMR0,W
     BTFSC STATUS,CF;2000US보다길면에러
     RETLW .0;에러
CHK_STARTBIT_H;스타트비트H구간시간체크 ┌┐
     CALL START_TMR0_4US
     BTFSC INTCON,T0IF
     RETLW .0;에러
     BTFSC TXD
     GOTO $-3
     MOVF TMR0,W
     MOVWF BUF_TMR0
     MOVLW .50;60
    SUBWF BUF_TMR0,W
     BTFSS STATUS,CF;240US보다짧으면에러
     RETLW .0;에러
     MOVLW .150;125
     SUBWF BUF_TMR0,W
     BTFSC STATUS,CF;600US보다길면에러
     RETLW .0;에러
     MOVLW RXD_RF_MODE
     MOVWF FSR
     CALL DELAY_500US
CHK_EDGE_RXD_RF
     CLRF INDF
     CLRF CNT_UNI
     MOVLW .8
     MOVWF CNT_UNI
CHK_EDGE_RXD_RF2
     CALL START_TMR0_4US
     BTFSC TXD
     GOTO CHK_DOWNEDGE
CHK_UPEDGE
     BTFSC INTCON,T0IF
     RETLW .0;에러
     BTFSS TXD
     GOTO $-3
     MOVF TMR0,W
     MOVWF BUF_TMR0
     MOVLW .250;150
     SUBWF BUF_TMR0,W
     BTFSC STATUS,CF;600US보다길면에러
     RETLW .0;에러
     CALL DELAY_500US
     BCF  STATUS,CF
     GOTO GET1BYTE_RXD_RF
CHK_DOWNEDGE
     BTFSC INTCON,T0IF
     RETLW .0;에러
     BTFSC TXD
     GOTO $-3
     MOVF TMR0,W
     MOVWF BUF_TMR0
     MOVLW .200;150
     SUBWF BUF_TMR0,W
     BTFSC STATUS,CF;600US보다길면에러
     RETLW .0;에러
     CALL DELAY_600US
     BSF  STATUS,CF
GET1BYTE_RXD_RF
     RRF  INDF
     DECFSZ CNT_UNI
     GOTO CHK_EDGE_RXD_RF2
     INCF FSR
     MOVLW 0x68;TEST
     XORWF FSR, W
     BTFSS STATUS, ZF
     GOTO CHK_EDGE_RXD_RF
     RETLW .1

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:27
프로그램을 짜다보면 TMR을 사용하는 경우가 많이 생깁니다.
들어오는 입력신호의 길이를 측정하거나,(물론 타이머가 아니여도 측정할 수는 있습니다.)
일정시간 후 다른 동작을 해야하는 인터럽트로 사용한다거나 하는 등의 경우처럼요.
물론 정밀한 시간을 측정해야 할 경우 외부에서 받아오는 경우도 있습니다.

이 타이머도 설정만하고 초기화 하지 않으면 TMR0 초기값이 0이 아닌 다른값에서 시작하여 예측 불허의 결과가 생길 수도 있습니다.    
   
TMR0_SET; INTCON을 설정하는 순간부터 인터럽트가 허가 되므로 INTCON을 나중에 설정    
SELBANK1    
MOVLW   B'00000101';ENABLE GLOBAL WEAK PULL-UP, TMR PRES(1:64)
MOVWF   OPTIONR
SELBANK0    
CLRF   TMR0
MOVLW   B'10100000'
MOVWF   INTCON
RETURN     
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:21
PIC에서는 내부 풀업을 지원합니다.
내부 풀업이 있으면 CHIP 단가(1608TYPE, 47K 저항 약 0.6원)를 줄일 수 있고, ARTWORK시 패턴하나 안 그려도 돼서 편리하고 SMT시(표준 CHIP SMD 약 6원)가격도 내려가게 되어 여러모로 유리하게 됩니다. 당연한 이야기겠지만, 대전류 사용시에는 사용 불가합니다. ^ ^;;

1. 내부 풀업을 하지 않아서 오동작
    OPTIONR 레지스터에서 글로벌 내부 풀업 뿐만 아니라 개별 풀업도 설정해주어야 사용이 가능합니다. 글로벌 내부 풀업만 딸랑 해주고 입력이 오동작 한다고 눈물을 흘릴때가 분명히 생깁니다.    
     
2. ADCON 설정을 하지 않아 포트 오동작.
 ADCON을 사용하지 않을때는 ANSEL 설정을 해줘야 합니다. AD 컨버터 설정을 안해주면 이상한 동작을 하거나 동작을 하지 않아 난감한 경우가 발생하게 됩니다.    
     
     
 BCF  ADCON0,.0; ADCON DISABLE  
 SELBANK1    
 MOVLW   B'00000010'  
 MOVWF   WPUA ;PORTA ENABLE WEAK PULL-UP    
 SELBANK2    
 CLRF   ANSEL  ;DIGITAL IO
 CLRF   ANSELH  ;DIGITAL IO
 MOVLW   B'11110000'  
 MOVWF   WPUB ;PORTB ENABLE WEAK PULL-UP    
 BCF    
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:10
PCL(PROGRAM COUNTER)를 사용하는 데이터 테이블의 위치가 주소의 경계면에 위치하면 오동작이 발생할 수 있습니다.
페이지가 다를 경우뿐만 아니라 0FF, 1FF, 2FF 이런식으로 큰 주소가 바뀔 경우데도 문제가 발생 할 수 있습니다.
 - 상위 비트 PCLATH의 영향을 받아 CLRF PCLATH를 해줘야 합니다.  
   PC가 페이지 바운더리에 걸리지 않게 페이지 확인해서 수정해야 합니다. 
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 16:06
프로그램을 짜다 보면 서브 루틴을 만들고 그 서브루틴을 불러오는 경우가 생기고, 서브루틴 하위에 또 서브 루틴을 불러오는 경우가 종종 생깁니다.
하지만 너무 깊이 들어가다보면 의도하지 않은대로 프로그램이 돌아 원인을 찾는데 너무 많은 시간을 허비할 때도 있습니다.(어디서 문제가 생겼는 지 찾아 낼 수가 없어서)

총 부를 수 있는 CALL문 수치 8개(DATA SHEET의 STACK LEVEL 수치 확인)            
 - 실 수치보다 더 부를 경우(예. CALL문안에 CALL문안에 CALL 문안에........) 문제 발생하게 되므로 적당히 계산해서 사용해야 합니다.  

사용자 삽입 이미지
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.08.02 15:48
PIC에서는 메모리 뱅크가 나누어져 있고, 메모리 뱅크에 관계없이 계속해서 프로그램을 만들게 되면 프로그램을 넣을 수 있는 메모리 구역을 넘어가게 되어 이상 동작이 발생하게됩니다.
여기에서는 PIC16F690을 예로 들어 설명하겠습니다.(사용이유 20PIN, 저가, NOMAL SPEC.)

000번지에서 7FF번지까지 PAGE0
800번지에서 FFF번지까지 PAGE1
로 구성되어있습니다.
(16F887같이 PAGE가 4개인 CHIP도 있습니다.)
사용자 삽입 이미지
<PIC16F690 DATASHEET에서>


PCLATH, .3을 1로 셋하거나 0으로 해서 페이지 설정을 해야함.        
- 프로그램의 길이가 길어서 페이지를 넘어가게 될경우(프로그램 확인)        
  주소 지정을 해서 번지를 옮겨주어야 합니다. (ORG 0x800)


예)
;-----------------------------------;
;             MACRO                            ;
;-----------------------------------;
;매번 뱅크를 옮길때마다 적어주는 게 번거롭기 때문에 미리 매크로 설정을 해둡니다.

SELBANK0 MACRO
  BCF STATUS,RP1
  BCF STATUS,RP0
  ENDM

SELBANK1 MACRO
  BCF STATUS,RP1
  BSF STATUS,RP0
  ENDM

SELBANK2 MACRO
  BSF STATUS,RP1
  BCF STATUS,RP0
  ENDM

SELBANK3 MACRO
  BSF STATUS,RP1
  BSF STATUS,RP0
  ENDM

SELPAGE1 MACRO
   BSF PCLATH,.3
   ENDM

SELPAGE0 MACRO
   BCF PCLATH,.3
   ENDM

;--------------------------------------;
;      RESET VECTOR              ;
;--------------------------------------;

 ORG 0x000;프로그램 시작
 GOTO PRG_START;인터럽트가 0x004번지로 기본 설정되어있으므로 그 부분을 넘어가서 프로그램 시작부분

;--------------------------------------;
;         INTERRUPT              ;
;--------------------------------------;

 ORG 0x004;인터럽트가 걸리면 무조건 0x004번지로 이동하므로 여기에서 어떤 인터럽트가 걸렸는지 확인해서 처리해줘야합니다.

;--------------------------------------;
;        MEMORY PAGE0            ;
;        PROGRAM START           ;
;--------------------------------------;

PRG_START
     SELBANK0; 매크로 설정한 부분을 불러오기(라이팅될 때는 불러온 부분이 전부 적히기 때문에 용량이 커질 수 있습니다. 편하게 하려고 매크로 설정을 막 하다가는 용량이 문제가 될 수 있습니다. 용도에 따라 CALL문을 적절히 사용해 주세요.)


;--------------------------------------;
;        MEMORY PAGE1            ;
;--------------------------------------;

 ORG 0x800


 END        

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요