16F84A 'dan 16F628A'a ya kod çevrimine yardım

Başlatan overlok, 20 Temmuz 2015, 21:03:49

overlok

Selamlar arkadaşlar, F84A için yazılmış kodu F628A'ya uyarlamak istiyorum. Netten araştırdım, konfigurasyon ayarlarını deniyorum, değiştirdiğim kod yine F84A da çalışıyor ama F628A da çalışmıyor. Devre hiç çalışmıyor. (Gerçekte denemedim, proteus da denedim.) Yardımcı olabilir misiniz?

Orjinal kod:
LIST            P=16F84 ; no need to change this for the 16C84
	ERRORLEVEL      -302    ; suppress bank selection messages
	__CONFIG        3FF9H   ; XT oscillator (and PWRTE if 16C84)

#DEFINE _4_00MHZ            ; clock speed


PCL     EQU     2               ; registers are defined here to make this
STATUS  EQU     3               ; program self contained.
PORTA   EQU     5
PORTB   EQU     6
INTCON  EQU     0BH
TRISA   EQU     85H
TRISB   EQU     86H
OPTREG  EQU     81H

C       EQU     0               ; bits in STATUS
Z       EQU     2
RP0     EQU     5

T0IF    EQU     2               ; bit in INTCON


#IFDEF  _4_00MHZ                ; number of ticks per second for 4 MHz:
TCK0    EQU     .122			; nominal
TCK1    EQU     .123			; every 10 secs
TCK2    EQU     .121			; every min
TCK3    EQU     .123			; every 10 mins
TCK4    EQU     .124			; every hour
TCK5    EQU     .125			; every 10 hours
TCK6    EQU     .125			; every 24 hours
#ENDIF

	CBLOCK  0CH             ; define variables required

	TICKS                   ; decremented every tick (9.15 ms or 8.19 ms)
	SEGS                    ; one bit per segment: "-gfedcba"
	SEC
	SEC10
	MIN
	MIN10
	HOUR
	HOUR10
	FRAME                   ; used to decide when to display time
	HHMM                    ; one bit per digit displayed
	COUNT                   ; scratch register
	DIGIT                   ; last digit displayed

	ENDC


	;*********************************;
	;         Initialisation          ;
	;*********************************;

	ORG     0

INIT    CLRF    SEC
	CLRF    SEC10
	CLRF    MIN
	CLRF    MIN10
	movlw	D'2'		; 12:00 initialized here!
	movwf	HOUR
	movlw	D'1'
	movwf	HOUR10
	CLRF    FRAME
	CLRF    PORTA
	CLRF    PORTB
	BSF     STATUS,RP0      ; select register bank 1
	CLRF    TRISA
	MOVLW   80H
	MOVWF   TRISB           ; only RB7 is an input
	MOVLW   4
	MOVWF   OPTREG          ; assign prescaler (1:32) to TMR0
	BCF     STATUS,RP0      ; reselect bank 0

	BTFSS   PORTB,7         ; switch open?
	GOTO    TEST         	; no, go to test mode



	;*********************************;
	;          Main Program           ;
	;*********************************;

MAIN    CALL    CLOCK           ; real-time clock algo called every second
	CALL    SHOW            ; display the time
WAIT    BTFSS   INTCON,T0IF     ; wait for TMR0 to roll over
	 GOTO    WAIT
	CLRF    INTCON
	CALL    CHKSW           ; check for button press
	MOVF	TICKS,W
	XORLW	D'20'		; Check for 20 ticks
	BTFSS	STATUS,Z
	GOTO	J1
	MOVLW   30              ; Turn off Display at 100/120 ticks
	MOVWF   PORTB
	MOVLW   1F
	MOVWF   PORTA
J1	DECFSZ  TICKS,F
	GOTO    WAIT
	GOTO    MAIN            ; get here every second


	;*********************************;
	;  Convert digit to segment form  ;
	;*********************************;

SEGTAB  ANDLW   0FH 
	ADDWF   PCL,F
	DT      40,79,24,30,19,12,02,78,00,10
	DT      0F,0F,0F,0F,0F,0F


	;*********************************;
	;  Real-time clock algorithm      ;
	;*********************************;

CLOCK   MOVLW   TCK0            ; increment digits as appropriate
	MOVWF   TICKS           ; and define number of ticks per
	INCF    SEC,F           ; second for next second
	MOVF    SEC,W
	SUBLW   9
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK1
	MOVWF   TICKS
	CLRF    SEC
	INCF    SEC10,F
	MOVF    SEC10,W
	SUBLW   5
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK2
	MOVWF   TICKS
	CLRF    SEC10
	INCF    MIN,F
	MOVF    MIN,W
	SUBLW   9
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK3
	MOVWF   TICKS
	CLRF    MIN
	INCF    MIN10,F
	MOVF    MIN10,W
	SUBLW   5
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK4
	MOVWF   TICKS
	CLRF    MIN10
	MOVF    HOUR10,W
	SUBLW   1
	BTFSC   STATUS,C
	 GOTO   INCHR
	INCF    HOUR,F
	MOVF    HOUR,W
	SUBLW   3
	BTFSC   STATUS,C
	  RETURN

	MOVLW   TCK6
	MOVWF   TICKS
	CLRF    HOUR
	CLRF    HOUR10
	RETURN

INCHR   INCF    HOUR,F
	MOVF    HOUR,W
	SUBLW   9
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK5
	MOVWF   TICKS
	CLRF    HOUR
	INCF    HOUR10,F
	RETURN



	;*********************************;
	; Displays the time digit by digit;
	;*********************************;

SHOW    CLRF    HHMM            
	INCF    FRAME,F         ; increment place in frame
	MOVF    FRAME,W
	SUBLW   D'08'		; Display cycle time
	BTFSS   STATUS,C
	 CLRF    FRAME
	MOVF    FRAME,W
	XORLW   1               
	BTFSC   STATUS,Z
	 GOTO    DHOUR10        ; display 10s of hours when frame is 1
	XORLW   1^2
	BTFSC   STATUS,Z
	 GOTO    DHOUR          ; display hour when frame is 2
	XORLW   2^3
	BTFSC   STATUS,Z
	 GOTO    DMIN10         ; display 10s of mins when frame is 3
	XORLW   3^4
	BTFSC   STATUS,Z
	 GOTO    DMIN           ; display mins when frame is 4 
	MOVLW   30              ; otherwise blank display
	MOVWF   PORTB
	MOVLW   1F
	MOVWF   PORTA
	RETURN

DHOUR10 BSF     HHMM,3
	MOVF    HOUR10,W
	BTFSS	STATUS,Z	; check for leading zero
	GOTO    DISPLAY
	RETURN			; skip display of leading zero        

DHOUR   BSF     HHMM,2
	MOVF    HOUR,W
	GOTO    DISPLAY

DMIN10  BSF     HHMM,1
	MOVF    MIN10,W
	GOTO    DISPLAY

DMIN    BSF     HHMM,0
	MOVF    MIN,W           ; falls through to DISPLAY

	
	;*********************************;
	;       Displays digit in W       ;
	;*********************************;

DISPLAY MOVWF   DIGIT           ; save number to be displayed in DIGIT
	CALL    SEGTAB          ; convert to segment form
	MOVWF   SEGS            ; and store
	ANDLW   1FH             ; extract PORTA segments
	MOVWF   PORTA           ; and display
	RRF     SEGS,W
	ANDLW   30H             ; extract PORTB segments
	IORWF   HHMM,W
	MOVWF   PORTB           ; and display
	RETURN


	;*********************************;
	; Checks for a switch press and   ;
	; updates digit if displayed      ;
	;*********************************;

CHKSW   BTFSC   PORTB,7         ; switch closed?
	 RETURN                 ; no
	MOVF    HHMM,F
	BTFSC   STATUS,Z        ; digit displayed?
	 RETURN                 ; no

INCDIG  INCF    DIGIT,F         ; DIGIT is the currently displayed number
	MOVF    DIGIT,W
	SUBLW   9
	BTFSS   STATUS,C
	 CLRF    DIGIT		; If DIGIT incremented over 9
	MOVF    DIGIT,W
	CALL    DISPLAY
	CALL    DELAY           ; wait for switch to settle
CHKSW0  BTFSS   PORTB,7         ; switch open?
	 GOTO    CHKSW0         ; no
	CALL    DELAY
	BTFSS   PORTB,7         ; still open?
	 GOTO    CHKSW0         ; no
	MOVLW   D'20'
	MOVWF   COUNT
CHKSW1  BTFSS   PORTB,7         ; switch open?
	 GOTO    INCDIG         ; no
	CALL    DELAY
	DECFSZ  COUNT,F
	 GOTO    CHKSW1
	MOVF    DIGIT,W         ; switch was open for around 2 secs
	CLRF    FRAME  
	CLRF    SEC10
	CLRF    SEC
	BTFSC   HHMM,3          ; update correct digit
	 MOVWF  HOUR10
	BTFSC   HHMM,2
	 MOVWF  HOUR
	BTFSC   HHMM,1
	 MOVWF  MIN10
	BTFSC   HHMM,0
	 MOVWF   MIN
	GOTO    MAIN            ; restart the program


	;*********************************;
	; Delay used by switch routine    ;
	;*********************************;

DELAY   MOVLW   D'12'           ; roughly 100ms delay
	MOVWF   TICKS
DEL1    BTFSS   INTCON,T0IF     ; wait for TMR0 to roll over
	 GOTO    DEL1
	CLRF    INTCON
	DECFSZ  TICKS,F
	 GOTO    DEL1
	RETURN

TEST		CLRF	COUNT		; exercise Numitron by cycling through
		MOVF	COUNT,W		; all numbers
		CALL	DISPLAY
		CALL	DELAY
		CALL	DELAY		; 1 second delay
		INCF	COUNT,F
		MOVF	COUNT,W
		XORLW   D'10'		; Test for 10             
		BTFSS   STATUS,Z
		GOTO    TEST+1
		GOTO	TEST   		; Reset COUNT to 0 
		END


Benim değişiklik yaptığım:

LIST            P=16F628A
	include "P16F628A.INC"
	ERRORLEVEL      -302    
	__CONFIG        _CP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF

#DEFINE _4_00MHZ            ; clock speed


PCL     EQU     2               ; registers are defined here to make this
STATUS  EQU     3               ; program self contained.
PORTA   EQU     5
PORTB   EQU     6
INTCON  EQU     0BH
TRISA   EQU     85H
TRISB   EQU     86H
OPTREG  EQU     81H

C       EQU     0               ; bits in STATUS
Z       EQU     2
RP0     EQU     5

T0IF    EQU     2               ; bit in INTCON


#IFDEF  _4_00MHZ                ; number of ticks per second for 4 MHz:
TCK0    EQU     .122			; nominal
TCK1    EQU     .123			; every 10 secs
TCK2    EQU     .121			; every min
TCK3    EQU     .123			; every 10 mins
TCK4    EQU     .124			; every hour
TCK5    EQU     .125			; every 10 hours
TCK6    EQU     .125			; every 24 hours
#ENDIF

	CBLOCK  0CH             ; define variables required

	TICKS                   ; decremented every tick (9.15 ms or 8.19 ms)
	SEGS                    ; one bit per segment: "-gfedcba"
	SEC
	SEC10
	MIN
	MIN10
	HOUR
	HOUR10
	FRAME                   ; used to decide when to display time
	HHMM                    ; one bit per digit displayed
	COUNT                   ; scratch register
	DIGIT                   ; last digit displayed

	ENDC


	;*********************************;
	;         Initialisation          ;
	;*********************************;

	ORG     0
	MOVLW 0x07
	MOVWF CMCON

INIT    CLRF    SEC
	CLRF    SEC10
	CLRF    MIN
	CLRF    MIN10
	movlw	D'2'		; 12:00 initialized here!
	movwf	HOUR
	movlw	D'1'
	movwf	HOUR10
	CLRF    FRAME
	CLRF    PORTA
	CLRF    PORTB
	BSF     STATUS,RP0      ; select register bank 1
	CLRF    TRISA
	MOVLW   80H
	MOVWF   TRISB           ; only RB7 is an input
	MOVLW   4
	MOVWF   OPTREG          ; assign prescaler (1:32) to TMR0
	BCF     STATUS,RP0      ; reselect bank 0

	BTFSS   PORTB,7         ; switch open?
	GOTO    TEST         	; no, go to test mode



	;*********************************;
	;          Main Program           ;
	;*********************************;

MAIN    CALL    CLOCK           ; real-time clock algo called every second
	CALL    SHOW            ; display the time
WAIT    BTFSS   INTCON,T0IF     ; wait for TMR0 to roll over
	 GOTO    WAIT
	CLRF    INTCON
	CALL    CHKSW           ; check for button press
	MOVF	TICKS,W
	XORLW	D'20'		; Check for 20 ticks
	BTFSS	STATUS,Z
	GOTO	J1
	MOVLW   00              ; Turn off Display at 100/120 ticks
	MOVWF   PORTB
	MOVLW   00
	MOVWF   PORTA
J1	DECFSZ  TICKS,F
	GOTO    WAIT
	GOTO    MAIN            ; get here every second


	;*********************************;
	;  Convert digit to segment form  ;
	;*********************************;

SEGTAB  ANDLW   0FH 
	ADDWF   PCL,F
	DT      0x6F,0x06,0xAB,0x8F,0xC6,0xCD,0xED,0x07,0xEF,0xCF
	DT      7F,7F,7F,7F,7F,7F


	;*********************************;
	;  Real-time clock algorithm      ;
	;*********************************;

CLOCK   MOVLW   TCK0            ; increment digits as appropriate
	MOVWF   TICKS           ; and define number of ticks per
	INCF    SEC,F           ; second for next second
	MOVF    SEC,W
	SUBLW   9
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK1
	MOVWF   TICKS
	CLRF    SEC
	INCF    SEC10,F
	MOVF    SEC10,W
	SUBLW   5
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK2
	MOVWF   TICKS
	CLRF    SEC10
	INCF    MIN,F
	MOVF    MIN,W
	SUBLW   9
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK3
	MOVWF   TICKS
	CLRF    MIN
	INCF    MIN10,F
	MOVF    MIN10,W
	SUBLW   5
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK4
	MOVWF   TICKS
	CLRF    MIN10
	MOVF    HOUR10,W
	SUBLW   1
	BTFSC   STATUS,C
	 GOTO   INCHR
	INCF    HOUR,F
	MOVF    HOUR,W
	SUBLW   3
	BTFSC   STATUS,C
	  RETURN

	MOVLW   TCK6
	MOVWF   TICKS
	CLRF    HOUR
	CLRF    HOUR10
	RETURN

INCHR   INCF    HOUR,F
	MOVF    HOUR,W
	SUBLW   9
	BTFSC   STATUS,C
	 RETURN

	MOVLW   TCK5
	MOVWF   TICKS
	CLRF    HOUR
	INCF    HOUR10,F
	RETURN



	;*********************************;
	; Displays the time digit by digit;
	;*********************************;

SHOW    CLRF    HHMM            
	INCF    FRAME,F         ; increment place in frame
	MOVF    FRAME,W
	SUBLW   D'04'		; Display cycle time
	BTFSS   STATUS,C
	 CLRF    FRAME
	MOVF    FRAME,W
	XORLW   1               
	BTFSC   STATUS,Z
	 GOTO    DHOUR10        ; display 10s of hours when frame is 1
	XORLW   1^2
	BTFSC   STATUS,Z
	 GOTO    DHOUR          ; display hour when frame is 2
	XORLW   2^3
	BTFSC   STATUS,Z
	 GOTO    DMIN10         ; display 10s of mins when frame is 3
	XORLW   3^4
	BTFSC   STATUS,Z
	 GOTO    DMIN           ; display mins when frame is 4 
	MOVLW   00              ; otherwise blank display
	MOVWF   PORTB
	MOVLW   00
	MOVWF   PORTA
	RETURN

DHOUR10 BSF     HHMM,3
	MOVF    HOUR10,W
	BTFSS	STATUS,Z	; check for leading zero
	GOTO    DISPLAY
	RETURN			; skip display of leading zero        

DHOUR   BSF     HHMM,2
	MOVF    HOUR,W
	GOTO    DISPLAY

DMIN10  BSF     HHMM,1
	MOVF    MIN10,W
	GOTO    DISPLAY

DMIN    BSF     HHMM,0
	MOVF    MIN,W           ; falls through to DISPLAY

	
	;*********************************;
	;       Displays digit in W       ;
	;*********************************;

DISPLAY MOVWF   DIGIT           ; save number to be displayed in DIGIT
	CALL    SEGTAB          ; convert to segment form
	MOVWF   SEGS            ; and store
	ANDLW   0FH             ; extract PORTA segments
	MOVWF   PORTA           ; and display
	RRF     SEGS,W
	ANDLW   70H             ; extract PORTB segments
	IORWF   HHMM,W
	MOVWF   PORTB           ; and display
	RETURN


	;*********************************;
	; Checks for a switch press and   ;
	; updates digit if displayed      ;
	;*********************************;

CHKSW   BTFSC   PORTB,7         ; switch closed?
	 RETURN                 ; no
	MOVF    HHMM,F
	BTFSC   STATUS,Z        ; digit displayed?
	 RETURN                 ; no

INCDIG  INCF    DIGIT,F         ; DIGIT is the currently displayed number
	MOVF    DIGIT,W
	SUBLW   9
	BTFSS   STATUS,C
	 CLRF    DIGIT		; If DIGIT incremented over 9
	MOVF    DIGIT,W
	CALL    DISPLAY
	CALL    DELAY           ; wait for switch to settle
CHKSW0  BTFSS   PORTB,7         ; switch open?
	 GOTO    CHKSW0         ; no
	CALL    DELAY
	BTFSS   PORTB,7         ; still open?
	 GOTO    CHKSW0         ; no
	MOVLW   D'20'
	MOVWF   COUNT
CHKSW1  BTFSS   PORTB,7         ; switch open?
	 GOTO    INCDIG         ; no
	CALL    DELAY
	DECFSZ  COUNT,F
	 GOTO    CHKSW1
	MOVF    DIGIT,W         ; switch was open for around 2 secs
	CLRF    FRAME  
	CLRF    SEC10
	CLRF    SEC
	BTFSC   HHMM,3          ; update correct digit
	 MOVWF  HOUR10
	BTFSC   HHMM,2
	 MOVWF  HOUR
	BTFSC   HHMM,1
	 MOVWF  MIN10
	BTFSC   HHMM,0
	 MOVWF   MIN
	GOTO    MAIN            ; restart the program


	;*********************************;
	; Delay used by switch routine    ;
	;*********************************;

DELAY   MOVLW   D'12'           ; roughly 100ms delay
	MOVWF   TICKS
DEL1    BTFSS   INTCON,T0IF     ; wait for TMR0 to roll over
	 GOTO    DEL1
	CLRF    INTCON
	DECFSZ  TICKS,F
	 GOTO    DEL1
	RETURN

TEST		CLRF	COUNT		; exercise Numitron by cycling through
		MOVF	COUNT,W		; all numbers
		CALL	DISPLAY
		CALL	DELAY
		CALL	DELAY		; 1 second delay
		INCF	COUNT,F
		MOVF	COUNT,W
		XORLW   D'10'		; Test for 10             
		BTFSS   STATUS,Z
		GOTO    TEST+1
		GOTO	TEST   		; Reset COUNT to 0 
		END
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

t2

#1
Proteusta bu piclerde mclre off yapılınca sorun çıkıyordu diye hatırlıyorum.

Sigorta ayarını   _MCLRE_ON yaparak derleyelim.  MCLR ucunu proteusta VDDye bağlayalım  belki çalışır.

overlok

Alıntı yapılan: t2 - 20 Temmuz 2015, 21:17:56
Proteusta bu piclerde mclre off yapılınca sorun çıkıyordu diye hatırlıyorum.

Sigorta ayarını   _MCLRE_ON yaparak derleyelim.  MCLR ucunu proteusta VDDye bağlayalım  belki çalışır.
Yok ustam şimdi denedim olmadı.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

kutahyaspor

ne kadar da çok benziyor :)

http://www.microchip.com/forums/m276907.aspx

overlok

Alıntı yapılan: kutahyaspor - 20 Temmuz 2015, 22:00:53
ne kadar da çok benziyor :)

http://www.microchip.com/forums/m276907.aspx



Evet hocam ya çok şükür sayende çözdüm. Zaten birkaç değişikliği de ordan bakarak yapmıştım. Benzer devre bide.
"CBLOCK 0CH" satırını 020H yaptım, çalıştı :-)
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

kutahyaspor

görmüşsündür forumda mantığı da anlatılmış.
Alıntı YapDo you understand what was happening now?

In the 16F84, locations 0x0c through 0x1f are in the RAM space and can be used for storing the variables. In the 16F628, though, those addresses are in the top of the SFR address range. Trying to use them as if they were RAM locations will cause some strange and unpredictable results.
Alıntı YapYes. The variables were being placed on top of registers that are used by the chip to do other things and that was causing the erratic behavior. By moving the starting point for the GPR to 20H and starting the variable definition from there everything went back to normal.

Great learning experience and a lot more respect for Assembler.Smile


bu arada mevzuya hakim olduğumdan değil, sadece google :)

overlok

:-) devre proteusda çalışırken, altta error mesajları coşunca anladım bende. Baktım ram ile ilgili hatalar veriyo, o forumdaki yorumları tekrar okudum. Ram den bahsedince çözdüm.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

RaMu

cblock ile asm de
ram de kullanacağımız değişkenleri tanımlıyoruz
diye düşünebilirsiniz.
Daha doğrusu cblock ile
picin ram bölgesinin adreslerine
sırası ile yazdığımız takma isimler eşleştirilir
bu sadece biz program yazarken kolay anlayalım diye yapılan bir şey.
C de
unsigned int8 degisken_ismi

yapmışız gibide düşünülebilir.

cblock ibaresinin karşısına yazılan adres (0xKL)ne ise
derleyici tarafından o adresden başlanarak
sırası ile yazılan tüm ifadelere  o adresler eşitlenir,
aslında asm de bunu
    TICKS    equ  20h               ; decremented every tick (9.15 ms or 8.19 ms)
    SEGS     equ  21h              ; one bit per segment: "-gfedcba"
    SEC        equ  22h
    SEC10    equ  23h
.
.
.

gibi yapıyoruz.

Aşağıdaki fotoda görüldüğü gibi
16F84A nın programcı tarafından kullanılabilecek
genel kullanım registerları 0x0C den başlıyor
ama
16F628A nın 0x20 den başlıyor.

16F628A da kullanıcı ram değişkenlerini 0x0C den başlatmaya kalkarsak
TMR1L , TMR1H, T1CON gibi registerları kullanıyor oluruz
bunlarda doğal olarak hataya sebep olur.



Daha diğer banklardaki general purpose register ların kullanımı var...
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

overlok

#8
Bu devrede B portunun ilk 4 pinine bağlı ledler var, Gnd ye bağlanmış. Ledleri nasıl ters çevirip VDD ye bağlayabilirim? Bu pinleri high değilde low nasıl yapabilirim?
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

RaMu

#9
B7,B6,B5,B4.B3,B2,B1,B0
dediğine göre  B3,B2,B1,B0 e ledler bağlı,
GND ye bağlı ise, pine 1 verildiğinde led yanar,
ama sen ters çevirip Vdd ye bağlayacaksın
artık pine 0 yani tersini verdiğinde yanar,
yani programda ledlerin bağlı olduğu pinlerin tersini alman lazım.

Programda PORTB ye değer yüklenen her yerde şu eki yapabilirsin:
misal orjinali şöyle ise;
    ANDLW   30H             ; extract PORTB segments
    IORWF   HHMM,W
    MOVWF   PORTB           ; and display

Her MOVWF   PORTB den sonra portb alt 4 bitini tersleyebilirsin;
    ANDLW   30H             ; extract PORTB segments
    IORWF   HHMM,W
    MOVWF   PORTB           ; and display
MOVLW  0FH               ;0 ile xor lanan bitler aynı kalır, 1 ile xor lanan bitler terslenir (1 ise 0, 0 ise 1 olur)
XORWF PORTB,F

PORTB ye değer yüklemenin hemen ardından terslendiği için bunu insan algılayamaz,
yinede iyi bir yöntem değil tabiki.


Alternatif olarak:
bir değişken tanımlanır ve bu değişkene hiçbir zaman değiştirmemek üzere  0Fh değeri yüklenir
misal alt_tersler equ xxh veya CBLOCK içinde tanımlanır,
programın başında
MOVLW 0Fh;
MOVWF alt_tersler;
dersin.

Sonra portb ye değer yüklenen her komuttan önce
yukarıdaki örnek için düşünürsek
    ANDLW   30H             ; extract PORTB segments
    IORWF   HHMM,W

XORWF    alt_tersler,W     ;W nin içindeki değerin alt 4 bitini tersler.
    MOVWF   PORTB           ; and display



veya hiç değişken kullanmadan
yine aynı kısım için:
    ANDLW   30H             ; extract PORTB segments
    IORWF   HHMM,W

XORLW   0Fh           ;w nin içindeki değerin alt 4 bitini tersler w ye yazar
    MOVWF   PORTB           ; and display


mesaj birleştirme:: 24 Temmuz 2015, 15:35:42

PORTB ye BSF BCF xor and vs. gibi komutlar uygulanıyorsa onlarada bakmak lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

overlok

Alıntı yapılan: RaMu - 24 Temmuz 2015, 15:34:53

Programda PORTB ye değer yüklenen her yerde şu eki yapabilirsin:
misal orjinali şöyle ise;
    ANDLW   30H             ; extract PORTB segments
    IORWF   HHMM,W
    MOVWF   PORTB           ; and display

Her MOVWF   PORTB den sonra portb alt 4 bitini tersleyebilirsin;
    ANDLW   30H             ; extract PORTB segments
    IORWF   HHMM,W
    MOVWF   PORTB           ; and display
MOVLW  0FH               ;0 ile xor lanan bitler aynı kalır, 1 ile xor lanan bitler terslenir (1 ise 0, 0 ise 1 olur)
XORWF PORTB,F

PORTB ye değer yüklemenin hemen ardından terslendiği için bunu insan algılayamaz,
yinede iyi bir yöntem değil tabiki.


Hocam çok teşekkür ederim, bu önerinizi denedim proteusta sorunsuz çalışıyor.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

RaMu

#11
En iyisini en sona saklamıştım,
diğerlerini örnek olsun diye yazdım.
Sondakini kullanman daha iyi olur.
    ANDLW   30H             ; extract PORTB segments
    IORWF   HHMM,W

XORLW   0Fh           ;w nin içindeki değerin alt 4 bitini tersler w ye yazar
    MOVWF   PORTB           ; and display


mesaj birleştirme:: 24 Temmuz 2015, 16:42:42

Ayrıca xor kapısı (exclusive or) nasıl çalışır bakabilirsin,
komutun mantığı oradan geliyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

overlok

Farketmemişim son yazdığınızı. Tamamdır hocam son dediğiniz gibi değiştirdim. Tekrar teşekkür ederim.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!