Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: overlok - 20 Temmuz 2015, 21:03:49

Başlık: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: overlok - 20 Temmuz 2015, 21:03:49
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
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: 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.
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: overlok - 20 Temmuz 2015, 21:33:44
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ı.
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: kutahyaspor - 20 Temmuz 2015, 22:00:53
ne kadar da çok benziyor :)

http://www.microchip.com/forums/m276907.aspx
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: overlok - 20 Temmuz 2015, 22:24:48
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ı :-)
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: kutahyaspor - 20 Temmuz 2015, 23:23:02
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 :)
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: overlok - 20 Temmuz 2015, 23:51:17
:-) 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.
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: RaMu - 21 Temmuz 2015, 00:37:42
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.

(https://lh3.googleusercontent.com/-FDjWz-oQ3qs/Va1ptWZcKeI/AAAAAAAABuU/OBpGlSSIbeA/w717-h589-no/picmemory.png)

Daha diğer banklardaki general purpose register ların kullanımı var...
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: overlok - 24 Temmuz 2015, 14:54:25
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?
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: RaMu - 24 Temmuz 2015, 15:34:53
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.
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: overlok - 24 Temmuz 2015, 16:31:53
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.
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: RaMu - 24 Temmuz 2015, 16:41:29
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.
Başlık: Ynt: 16F84A 'dan 16F628A'a ya kod çevrimine yardım
Gönderen: overlok - 24 Temmuz 2015, 17:11:49
Farketmemişim son yazdığınızı. Tamamdır hocam son dediğiniz gibi değiştirdim. Tekrar teşekkür ederim.