Pic Programlama Sorusu

Başlatan Serhado, 01 Kasım 2014, 02:07:18

Serhado

Selamun Aleykum Arkadaslar, cozmeye calistigim bir soru var ve yaptigim kodlarla hata veriyor olmuyor, lutfen yardimci olurmusunuz.

Soru Soyle: PORTB uzerine 1 baslangic degeri ile baslayip icerigi birer birer arttirip PORTB'ye aktaran bir sayaci tasarlayiniz.

yazdigim kod ise su sekilde:


LIST P=F16F877A
#include <P16F877A.inc>

SAYAC1 EQU 0X21
SAYAC2 EQU 0X22
DEGER EQU 0X23

BANKSEL TRISB
CLRF TRISB
BANKSEL PORTB
CLRF PORTB
MOVLW 0X01
MOVWF DEGER

BASLA
RLF DEGER,1
MOVF DEGER,W
MOVWF PORTB
CALL GECIK5
GOTO BASLA

GECIK
MOVLW H'FF'
MOVWF SAYAC1

DONGU1
MOVLW H'FF'
MOVWF SAYAC2

DONGU2
INCF SAYAC2,F
GOTO DONGU2
INCF SAYAC1,F

GOTO DONGU1

RETURN

END



Acaba nereede hata yapiyorum lutfen gosterirmisiniz.

iyi calismalar..

Kabil ATICI

#1
RLF DEGER,1
burada. Bu komutla ancak 2' ile çarparsın. (elde üzerinden sola kaydırma komutu)

INCF komutu ve kullanımına bak.

INCF SAYAC2,F
GOTO DONGU2 
INCF SAYAC1,F
GOTO DONGU1

Hatan burada , döngüden nasıl çıkacaksn?
DECFSZ ile internette nasıl yapıldığını incele.

DONGU
        MOVLW 0xFF
        MOVWF TMP1
don2
        MOVLW 0xFF
        MOVWF TMP0
don1
        DECFSZ TMP0,F
        GOTO don1
        DECFSZ TMP1,F
        GOTO don2
         RETURN

Örnek döngü.. burada TMP0 sürekli 1 azaltılır ve kontrol edilir değer 0 değilse DON1'e gider, değer 0 ise bir  satır atlar, aynı şekilde TMP1 aynı işleme tabi tutulur, değer 0 değil ise don2'e gider ve TMP0 değeri tazelenir. TMP1 0 ise döngüden çıkılıp geri dönülür.
ambar7

Serhado

LIST P=F16F877A
#include <P16F877A.inc>

SAYAC1 EQU 0X21
SAYAC2 EQU 0X22
DEGER EQU 0X23

ORG 0X00

BANKSEL TRISB
CLRF TRISB
BANKSEL PORTB
CLRF PORTB
MOVLW 0X01
MOVWF DEGER

BASLA
INCFSZ DEGER,1
MOVF DEGER,W
MOVWF PORTB
CALL DONGU
GOTO BASLA

DONGU
MOVLW 0X00
MOVWF SAYAC1

DONGU1
MOVLW 0X00
MOVWF SAYAC2

DONGU2
INCFSZ SAYAC2,F
GOTO DONGU2
INCFSZ SAYAC1,F

GOTO DONGU1

RETURN

END


hocam su sekilde duzenledim ama hala hatali hatanin tam olarak nerede ve nasil cozecegimi gosterirmisiniz lutfen, simdiden tskler..

ido2323

#3
şöyle bi dene

LIST P=F16F877A
#include <P16F877A.inc>

SAYAC1 EQU 0X21
SAYAC2 EQU 0X22
DEGER EQU 0X23

ORG 0X00

MOVLW 07h ; Turn off
MOVWF CMCON ; comparator
MOVLW 0Fh ; Configure A/D
MOVWF ADCON1 ; for digital inputs


BANKSEL TRISB
CLRF TRISB
BANKSEL PORTB
CLRF PORTB
MOVLW 0X01
MOVWF DEGER

BASLA
INCF DEGER,1
MOVF DEGER,W
MOVWF PORTB
CALL DONGU
GOTO BASLA

DONGU
MOVLW 0X00
MOVWF SAYAC1

DONGU1
MOVLW 0X00
MOVWF SAYAC2

DONGU2
INCFSZ SAYAC2,F
GOTO DONGU2
INCFSZ SAYAC1,F

GOTO DONGU1

RETURN

END

Kabil ATICI

BASLA
INCFSZ DEGER,1;<<<<<<Burası INCF DEGER,1 olması yeterli.
MOVF DEGER,W
MOVWF PORTB
CALL DONGU
GOTO BASLA

ambar7

Serhado

yaptim hocam, 6 gecikmeli bir dongu kurup projemi teslim ettim :) cevap veren arkadaslara tskler..

spradon

Arkadaşlar kolay gelsin aşağıdaki asm dosyasını hex dosyasına çevirmem gerekiyor fakat bir türlü yapamıyorum. Yardımcı olurmusunuz.
Saygılar.


;EARTHRES411.ASM 08MAR03 - JOHN BECKER - EPE EARTH RESISTIVITY LOGGER

;PIC16F876 3.6864MHz xtal, WDT off, POR on
; written in TASM for TK3 assembly

                LIST P = PIC16F876,R=DEC
                __config H'3F31'

#DEFINE BANK0 BCF 3,5    ; status bit 5
#DEFINE BANK1 BSF 3,5    ; status bit 5
#DEFINE BLOCK0 BCF $03,7 ; clear STATUS bit 7 (IRP)
#DEFINE BLOCK1 BSF $03,7 ; set   STATUS bit 7 (IRP)

      include P16F876.inc


LOOPA:      .EQU $20     ;loop counter 2 - LCD use only
STORE1:     .EQU $21     ;general store 1
CLKCNT:     .EQU $22     ;pre-counter for CLOCK
RSLINE:     .EQU $23     ;RS line flag for LCD
SQUAREWAVE: .EQU $24     ; output waveform
COUNT0      .EQU $25     ; lsb
COUNT1      .EQU $26     ; nsb
COUNT2      .EQU $27     ; msb
DIGIT1      .EQU $28     ; lsd digital conversion
DIGIT2      .EQU $29
DIGIT3      .EQU $2A
DIGIT4      .EQU $2B
DIGIT5      .EQU $2C
DIGIT6      .EQU $2D
DIGIT7      .EQU $2E
DIGIT8      .EQU $2F     ; msd digital conversion

BITCNT      .EQU $30     ; maths routine counter
DIGCNT      .EQU $31     ; maths routine counter
MEMHI:      .EQU $32     ; msb val to be sent to eeprom chip
MEMLO:      .EQU $33     ; lsb val to be sent to eeprom chip
CHAN:       .EQU $34
BCOUNT:     .EQU $35
COUNT:      .EQU $36
DATAI:      .EQU $37
DATAO:      .EQU $38
EEPROM:     .EQU $39
MODE:       .EQU $3A
STORE2:     .EQU $3B     ; temp store
MULCLSB:    .EQU $3C     ; multiplicant LSB
MULCMSB:    .EQU $3D     ; multiplicant MSB
MULPLSB:    .EQU $3E     ; multiplier LSB
MULPMSB:    .EQU $3F     ; multiplier MSB

PRODLSB:    .EQU $40     ; product LSB
PRODMSB:    .EQU $41     ; product MSB
GRIDCOL     .EQU $42     ; survey site grid - column (vertical)
GRIDROW     .EQU $43     ; survey site grid - row (horizontal)
GRIDREFMSB: .EQU $44     ; address of byte to be stored. Chip 24LC256 has 32K bytes (8-bit)
GRIDREFLSB: .EQU $45     ; sq rt 32K = 180, therefore max grid that can be stored = 180 x 180
POLLCNT:    .EQU $46     ; serial eeprom use
RADDRH:     .EQU $47     ; serial eeprom read address
RADDRL:     .EQU $48
WADDRH:     .EQU $49     ; serial eeprom write address
WADDRL:     .EQU $4A
SLAVE:      .EQU $4B     ; serial eeprom use
TXBUF:      .EQU $4D
SAVEMSB:    .EQU $4E     ; value to be saved to serial eeprom
SAVELSB:    .EQU $4F

COLHEIGHT:  .EQU $50
ROWWIDTH:   .EQU $51
HIGHMSB:    .EQU $52
HIGHLSB:    .EQU $53
LOWMSB:     .EQU $54
LOWLSB:     .EQU $55
OCXFLAG      EQU $56
OCXSTORE     EQU $57

; IN ALL PAGES

AVRGCNT:    .EQU $70     ; average location store counter
LOOP:       .EQU $71     ; loop counter 1 - general
HIGH0MSB:   .EQU $72
HIGH0LSB:   .EQU $73
LOW0MSB:    .EQU $74
LOW0LSB:    .EQU $75
HIGH1MSB:   .EQU $76
HIGH1LSB:   .EQU $77
LOW1MSB:    .EQU $78
LOW1LSB:    .EQU $79
MIXHMSB:    .EQU $7A
MIXHLSB:    .EQU $7B
MIXLMSB:    .EQU $7C
MIXLLSB:    .EQU $7D
TEMPCNT:    .EQU $7E

               ; locations up to $7F are available

; IN PAGE 2

AVERAGE0:   .EQU $10     ; averaging store 0, extends to $4F

               ;........bit values

DI:         .EQU $07        ; eeprom input bit
DO:         .EQU $06        ; eeprom output bit
SDATA:      .EQU $04        ; serial EE data line (PORTC)
SCLK:       .EQU $03        ; serial EE clock line (PORTC)

                .ORG 0
                goto 5                 
                .ORG 4
                goto 5                 
                .ORG 5

START:          bcf STATUS,RP0
                bcf STATUS,RP1         
                clrf PORTA             
                clrf PORTB
                movlw %01000000
                movwf PORTC

                BANK1                   
                movlw %11111011     ; RA2 as output, RA0, RA1, RA3 as analog input
                movwf TRISA
                clrf TRISB
                clrf TRISC
                movlw %10101110     ; set RHS justify, RA0 as analog input, rest as digital I/O
                movwf ADCON1        ;
                movlw %00000100     ; timer 1:32, pull-ups on
                movwf OPTION_REG    ;
                BANK0                   
                movlw %01000001     ; set AD on, Fosc/8
                movwf ADCON0
                call PAUSIT             

                goto SETUP


TABLCD: addwf PCL,F     ;LCD initialisation table
        retlw %00110011 ;initialise lcd - first byte
        retlw %00110011 ;2nd byte (repeat of first)
        retlw %00110010 ;set for 4-bit operation
        retlw %00101100 ;set for 2 lines
        retlw %00000110 ;set entry mode to increment each address
        retlw %00001100 ;set display on, cursor off, blink off
        retlw %00000001 ;clear display
        retlw %00000010 ;return home, cursor & RAM to zero
                        ;end inititalisation table

MESSAG1: addwf PCL,F
        retlw 'S'
        retlw 'P'
        retlw 'R'
        retlw 'A'
        retlw 'D'
        retlw 'O'
        retlw 'N'
        retlw ' '
        retlw 'J'
        retlw 'E'
        retlw 'O'
        retlw 'F'
        retlw 'I'
        retlw 'Z'
        retlw 'I'
        retlw 'K'

MESSAG2: addwf PCL,F
        retlw 'B'
        retlw 'E'
        retlw 'L'
        retlw 'L'
        retlw 'E'
        retlw 'K'
        retlw ' '
        retlw 'S'
        retlw 'I'
        retlw 'L'
        retlw 'I'
        retlw 'N'
        retlw 'I'
        retlw 'Y'
        retlw 'O'
        retlw 'R'

MESSAG3: addwf PCL,F
        retlw 'P'
        retlw 'C'
        retlw '''
        retlw 'Y'
        retlw 'E'
        retlw ' '
        retlw 'B'
        retlw 'A'
        retlw 'G'
        retlw 'L'
        retlw 'A'
        retlw 'N'
        retlw 'I'
        retlw 'Y'
        retlw 'O'
        retlw 'R'

MESSAG4: addwf PCL,F
        retlw 'A'
        retlw 'K'
        retlw 'T'
        retlw 'A'
        retlw 'R'
        retlw 'M'
        retlw 'A'
        retlw ' '
        retlw 'B'
        retlw 'I'
        retlw 'T'
        retlw 'T'
        retlw 'I'
        retlw ' '
        retlw ' '
        retlw ' '

MESSAG5: addwf PCL,F
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw 'O'
        retlw 'F'
        retlw ' '
        retlw '3'
        retlw '2'
        retlw '7'
        retlw '6'
        retlw '8'
        retlw ' '

MESSAG7    addwf PCL,F
           retlw 'S'
           retlw 'E'
           retlw 'R'
           retlw 'I'
           retlw 'A'
           retlw 'L'
           retlw ' '
           retlw 'G'
           retlw 'I'
           retlw 'R'
           retlw 'I'
           retlw 'S'
           retlw ' '
           retlw ' '
           retlw ' '
           retlw ' '

MESSAGEJ   addwf PCL,F
           retlw 'S'
           retlw 'E'
           retlw 'R'
           retlw 'I'
           retlw 'A'
           retlw 'L'
           retlw ' '
           retlw 'O'
           retlw 'C'
           retlw 'X'
           retlw ' '
           retlw 'T'
           retlw 'O'
           retlw ' '
           retlw 'P'
           retlw 'C'


SETUP:  call PAUSIT     ;1st 1/5th sec delay
LCDSET: clrf LOOP       ;clr LCD set-up loop
        clrf RSLINE     ;clear RS line for instruction send
LCDST2: movf LOOP,W     ;get table address
        call TABLCD     ;get set-up instruction
        call LCDOUT     ;perform it
        incf LOOP,F     ;inc loop
        btfss LOOP,3    ;has last LCD set-up instruction now been done?
        goto LCDST2     ;no
        call PAUSIT
        call SHOWTITLE

        clrf AVRGCNT
        movlw 2         ;initial basic CLKCNT val for secs timing
        movwf CLKCNT

        movlw %00000100
        movwf SQUAREWAVE
        movwf PORTA

        clrf CHAN
        clrf TMR0
        movlw 1
        movwf MODE

        clrf GRIDROW
        clrf GRIDCOL
        clrf GRIDREFMSB
        clrf GRIDREFLSB

        btfsc PORTA,5   ; is serial eeprom clearance needed?
        call CLEARIT    ; yes

        clrf OCXFLAG
        btfsc PORTC,2   ; is serial path change required?
        call SETOCX
        movlw 2
        call PRMGET
        movwf OCXFLAG
        movwf STORE1
        movlw 3
        call SETPRM

        movlw 0        ; get previous serial eeprom address
        call PRMGET
        andlw 127
        movwf GRIDCOL
        movlw 1
        call PRMGET
        andlw 127
        movwf GRIDROW

        movlw 127
        movwf ROWWIDTH
        movlw 127
        movwf COLHEIGHT
        call SHOWGRID
;        call SETBAUD


         btfss OCXFLAG,0
         goto SETNORM
         call JOESETBAUD      ; set baud rate
         goto MAIN

SETNORM: call SETBAUD      ; set baud rate

;....start of main routine

MAIN:   clrf TEMPCNT

        BCF INTCON,2



INTRPT:  btfss INTCON,2  ; has a timer time-out been detected?
         goto INTRPT     ; no

CHECKS1: btfss PORTC,0   ; check S1 - dec count
         goto CHECKS2
         call INCIT
         goto CHECKS1

CHECKS2: btfss PORTC,1   ; check S2 - inc count
         goto CHECKS3
         call DECIT
         goto CHECKS2

CHECKS3: btfsc PORTC,2   ; check S3 - toggle between Row and Col
         call INCMODE

CHECKC5: btfsc PORTC,5   ; check RC5 - send to PC
         call DOWNLOAD

CHECKA5: btfsc PORTA,5   ; is save needed?
         call STOREIT    ; yes

GETADC:  bcf ADCON0,3    ; set for chan 0
         bcf ADCON0,4    ; set for chan 0
         call DELAYB

         bsf ADCON0,GO   ; yes, start data conversion
WAITAD0: btfsc ADCON0,GO ; wait conversion flag
         goto WAITAD0
         btfss PORTA,2   ; is it pulse high being monitored?
         goto ADC00      ; no

         movf ADRESH,W   ; yes - monitor probe 0 HIGH
         movwf HIGH0MSB
         BANK1
         movf ADRESL,W
         BANK0
         movwf HIGH0LSB
         goto GETADC2

ADC00:   movf ADRESH,W     ; monitor probe 0 low
         movwf LOW0MSB
         BANK1
         movf ADRESL,W
         BANK0
         movwf LOW0LSB

         movf LOW0LSB,W    ; subtract LOW from HIGH LSB (only done after low has been taken)
         subwf HIGH0LSB,F  ; leaving answer in HIGH
         btfss STATUS,C    ; is there a borrow?
         incf LOW0MSB,F    ; yes, so inc val of next byte to be subtracted
         movf LOW0MSB,W    ; subtract LOW from HIGH MSB
         subwf HIGH0MSB,F
         btfsc STATUS,C    ; is there a borrow?
         goto GETADC2      ; no
         comf HIGH0MSB,F   ; yes, so invert answer
         comf HIGH0LSB,F   ; N.B. polarity of signal can change depending
         incf HIGH0LSB,F   ; on which op.amp receives the strongest signal

GETADC2: bsf ADCON0,3      ; set for chan 1
         call DELAYB
         bsf ADCON0,GO     ; yes, start data conversion
WAITAD01: btfsc ADCON0,GO  ; wait conversion flag
         goto WAITAD01
         btfss PORTA,2     ; is pulse high being monitored?
         goto ADC10        ; no

         movf ADRESH,W     ; yes - monitor probe 1 HIGH
         movwf HIGH1MSB
         BANK1
         movf ADRESL,W
         BANK0
         movwf HIGH1LSB
         goto GETADC3

ADC10:   movf ADRESH,W     ; get probe 1 LOW
         movwf LOW1MSB
         BANK1
         movf ADRESL,W
         BANK0
         movwf LOW1LSB

         movf LOW1LSB,W    ; subtract LOW from HIGH LSB only done after low has been taken
         subwf HIGH1LSB,F  ; leaving answer in HIGH
         btfss STATUS,C    ; is there a borrow?
         incf LOW1MSB,F    ; yes, so inc val of next byte to be subtracted
         movf LOW1MSB,W    ; subtract LOW from HIGH MSB
         subwf HIGH1MSB,F
         btfsc STATUS,C    ; is there a borrow?
         goto GETADC3      ; no
         comf HIGH1MSB,F   ; yes, so invert answer
         comf HIGH1LSB,F
         incf HIGH1LSB,F

GETADC3: bsf ADCON0,3      ; set for chan 3
         bsf ADCON0,4      ; set for chan 3
         call DELAYB
         bsf ADCON0,GO     ; yes, start data conversion
WAITAD03: btfsc ADCON0,GO  ; wait conversion flag
         goto WAITAD03
         btfss PORTA,2     ; is pulse high being monitored?
         goto ADC30        ; no

         movf ADRESH,W     ; yes - get mixed result HIGH clock
         movwf MIXHMSB
         movwf HIGHMSB
         BANK1
         movf ADRESL,W
         BANK0
         movwf MIXHLSB
         movwf HIGHLSB
         goto TOG5

ADC30: ; goto TOG5   ;**** reinstate temporarily to check baud rate on freq counter

         movf ADRESH,W     ; get mixed result LOW clock
         movwf MIXLMSB
         movwf LOWMSB
         BANK1
         movf ADRESL,W
         BANK0
         movwf MIXLLSB
         movwf LOWLSB

         movf MIXLLSB,W    ; subtract LOW from HIGH LSB only done after low has been taken
         subwf MIXHLSB,F   ; leaving answer in HIGH
         btfss STATUS,C    ; is there a borrow?
         incf MIXLMSB,F    ; yes, so inc val of next byte to be subtracted
         movf MIXLMSB,W    ; subtract LOW from HIGH MSB
         subwf MIXHMSB,F
         btfsc STATUS,C    ; is there a borrow?
         goto ADC31
         comf MIXHMSB,F    ; yes, so invert answer
         comf MIXHLSB,F
         incf MIXHLSB,F

ADC31:   BLOCK1
         movlw AVERAGE0    ; store answer for averaging
         addwf AVRGCNT,W
         movwf FSR
         movf MIXHLSB,W
         movwf INDF
         incf FSR,F
         movf MIXHMSB,W
         movwf INDF
         BLOCK0

         movlw 2           ; inc average counter by 2 only done after all 3 pairs taken
         addwf AVRGCNT,F
         bcf AVRGCNT,6     ; limit to 64 (32 samples)

         decfsz CLKCNT,F
         goto TOG5
         call LCD1
         bsf RSLINE,4

         btfsc PORTA,4
         goto HIMIX
PROBE0:  movf HIGH1MSB,W
         movwf COUNT1
         movf HIGH1LSB,W
         movwf COUNT0
         goto SHOW0

HIMIX:   movf LOWMSB,W
         movwf COUNT1
         movf LOWLSB,W
         movwf COUNT0

SHOW0:   clrf COUNT2
         call BIN2DEC
         movf DIGIT4,W
         call LCDOUT
         movf DIGIT3,W
         call LCDOUT
         movf DIGIT2,W
         call LCDOUT
         movf DIGIT1,W
         call LCDOUT
         movlw 'B'
         btfsc PORTA,4
         movlw 'H'
         call LCDOUT

         btfsc PORTA,4
         goto LOMIX
PROBE1:  movf HIGH0MSB,W
         movwf COUNT1
         movf HIGH0LSB,W
         movwf COUNT0
         goto SHOW1

LOMIX:   movf HIGHMSB,W
         movwf COUNT1
         movf HIGHLSB,W
         movwf COUNT0

SHOW1:   clrf COUNT2
         call BIN2DEC
         movf DIGIT4,W
         call LCDOUT
         movf DIGIT3,W
         call LCDOUT
         movf DIGIT2,W
         call LCDOUT
         movf DIGIT1,W
         call LCDOUT
         movlw 'A'
         btfsc PORTA,4
         movlw 'L'
         call LCDOUT

         BLOCK1                ; show mix value
         movlw AVERAGE0        ; get average of 32 samples
         movwf FSR             ; and use for further calcs
         BLOCK0
         call GETAVERAGE

         movf DIGIT2,W
         movwf SAVEMSB         ; store mix val MSB
         movwf COUNT1
         movf DIGIT1,W
         movwf SAVELSB         ; store mix val MSB
         movwf COUNT0
         clrf COUNT2
         call BIN2DEC
         movlw ' '
         call LCDOUT
         movf DIGIT4,W
         call LCDOUT
         movf DIGIT3,W
         call LCDOUT
         movf DIGIT2,W
         call LCDOUT
         movf DIGIT1,W
         call LCDOUT
         movlw '#'
         call LCDOUT

TOG5:    comf SQUAREWAVE,F   ; toggle output
         movf SQUAREWAVE,W
         andlw %00000100
         bcf PORTA,2
         iorwf PORTA,F

;         movlw 169       ; 137Hz setting value (for 3.2768 xtal)
         movlw 157       ; 137Hz setting value (for 3.6864 xtal)
         movwf TMR0      ; reset timer
         bcf INTCON,2
         goto INTRPT

;******** LCD ROUTINES **********

LCD1:   movlw %10000000
        goto LCDLIN
LCD13   movlw B'10001100'
        goto LCDLIN
LCD21:  movlw %11000000
        goto LCDLIN
LCD27:  movlw %11001110
        goto LCDLIN
LCD2B:  movlw %11001011

LCDLIN: BCF RSLINE,4

LCDOUT: movwf STORE1    ;temp store value that will be output to LCD
        movlw 60        ;set minimum time between sending full bytes to
        movwf LOOPA     ;LCD - value of 60 seems OK for this prog with
DELAY:  decfsz LOOPA,F  ;XTAL clk of upto 5MHz, possibly 5.5MHz
        goto DELAY
        call SENDIT     ;send MSB, then (by default) send LSB

SENDIT: swapf STORE1,F  ;swap byte nibbles
        movf STORE1,W   ;get nibble (MSB)
        andlw 15        ;AND to isolate nibble
        iorwf RSLINE,W  ;OR the RS bit
        movwf PORTB     ;output the byte
        BSF PORTB,5     ;set E high
        BCF PORTB,5     ;set E low
        return

LCDFRM:         movwf STORE2            ;split & format decimal byte for lcd
                swapf STORE2,W          ;swap byte into w to get tens
                andlw 15                ;and to get nibble
                iorlw 48                ;or with 48 to make ascii value
                call LCDOUT             ;send to lcd
                movf STORE2,W           ;get units
                andlw 15                ;and to get nibble
                iorlw 48                ;or with 48 to make ascii value
                call LCDOUT             ;send to lcd
                return                 

;............

PAUSIT: movlw 20         ;1/5th sec wait set
        movwf CLKCNT
        clrf INTCON     ;clear interupt flag
PAUSE:                  ;initial 1/5th sec wait before setting up LCD
        btfss INTCON,2  ;has a timer time-out been detected?
        goto PAUSE      ;no
        BCF INTCON,2    ;yes
        decfsz CLKCNT,F ;dec loop, is it zero?
        goto PAUSE      ;no
        return          ;yes

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

BIN2DEC: clrf   DIGIT1
        clrf    DIGIT2
        clrf    DIGIT3
        clrf    DIGIT4
        clrf    DIGIT5
        clrf    DIGIT6
        clrf    DIGIT7
        clrf    DIGIT8

        movlw   24              ;24 bits to do
        movwf   BITCNT

BITLP:  rlf     COUNT0,F        ;Shift msb into carry
        rlf     COUNT1,F
        rlf     COUNT2,F

        movlw   DIGIT1
        movwf   FSR             ;Pointer to DIGITs
        movlw   8               ;8 DIGITs to do
        movwf   DIGCNT
ADJLP:  rlf     INDF,F          ;Shift DIGIT 1 bit left
        movlw   10
        subwf   INDF,w          ;Check and adjust for decimal overflow
        skpnc
        movwf   INDF

        incf    FSR,F           ;Next DIGIT
        decfsz  DIGCNT,F
        goto    ADJLP
        decfsz  BITCNT,F        ;Next bit
        goto    BITLP
        movlw 48
        iorwf DIGIT1,F       ; convert to ascii numeral
        iorwf DIGIT2,F
        iorwf DIGIT3,F
        iorwf DIGIT4,F
        iorwf DIGIT5,F
        iorwf DIGIT6,F
        iorwf DIGIT7,F
        iorwf DIGIT8,F

        movf DIGIT8,W       ; blank leading zeros
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT8,4
        movf DIGIT7,W
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT7,4
        movf DIGIT6,W
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT6,4
        movf DIGIT5,W
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT5,4
        movf DIGIT4,W
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT4,4
        movf DIGIT3,W
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT3,4
        movf DIGIT2,W
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT2,4
        movf DIGIT8,W
        andlw 15
        btfss STATUS,Z
        return
        bcf DIGIT8,4
        return

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

CLRLINE1: call LCD1     ;set address for line 1 cell 1
        bsf RSLINE,4    ;set RS for data send
        clrf LOOP       ;
CLRL1:  movlw ' '       ;clear cell
        call LCDOUT     ;
        incf LOOP,F     ;inc loop
        btfss LOOP,4    ;has last LCD letter been sent?
        goto CLRL1      ;no
        return

CLRLINE2: call LCD21
        bsf RSLINE,4
        movlw 16
        movwf LOOP
CL2:    movlw ' '
        call LCDOUT
        decfsz LOOP,F
        goto CL2
        return

;*********

GETAVERAGE: clrf LOOP
        clrf DIGIT1
        clrf DIGIT2
        clrf DIGIT3

GETAV1: BLOCK1
        movf INDF,W
        BLOCK0

        addwf DIGIT1,F
        movf STATUS,W
        andlw 1
        addwf DIGIT2,F
        movf STATUS,W
        andlw 1
        addwf DIGIT3,F

        BLOCK1
        incf FSR,F
        movf INDF,W
        BLOCK0

        addwf DIGIT2,F
        movf STATUS,W
        andlw 1
        addwf DIGIT3,F

        BLOCK1
        incf FSR,F
        BLOCK0

        movlw 2
        addwf LOOP,F
        btfss LOOP,6
        goto GETAV1

        bcf STATUS,C          ; divide by 32
        rrf DIGIT3,F
        rrf DIGIT2,F
        rrf DIGIT1,F
        bcf STATUS,C
        rrf DIGIT3,F
        rrf DIGIT2,F
        rrf DIGIT1,F
        bcf STATUS,C
        rrf DIGIT3,F
        rrf DIGIT2,F
        rrf DIGIT1,F
        bcf STATUS,C
        rrf DIGIT3,F
        rrf DIGIT2,F
        rrf DIGIT1,F
        bcf STATUS,C
        rrf DIGIT3,F
        rrf DIGIT2,F
        rrf DIGIT1,F
        return

;*********

;SERIALMEM01 30MAR02 from LOG430.ASM 29OCT99 - JOHN BECKER - EPE DATA LOGGER MODIFIED EXTRACT

SAVESAMPLE:

WRMSB:  movf MEMHI,W       ; store MSB
        call WRBYTE
        incf WADDRL,F      ; inc address
WRLSB:  movf MEMLO,W       ; store LSB
        call WRBYTE
        decf WADDRL,F      ; return address to prev value
        return

;..............

;CONVERTED MPASM FILE C:\ASMCNV\2WDPOLL.ASM
;       TO TASM  FILE C:\PIC\2WDPOLL.ASM 03-12-1999 19:28:42

          ;***************************************************************
          ;       Byte Write Routine with data polling
          ;***************************************************************

WRBYTE:   movwf DATAO         ;entry with val to send in W, stored to DATAO
          movlw %10100000     ; set slave address and write mode
          MOVWF SLAVE

BYTE:     CALL BSTART         ; generate start bit
          MOVF SLAVE,W        ; move slave address
          MOVWF TXBUF         ; into transmit buffer
          CALL TX             ; and send it

          movf WADDRH,W       ; send address high byte
          MOVWF TXBUF         ; into transmit buffer
          CALL TX             ; and send it

          movf WADDRL,W       ; send address low byte
          MOVWF TXBUF         ; into transmit buffer
          CALL TX             ; and send it

          MOVF DATAO,W        ; move data byte
          MOVWF TXBUF         ; to tranmit buffer
          CALL TX             ; and transmit it
          CALL BSTOP          ; generate stop bit

          MOVLW 40            ; now start polling for a low ack bit
          MOVWF POLLCNT       ; set max number of times to poll
POLL:     CALL BSTART         ; generate start bit
          movlw %10100000     ; set slave address and write mode

          MOVWF TXBUF         ; into transmit buffer
          CALL TX             ; and send it
          BTFSS EEPROM,DI     ; was the ack bit low?
          GOTO EXITPOLL       ; yes, do another byte
          DECFSZ POLLCNT,F    ; is poll counter down to zero?
          GOTO POLL           ; no, poll again.
EXITPOLL: return

          ;**************************************************************
          ;       Start Bit Subroutine - generates a start bit
          ;       (Low going data line while clock is high)
          ;**************************************************************

BSTART:   BSF PORTC,SDATA    ; make sure data is high
          BANK1
          MOVLW %10100111
          MOVWF TRISC         ; set data and clock lines for output
          BANK0
          BCF PORTC,SCLK     ; make sure clock is low
          NOP                 
          BSF PORTC,SCLK     ; set clock high
          NOP                 
          NOP                 
          NOP                 
          NOP                 
          NOP                 
          BCF PORTC,SDATA    ; data line goes low during
                              ; high clock for start bit
          NOP                 
          NOP                 
          NOP                 
          NOP                 
          NOP                 ; timing adjustment
          BCF PORTC,SCLK     ; start clock train
          NOP                 
          NOP                 
          RETLW 0             

          ;************************************************************
          ;       Stop Bit Subroutine - generates a stop bit
          ;       (High going data line while clock is high)
          ;************************************************************

BSTOP:    BANK1
          MOVLW %10100111
          MOVWF TRISC         ; set data/clock lines as outputs
          BANK0
          BCF PORTC,SDATA    ; make sure data line is low
          NOP                 
          NOP                 
          NOP                 
          BSF PORTC,SCLK     ; set clock high
          NOP                 
          NOP                 
          NOP                 
          BSF PORTC,SDATA    ; data goes high while clock high
                              ; for stop bit
          NOP                 
          NOP                 
          BCF PORTC,SCLK     ; set clock low again
          NOP                 
          NOP                 
          NOP                 
          RETLW 0             

            ;*************************************************************
            ;       BITOUT routine takes one bit of data in 'do' and
            ;       transmits it to the serial EE device
            ;*************************************************************

BITOUT:   BANK1
          MOVLW %10100111
          MOVWF TRISC
          BANK0
          BTFSS EEPROM,DO    ; check for state of data bit to xmit
          GOTO BITLOW        ;
          BSF PORTC,SDATA    ; set data line high
          GOTO CLKOUT        ; go toggle the clock

BITLOW:   BCF PORTC,SDATA    ; output a low bit
CLKOUT:   BSF PORTC,SCLK     ; set clock line high
          NOP                 
          NOP                 
          NOP                 
          NOP                 
          BCF PORTC,SCLK     ; return clock line low
          RETLW 0             

          ;**************************************************************
          ;       BITIN routine reads one bit of data from the
          ;       serial EE device and stores it in 'di'
          ;**************************************************************

BITIN:    BSF EEPROM,DI       ; assume input bit is high
          BANK1
          MOVLW %10110111     ; make sdata an input line
          MOVWF TRISC
          BANK0
          BSF PORTC,SDATA    ; set sdata line for input
          BSF PORTC,SCLK     ; set clock line high
          NOP                ; just sit here fractionally
          NOP                 
          NOP                 
          NOP                 
          NOP
          BTFSS PORTC,SDATA  ; read the data bit
          BCF EEPROM,DI      ; input bit was low
          BCF PORTC,SCLK     ; set clock line low
          RETLW 0

          ;****************************************************************
          ;       Transmit Data Subroutine
          ;****************************************************************

TX:       MOVLW 8
          MOVWF COUNT         ; set the #bits to 8
TXLP:     BCF EEPROM,DO       ; assume bit out is low
          BTFSC TXBUF,7       ; is bit out really low?
          BSF EEPROM,DO       ; otherwise data bit =1
          CALL BITOUT         ; serial data out
          RLF TXBUF,F         ; rotate txbuf left
          DECFSZ COUNT,F      ; 8 bits done?
          GOTO TXLP           ; no - go again
          CALL BITIN          ; read ack bit
          RETLW 0             

                             
;CONVERTED MPASM FILE C:\ASMCNV\2WSEQR.ASM
;       TO TASM  FILE C:\PIC\2WSEQR.ASM 03-12-1999 19:29:04

          ;************************************************************
          ;       2-Wire Sequential Read Program
          ;************************************************************
          ;       Stop Bit Subroutine - generates a stop bit
          ;       (High going data line while clock is high)
          ;************************************************************

BSTOP2:   BANK1
          MOVLW %10100111     ;
          MOVWF TRISC         ; set data/clock lines as outputs
          BANK0
          BCF PORTC,SDATA     ; make sure data line is low
          NOP                 
          NOP                 
          NOP                 
          BSF PORTC,SCLK      ; set clock high
          NOP                 
          NOP                 
          NOP                 
          BSF PORTC,SDATA     ; data goes high while clock high
          NOP                 ; for stop bit
          NOP                 
          BCF PORTC,SCLK      ; set clock low again
          NOP                 
          NOP                 
          NOP                 
          RETLW 0             

          ;**************************************************************
          ;       BITIN2 routine reads one bit of data from the
          ;       serial EE device and stores it in 'di'
          ;**************************************************************

BITIN2:   BSF EEPROM,DI       ; assume input bit is high
          BANK1
          MOVLW %10110111     ; make sdata an input line
          MOVWF TRISC
          BANK0
          BSF PORTC,SCLK      ; set clock line high
          NOP                 ; just sit here a sec
          NOP                 
          NOP                 
          NOP                 
          NOP                 ;
          BTFSS PORTC,SDATA  ; read the data bit
          BCF EEPROM,DI       ; input bit was low, set 'di' accordingly
          BCF PORTC,SCLK     ; set clock line low
          RETLW 0             

          ;****************************************************************
          ;       Transmit Data Subroutine
          ;****************************************************************

TX2:      MOVLW 8
          MOVWF COUNT         ; set the #bits to 8
TXLP2:    BCF EEPROM,DO       ; assume bit out is low
          BTFSC TXBUF,7       ; is bit out really low?
          BSF EEPROM,DO       ; no, set it high
          CALL BITOUT         ; send the bit to serial EE
          RLF TXBUF,F         ; rotate txbuf left
          DECFSZ COUNT,F      ; 8 bits done?
          GOTO TXLP2          ; no - go again
          CALL BITIN2         ; read ack bit
          BTFSC EEPROM,DI     ; check ack bit
          NOP
          RETLW 0             

          ;****************************************************************
          ;       Receive data Routine
          ;****************************************************************

RX:       MOVLW 8             ; set # bits to 8
          MOVWF COUNT         
          CLRF DATAI          ; clear input register
          BCF STATUS,0        ; make sure carry bit is low
RXLP:     RLF DATAI,F         ; rotate DATAI 1 bit left
          CALL BITIN2         ; read a bit
          BTFSC EEPROM,DI     
          BSF DATAI,0         ; set bit 0 if necessary
          DECFSZ COUNT,F      ; 8 bits done?
          GOTO RXLP           ; no, do another
          RETLW 0             

          ;**************************************************************
          ;       READ (sequential read routine)
          ;**************************************************************

READ:     MOVLW 2             
          MOVWF BCOUNT        ; set number of bytes to read
          movlw %10100000     ; set slave address and write mode
          MOVWF SLAVE         

          CALL BSTART         ; generate start bit
          MOVF SLAVE,W        ; get slave address
          MOVWF TXBUF         ; into transmit buffer
          CALL TX2            ; and send it

          movf RADDRH,W       ; send address high byte
          MOVWF TXBUF         ; into transmit buffer
          CALL TX2            ; and send it

          MOVF RADDRL,W       ; get word address
          MOVWF TXBUF         ; into transmit buffer
          CALL TX2            ; and send it

  &

Serhado

Selam Arkadasim,
Oncelikle pic programlama yaparken hangi programi kullaniyorsun?
Muhtemelen MPLAB programidir diye tahmin ediyorum, egerki MPLAB  programi ise kendi asm dosyani actikdan sonra Yukaridaki PROJE buttonundan Quickbuild'e  basarsan dosyan HEX' olmus olur,
iyi calismalar..

Kabil ATICI

Derleyici sürümleri arasında fark varsa kodlama düzeninin değiştirilmesi gerekir.
İlk başta işlemci adı gibi...(#include gibi)
Örneğin .EQU yeri EQU gibi değişiklikler yapılması gerekir.
ambar7