DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   Assembly (http://www.daniweb.com/forums/forum125.html)
-   -   Please help with the assembly code (http://www.daniweb.com/forums/thread46909.html)

perpetual_dream Jun 2nd, 2006 4:05 am
Please help with the assembly code
 
Hey,
I am willing to use the following code in one phase of my project. The problem is that i dont understand this assembly language, In school I took it in different form...
Mov ax, bx
out 11, AL bla bla...
here the registers is different and everything is different....
All I need is to know what are the input and output pins...
say port A0-A3 INPUT
PORT B0-B7 OUTPUT
bc i really dont know the input and output ports in the code...
the code is to be used on pic16f628 here is the microcontroller datasheet in case u need it
http://ww1.microchip.com/downloads/e...Doc/40300C.pdf
and here is the code:

;Tutorial 7_5
;Serial routines - display received bytes on LED's
;Nigel Goodwin 2003

        LIST        p=16F628                ;tell assembler what chip we are using
        include "P16F628.inc"                ;include the defaults for the chip
        ERRORLEVEL        0,        -302        ;suppress bank selection messages
                        ;sets the configuration settings (oscillator type etc.)




                cblock        0x20                        ;start of general purpose registers
                        count                        ;used in looping routines
                        count1                        ;used in delay routine
                        counta                        ;used in delay routine
                        countb                        ;used in delay routine
                        Xmit_Byte                ;holds byte to xmit
                            Rcv_Byte                ;holds received byte
                            Bit_Cntr                ;bit counter for RS232
                            Delay_Count                ;delay loop counter
                endc

SER_PORT        Equ        PORTA
SER_TRIS        Equ        TRISA
SER_IN                Equ        0x07
SER_OUT        Equ        0x06
LED_PORT        Equ        PORTB
LED_TRIS        Equ        TRISB

                org        0x0000

Start                movlw        0x07
                movwf        CMCON                      ;turn comparators off (make it like a 16F84)

Initialise        clrf        count
                clrf        PORTA
                clrf        PORTB
                BSF    STATUS, RP0          ;select bank 1       
                clrf        LED_TRIS              ;make LED_Port all outputs
                BCF    STATUS, RP0          ;select bank 0
                call        SER_INIT              ;initialise serial port
Loop                call        Rcv_RS232
                movwf        LED_PORT              ;transfer byte to LED's
                call        XMIT_RS232              ;echo character back
                goto        Loop


;Serial routines

SER_INIT
            BSF    STATUS, RP0          ;select bank 1
            BCF    SER_TRIS, SER_OUT    ;set B6 as an output
            BSF    SER_TRIS, SER_IN      ;set B7 as an input
            BCF    STATUS, RP0          ;select bank 0
            BSF    SER_PORT, SER_OUT    ;set SER_OUT high
            RETURN

XMIT_RS232  MOVWF  Xmit_Byte            ;move W to Xmit_Byte
            MOVLW  0x08                  ;set 8 bits out
            MOVWF  Bit_Cntr
            BCF    SER_PORT, SER_OUT
            CALL    Bit_Delay
Ser_Loop    RRF    Xmit_Byte , f        ;send one bit
            BTFSS  STATUS    , C
            BCF    SER_PORT, SER_OUT
            BTFSC  STATUS    , C
            BSF    SER_PORT, SER_OUT
            CALL    Bit_Delay
            DECFSZ  Bit_Cntr  , f        ;test if all done
            GOTO    Ser_Loop
            BSF    SER_PORT, SER_OUT
            CALL    Bit_Delay
            RETURN

Rcv_RS232  BTFSC  SER_PORT, SER_IN      ;wait for start bit
            GOTO    Rcv_RS232
            CALL    Start_Delay                  ;do half bit time delay
            BTFSC  SER_PORT, SER_IN      ;check still in start bit
            GOTO    Rcv_RS232
            MOVLW  0x08                  ;set up to read 8 bits
            MOVWF  Bit_Cntr
            CLRF    Rcv_Byte
Next_RcvBit CALL    Bit_Delay
            BTFSS  SER_PORT, SER_IN
            BCF    STATUS    , C
            BTFSC  SER_PORT, SER_IN
            BSF    STATUS    , C
            RRF    Rcv_Byte  , f
            DECFSZ  Bit_Cntr  , f        ;test if all done
            GOTO    Next_RcvBit
            CALL    Bit_Delay
            MOVF    Rcv_Byte, W
            RETURN

Start_Delay MOVLW  0x0C
            MOVWF  Delay_Count
Start_Wait  NOP
            DECFSZ  Delay_Count , f
            GOTO    Start_Wait
            RETURN

Bit_Delay  MOVLW  0x18
            MOVWF  Delay_Count
Bit_Wait    NOP
            DECFSZ  Delay_Count , f
            GOTO    Bit_Wait
            RETURN


;Delay routines

Long_Delay
                call        Delay255
                call        Delay255
                call        Delay255
                call        Delay255
                return

Delay255        movlw        0xff                ;delay 255 mS
                goto        d0
Delay100        movlw        d'100'                ;delay 100mS
                goto        d0
Delay50                movlw        d'50'                ;delay 50mS
                goto        d0
Delay20                movlw        d'20'                ;delay 20mS
                goto        d0
Delay10                movlw        d'10'                ;delay 10mS
                goto        d0
Delay1                movlw        d'1'                ;delay 1mS
                goto        d0
Delay5                movlw        0x05                ;delay 5.000 ms (4 MHz clock)
d0                movwf        count1
d1                movlw        0xC7
                movwf        counta
                movlw        0x01
                movwf        countb
Delay_0                decfsz        counta, f
                goto        $+2
                decfsz        countb, f
                goto        Delay_0

                decfsz        count1        ,f
                goto        d1
                retlw        0x00

;end of Delay routines


                end

thnx a lot in advance

Lord Soth Aug 9th, 2006 7:07 am
Re: Please help with the assembly code
 
Hi,

I suggest you to download the main PIC 16F84A manual. (or the one related to your PIC) There you will see a list of registers and opcodes. Actually for PIC registers is like memory (there are a lot of theme) and the only register is working register which is W. For example you can't move a value to a register directly you have to load it to working register first : movlw .01010101; movwf TRISA
The TRIS_ registers adjust wether the pins of the related port (TRISA -> PORTA) are to be used for input or output. (not both are possible for all port/pins) There also are two memory (register) banks you have to set

BSF STATUS, RP0 ; bit set status register bit RP0 to select bank 1
clrf TRISA ;make PORTA all pins outputs
BCF STATUS, RP0 ;select back bank 0

PORTA,PORTB,... are on bank 0 and TRISA, TRISB, ... are on bank 1 (check register map on the reference)

clrf PORTA; clear all bits/pins of PORTA

Those are the basics, post if you need any more knowledge.

Loren Soth


All times are GMT -4. The time now is 12:02 am.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC