ASM. PIC18. CONFIG och BANK-frågor

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

ASM. PIC18. CONFIG och BANK-frågor

Inlägg av JimmyAndersson »

I MPLAB's UserGuide och i massor med koder på nätet står det att man ska skriva config-delen såhär:

Kod: Markera allt

__CONFIG	_WDT_OFF
Men då tycker MPLAB IDE att:
Error[113] C:\WINDOWS\SKRIVBORD\PIC\ASM\PIC18LF1320\TEST1\TEST1.ASM 3 : Symbol not previously defined (_WDT_OFF)
Warning[230] C:\WINDOWS\SKRIVBORD\PIC\ASM\PIC18LF1320\TEST1\TEST1.ASM 3 : __CONFIG has been deprecated for PIC18 devices. Use directive CONFIG.
Error[126] C:\WINDOWS\SKRIVBORD\PIC\ASM\PIC18LF1320\TEST1\TEST1.ASM 3 : Argument out of range (not a valid config register address)
Halting build on first failure as requested.



Om jag däremot skriver:

Kod: Markera allt

CONFIG      WDT = OFF
så fungerar det.


Det är samma sak med include-raden.
Microchip's userguide säger: INCLUDE "pic-krets.inc"
Den här guiden säger: #include pic-krets.inc
Och diverse koder på nätet (bl.a forumet) säger: #include <pic-krets.inc>


Så, vilken dokumentation ska man gå efter för att man ska få korrekt information? Det är så många olika bud... Eller är det jag som missuppfattat något?



Sedan, en liten efterlysning: Jag söker asm-koder för att studera och lära mig att strukturera upp och kommentera koden på ett bra sätt. Det kvittar egentligen vad själva koden gör, men det är en fördel om den inte är för kort. Vet att bl.a Sodjan har postat några bra exempel på forumet, men jag hittar dem inte.


edit: Ändrade rubriken.
Senast redigerad av JimmyAndersson 7 januari 2007, 03:09:54, redigerad totalt 1 gång.
tgr
Inlägg: 726
Blev medlem: 10 maj 2006, 09:17:07
Ort: Mölndal

Inlägg av tgr »

koder är bra å titta på.
skulle vi inte kunna ha nått här eller på wikin där man postar fungerande fullständiga koder. sorterade först under språk sen prosessor och sist fuktion.
Det blir lite lättare än att försöka hitta trådar där folk postat??
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Använd gärna den nya "CONFIG = " syntaxen för PIC18.
Den gamla __CONFIG fungerar också, men är "deprecated".
Se beskriving i slutet av include filen för ditt device.

Att den gamla syntaxen finns i exempel beror på att den nya kom
ganska nyligen. Notera också att nyare PIC modeller (dsPIC och PIC24)
*enbart* stöder den nya syntaxen. För PIC16 (och "neråt") gäller dock den
gamla syntaxen.

Ditt exemepl " __CONFIG _WDT_OFF" är inte korrekt. PIC18 serien har
flera CONFIG register och man måste ange vilket register det gäller. Du ska
ha med ett register namn mellan __CONFIG och de olika symbolerna. Det är
därför du får "Error[126]". Men som sagt, använd den nya syntaxen, den är
mycket "renare". Så här kan det se ut till en 18F252 :

Kod: Markera allt

;**********************************************************
;     CONFIG settings
;
	config OSC = HS, OSCS=OFF, PWRT = ON, BOR = OFF
	config WDT = OFF, CCP2MUX = OFF, STVR = OFF, LVP = OFF
	config DEBUG = OFF, CP0 = OFF, CP1 = OFF, CP2 = OFF
	config CP3 = OFF, CPB = OFF, CPD = OFF, WRT0 = OFF
	config WRT1 = OFF, WRT2 = OFF, WRT3 = OFF, WRTB = OFF
	config WRTC = OFF, WRTD = OFF, EBTR0 = OFF, EBTR1 = OFF
	config EBTR2 = OFF, EBTR3 = OFF, EBTRB = OFF
;
Jag kör alltid med include <xxx>, men det kan ha med *vad* som ska inkluderas.
Om man använder "", <> eller ingenting styr var MPASM letar efter filen.
Jag *tror* att om man "" eller <> så letar MPASM i installtionskatalogerna.
Om man inte har några delimiters, så letar MPASM i projektkatalogen (t.ex
för egna INC filer i projektet).

Slutligen, när det gäller att skriva "snygg" kod, så är det väldigt beroende
på tycke och smak. Här har du i alla fall ett prog till en 18F252 som kan ge
lite ledtrådar. Koden är lite quickn--dirty och skriven samtidigt som jag
läste datablad till en grafisk LCD.

Kod: Markera allt

;**********************************************************
	list p=18f252
	include "p18f252.inc"
;**********************************************************
;     Exempelprogram för EW12A00FEW
;     För PIC18F252
;
;     D0-D7 => PORTB
;     A0 => PORTC, 0 (data/command select)
;     E1 => PORTC, 1 (enable, first controller)
;     E2 => PORTC, 2 (enable, second controller)
;
;     5V, LCD-contrast och EL-backling kopplat enl datablad.
;
;**********************************************************
;     CONFIG settings
;
	config OSC = HS, OSCS=OFF, PWRT = ON, BOR = OFF
	config WDT = OFF, CCP2MUX = OFF, STVR = OFF, LVP = OFF
	config DEBUG = OFF, CP0 = OFF, CP1 = OFF, CP2 = OFF
	config CP3 = OFF, CPB = OFF, CPD = OFF, WRT0 = OFF
	config WRT1 = OFF, WRT2 = OFF, WRT3 = OFF, WRTB = OFF
	config WRTC = OFF, WRTD = OFF, EBTR0 = OFF, EBTR1 = OFF
	config EBTR2 = OFF, EBTR3 = OFF, EBTRB = OFF
;
;**********************************************************
;    Some #defines and EUQ's...
;
#define     EW12A00_dataport  PORTB
#define     EW12A00_A0        LATC, 0
#define     EW12A00_E1        LATC, 1
#define     EW12A00_E2        LATC, 2
;
;**********************************************************
;    Some macros...
;
EW12A00_write_data macro value
    movlw   value
    call    EW12A00_data
    endm
;    
EW12A00_set_page_col macro pag, col
    movlw   pag
    call    EW12A00_set_page
    movlw   col
    call    EW12A00_set_col
    endm
;    
;
;**********************************************************
	
Boot	CODE	h'0000'
	goto	Start
;**********************************************************

Main	CODE

Start
    clrf    trisb           ; Allt som utgångar...
    clrf    trisc           ;
    clrf    trisa           ;

    call    delay_1s
    call    EW12A00_reset
    call    delay_1s
    call    EW12A00_set_duty_1_32
    call    delay_1s
    call    EW12A00_set_display_on
    call    delay_1s
    call    EW12A00_set_static_off
    call    delay_1s
    call    EW12A00_set_adc_rev

    call    delay_1s
    call    EW12A00_clear
    
;
    EW12A00_set_page_col d'0', d'0'
;
    EW12A00_write_data b'01111111'   ; "E"
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000001'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00111111'   ; "W"
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'00111000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'00111111'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00000000'   ; "1"
    EW12A00_write_data b'01000010'
    EW12A00_write_data b'01111111'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'01000010'   ; "2"
    EW12A00_write_data b'01100001'
    EW12A00_write_data b'01010001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000110'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'01111110'   ; "A"
    EW12A00_write_data b'00010001'
    EW12A00_write_data b'00010001'
    EW12A00_write_data b'00010001'
    EW12A00_write_data b'01111110'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00111110'   ; "0"
    EW12A00_write_data b'01010001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000101'
    EW12A00_write_data b'00111110'
    EW12A00_write_data b'00000000'
;
    EW12A00_write_data b'00111110'   ; "0"
    EW12A00_write_data b'01010001'
    EW12A00_write_data b'01001001'
    EW12A00_write_data b'01000101'
    EW12A00_write_data b'00111110'
    EW12A00_write_data b'00000000'
    
    EW12A00_set_page_col d'1', d'0'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01101100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01001100'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01100000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01100000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'
    EW12A00_write_data b'01000000'

    EW12A00_set_page_col d'0', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'1', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'2', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'3', d'70'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'00000001'
    EW12A00_write_data b'00000001'
    EW12A00_set_page_col d'1', d'74'
    EW12A00_write_data b'11110000'
    EW12A00_write_data b'11110000'
    EW12A00_set_page_col d'2', d'74'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'11111111'
    EW12A00_set_page_col d'3', d'74'
    EW12A00_write_data b'11111111'
    EW12A00_write_data b'11111111'


loop

	goto	loop			; Once again...
	
;**********************************************************
;  EW12A00xxx subrutines.
;

EW12A00_vars             udata_acs

EW12A00_page_addr        res 1   ; temp reg for EW12A00_clear
EW12A00_col_addr         res 1   ; temp reg for EW12A00_clear
EW12A00_half_flag        res 1   ; flag for first second ctrl
EW12A00_col_temp         res 1   ; temp reg for EW12A00_set_col


EW12A00_code   CODE

;**********************************************************
EW12A00_cmd
; write byte in W as "command" to EW12A00.
; Writes to both controllers...
;
    bcf     EW12A00_A0        ; "Command" mode
    nop
    nop
    movwf   EW12A00_dataport
    nop
    nop
    bsf     EW12A00_E1        ; Clock first (left) ctrl.
    nop
    bsf     EW12A00_E2        ; Clock second (right) ctrl.
    nop
    nop
    bcf     EW12A00_E1
    nop
    bcf     EW12A00_E2
    nop
    nop
    return
    
;**********************************************************
EW12A00_data
; write byte in W as "data" to EW12A00.
; Select controller by EW12A00_half_flag
; if h'00' => first controller, left half
; if not h'00' => second controller, right half
;
    bsf     EW12A00_A0        ; "Data" mode
    nop
    nop
    movwf   EW12A00_dataport
    nop
    nop
    tstfsz  EW12A00_half_flag
    goto    EW12A00_write_sec_cont
    
    bsf     EW12A00_E1        ; Clock first (left) ctrl.
    nop
    nop
    bcf     EW12A00_E1
    nop
    goto    end_of_EW12A00_data
    
EW12A00_write_sec_cont
    bsf     EW12A00_E2        ; Clock second (right) ctrl.
    nop
    nop
    bcf     EW12A00_E2
    nop
    
end_of_EW12A00_data
    return
    
;**********************************************************
EW12A00_clear
; clear EW12A00...
; Page : 3 => 0
; Column : 121 => 0
;

    movlw   d'04'
    movwf   EW12A00_page_addr

clear_page_loop

    decf    EW12A00_page_addr, f
    movf    EW12A00_page_addr, w
    call    EW12A00_set_page

    movlw   d'122'
    movwf   EW12A00_col_addr

clear_col_loop

    decf    EW12A00_col_addr, f
    movf    EW12A00_col_addr, w
    call    EW12A00_set_col
    EW12A00_write_data  h'00'
    tstfsz  EW12A00_col_addr
    goto    clear_col_loop
    tstfsz  EW12A00_page_addr
    goto    clear_page_loop
    
    return
    
;**********************************************************
EW12A00_set_col
; column no in W...
; Sets 'EW12A00_half_flag' depending on the column.
;
    movwf   EW12A00_col_temp
    sublw   d'60'                   ; Col > 60 ?
    bn      EW12A00_set_sec_cont    ; Yes
    
    clrf    EW12A00_half_flag       ; No, first cntl.
    movf    EW12A00_col_temp, w     ; Restore W
    goto    end_of_EW12A00_set_half
    
EW12A00_set_sec_cont
    
    setf    EW12A00_half_flag       ; Second cntl.
    movlw   d'61'                   ; Adjust original W value
    subwf   EW12A00_col_temp, w     ; for second cntl...

end_of_EW12A00_set_half

    addlw   d'19'
    call    EW12A00_cmd
    return

;**********************************************************
EW12A00_set_page
; page no in W...
;
;    sublw   d'3'
    iorlw   b'10111000'
    call    EW12A00_cmd
    return

;**********************************************************
EW12A00_set_adc_forw
    movlw   b'10100000'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_adc_rev
    movlw   b'10100001'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_static_on
    movlw   b'10100101'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_static_off
    movlw   b'10100100'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_display_on
    movlw   b'10101111'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_display_off
    movlw   b'10101110'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_reset
    movlw   b'11100010'
    call    EW12A00_cmd
    return
    
;**********************************************************
EW12A00_set_duty_1_32
    movlw   b'11100010'
    call    EW12A00_cmd
    return
    
;**********************************************************
; Simple delay routine.
; Undefined lenght, probable *not* 1 sec...
;
dly_vars     udata_acs
CNT1         res 1
CNT2         res 1
CNT3         res 1


dly_code   code

delay_1s
;    return
;
	movlw	0x01
	movwf	CNT1
	movlw	0x01
	movwf	CNT2
	movlw	0x10
	movwf	CNT3
dly_loop
	decfsz	CNT2
	goto 	dly_loop
	movlw	0x08
	movwf	CNT2
	decfsz	CNT1
	goto	dly_loop
	decfsz	CNT3
	goto 	dly_loop
	return
    

	end
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Mycket givande!

Tackar. :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

En liten grejj som jag fastnade vid:

Det står "config OSC = HS" i koden ovan. Jag har inte hittat något ställe i databladet där varken OSC eller HS finns med. Ja, det står förstås om HS, men där ställer man in det i CONFIG1H, dvs FOSC3:0.

Förstod att jag skulle skriva OSC = INTIO2 för att få intern oscillator med i/o på RA6 och RA7, men det var bara ett logiskt antagande som visade sig vara rätt. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Från p18f1220.inc :

Kod: Markera allt

;==========================================================================
;
;   IMPORTANT: For the PIC18 devices, the __CONFIG directive has been
;              superseded by the CONFIG directive.  The following settings
;              are available for this device.
;
;   Oscillator Selection:
;     OSC = LP             LP Oscillator
;     OSC = XT             XT Oscillator
;     OSC = HS             HS Oscillator
;     OSC = EC             External Clock on OSC1, OSC2 as FOSC/4
;     OSC = ECIO           External Clock on OSC1, OSC2 as RA6
;     OSC = HSPLL          HS + PLL
;     OSC = RCIO           External RC on OSC1, OSC2 as RA6
;     OSC = INTIO2         Internal RC, OSC1 as RA7, OSC2 as RA6
;     OSC = INTIO1         Internal RC, OSC1 as RA7, OSC2 as FOSC/4
;     OSC = RC             External RC on OSC1, OSC2 as FOSC/4
;
;   Fail-Safe Clock Monitor:
;     FSCM = OFF           Fail-Safe Clock Monitor disabled
;     FSCM = ON            Fail-Safe Clock Monitor enabled
;
;   Internal External Switch Over mode:
;     IESO = OFF           Internal External Switch Over mode disabled
;     IESO = ON            Internal External Switch Over mode enabled
;
;   Power-up Timer:
;     PWRT = ON            Enabled
;     PWRT = OFF           Disabled
;
;   Brown-out Reset:
;     BOR = OFF            Disabled
;     BOR = ON             Enabled
;
;   Brown-out Voltage:
;     BORV = 45            4.5V
;     BORV = 42            4.2V
;     BORV = 27            2.7V
;     BORV = 20            2.0V
;
;   Watchdog Timer:
;     WDT = OFF            Disabled
;     WDT = ON             Enabled
;
;   Watchdog Postscaler:
;     WDTPS = 1            1:1
;     WDTPS = 2            1:2
;     WDTPS = 4            1:4
;     WDTPS = 8            1:8
;     WDTPS = 16           1:16
;     WDTPS = 32           1:32
;     WDTPS = 64           1:64
;     WDTPS = 128          1:128
;     WDTPS = 256          1:256
;     WDTPS = 512          1:512
;     WDTPS = 1024         1:1024
;     WDTPS = 2048         1:2048
;     WDTPS = 4096         1:4096
;     WDTPS = 8192         1:8192
;     WDTPS = 16384        1:16384
;     WDTPS = 32768        1:32768
;
;   MCLR Enable:
;     MCLRE = OFF          Disabled
;     MCLRE = ON           Enabled
;
;   Stack Full/Overflow Reset:
;     STVR = OFF           Disabled
;     STVR = ON            Enabled
;
;   Low Voltage ICSP:
;     LVP = OFF            Disabled
;     LVP = ON             Enabled
;
;   Background Debugger Enable:
;     DEBUG = ON           Enabled
;     DEBUG = OFF          Disabled
;
;   Code Protection Block 0:
;     CP0 = ON             Enabled
;     CP0 = OFF            Disabled
;
;   Code Protection Block 1:
;     CP1 = ON             Enabled
;     CP1 = OFF            Disabled
;
;   Boot Block Code Protection:
;     CPB = ON             Enabled
;     CPB = OFF            Disabled
;
;   Data EEPROM Code Protection:
;     CPD = ON             Enabled
;     CPD = OFF            Disabled
;
;   Write Protection Block 0:
;     WRT0 = ON            Enabled
;     WRT0 = OFF           Disabled
;
;   Write Protection Block 1:
;     WRT1 = ON            Enabled
;     WRT1 = OFF           Disabled
;
;   Boot Block Write Protection:
;     WRTB = ON            Enabled
;     WRTB = OFF           Disabled
;
;   Configuration Register Write Protection:
;     WRTC = ON            Enabled
;     WRTC = OFF           Disabled
;
;   Data EEPROM Write Protection:
;     WRTD = ON            Enabled
;     WRTD = OFF           Disabled
;
;   Table Read Protection Block 0:
;     EBTR0 = ON           Enabled
;     EBTR0 = OFF          Disabled
;
;   Table Read Protection Block 1:
;     EBTR1 = ON           Enabled
;     EBTR1 = OFF          Disabled
;
;   Boot Block Table Read Protection:
;     EBTRB = ON           Enabled
;     EBTRB = OFF          Disabled
;
;==========================================================================
;=======================================================================
;
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Aha! Hm, det borde jag kanske ha upptäckt. :)


Fortsätter med två frågor till.

Först en fråga om hur man ställer in OSCCON-registret.

Jag har provat med både:

Kod: Markera allt

movlw b'01111111'
movwf OSCCON
och:

Kod: Markera allt

bcf      OSCCON, IDLEN
bsf      OSCCON, IRCF2
bsf      OSCCON, IRCF1
bsf      OSCCON, IRCF0
bsf      OSCCON, SCS1
men i båda fallen får jag "ERROR[152] .... Executable code and data must be defined in an appropriate section" på alla de raderna.

Det känns som om jag skulle ha missat någon inställning i MPLAB, eller så är det jag som är ute på cykeltur.



Fråga 2 handlar om bankerna. Jag har letat utan att hitta någon bra förklaring på när man använder BANKSEL. Troligen har jag för lite koll på hur bankerna fungerar för nedanstående text (ur MPASM's Userguide) fastnar inte riktigt:

"In many cases, RAM allocation will span multiple banks, and executable code will span multiple pages. In these cases, it is necessary to perform proper bank and page set-up to properly access the labels. However, since the absolute addresses of these variable and address labels may not be known at assembly time, it is not always possible to place the proper code in the source file. For these situations two directives, banksel and pagesel have been added. These directives instruct the linker to generate the correct bank or page selecting code for a specified label. An example of how code should be converted is shown below."
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

ERROR[152] beror på hur koden ser ut *för övrigt*.
Din kod (båda exemplen) är korrekt.

D:v.s att du har lämpliga CODE segment för din kod och
UDATAxxx segment för dina data definitioner. Se t.ex denna kod
klippt från mit förra kodexempel :

Kod: Markera allt

;**********************************************************
; Simple delay routine.
; Undefined lenght, probable *not* 1 sec...
;
dly_vars     udata_acs
CNT1         res 1
CNT2         res 1
CNT3         res 1


dly_code   code

delay_1s
;    return
;
   movlw   0x01
   movwf   CNT1
   movlw   0x01 
"dly_vars udata_acs" inleder att datasegment som heter "dly_vars"
och som lägger variablerna i "access bank".

"dly_code code" inleder ett kodsegment som heter "dly_code".

Du kan inte ha kod i ett datasegment och tvärtom...

När det gäller bank-hanteringen så måste du kolla den delen av
databladet ordentligt. Speciellt användningen av "access bank" vilket
underlättar oerhört (stor fördel med PIC18 jämfört med PIC16).

Behover av BANKSEL är normalt värdigt litet för att inte säga obefintligt
på PIC18 serien. Att man inte behöver extra kod för bank-hanteringen
är en av anledningarna att PIC18 kod blir snabbare än samma PIC16 kod.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Nu hänger jag med. :)


Har gjort de första grejjerna i koden till samma projekt som jag hade problem med i MikroBasic.
De första 93 raderna MikroBasic har förvandlats till 61 rader assembler, och då är det ändå inklusive en hel del extra kommentarer. :)

Det är väldigt kul med asm! Trodde att jag skulle ha större problem med tanke på att jag inte programmerat det på snart 20 år och i princip glömt allt. Men det dyker säkert ändå upp massa frågor i fortsättningen. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En annan sak som underlättar förståelsen...

Kör med "MAP file" ikryssat i konfigen för projektet -> Linker.
I MAP filen återkommer dessa segment ("dly_code" o.s.v) och man
får direkt info om vilken adress segmentet ligger på samt kanske
intressantast, hur *stort* kodsegmentet är.

Du ser även vilka adresser som länkaren har valt till de olika
variablerna (från UDATA_xxx segmenten). Kanske inte lika
intressant, men ändå...

Jag brukar gödsla med CODE segment. Det ger en del fördelar.
- Man ger fler möjligheter till länkaren att "pussla" ihop koden.
- Man får statistik över segmentens placering och storlek direkt i MAP filen.
- Det blir enklare när man vill splitta koden i flera ASM filer, halva jobbet
är redan gjort.
Skriv svar