PIC: Relocatable mode fungerar inte

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

PIC: Relocatable mode fungerar inte

Inlägg av Icecap »

Sitter och försöker lära pojken lite programmering på PIC medelst PICKit2, MPLAB osv. Assembler gäller och vi har tittat lite på det program som är lagt in när man köper mojängen.

Det program är i absolut mode och det vettigaste är väl att lära honom från början att använda relokerbart mode... men de DET går inte!

Jag har skrivit om programmet en aning, har rensat det ganska mycket och det finns inte ett suck att det kan fungera!

Kod: Markera allt

#include <p16F690.inc>
    __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

    errorlevel -302

My_Vars     UDATA
My_Swap     res     1

STARTUP CODE
    goto    Start
    nop
    nop
    nop
    nop                 ; Really to be goto "ISR-routine"

Start:
    banksel	TRISA
    movlw   0xFF
    movwf   TRISA       ; Make PortA all input
    clrf    TRISC       ; Make PortC all output
    movlw   0x10        ; A2D Clock Fosc/8
    movwf   ADCON1
    banksel	ANSEL
    movlw   0xFF        ; we want all Port A pins Analoga
    movwf   ANSEL
    banksel  ADCON0
    movlw   0x01
    movwf   ADCON0      ; configure A2D for Channel 0 (RA0), Left justified, and turn on the A2D module
    nop                 ; wait 5uS for A2D amp to settle and capacitor to charge.
    nop                 ; wait 1uS
    nop                 ; wait 1uS
    nop                 ; wait 1uS
    nop                 ; wait 1uS
MainLoop:
    bsf     ADCON0,GO	; start conversion
Wait4It:
    btfsc   ADCON0,GO   ; this bit will change to zero when the conversion is complete
    goto    Wait4It

    movf   ADRESH, W
    movwf   My_Swap
    rrf     My_Swap, F
    rrf     My_Swap, F
    rrf     My_Swap, F
    rrf     My_Swap, W
    andlw   0x0F
    movwf   PORTC
    goto    MainLoop

     end
HEX-filen ser ut som följer:
:020000040000FA
:040000000034003494
:0C00040007280000000000000000831628
:100010000313FF308500870110309F008312031700
:10002000FF309E008312031301309F000000000088
:100030000000000000009F149F181C281E08003EAE
:10004000A000A00CA00CA00C200C0F3987001B28CE
:100050008207013402340434083404340234013495
:1000600000340934093406340634003400340F34C3
:020070000F344B
:02400E00D430AC
:00000001FF

och där framgår det att de 2 första kommandon är 0x3400 = IORLW 0x00 varefter programmet verkar komma i tänkt orden.

När jag blåser in det i kretskortet som följer med är den stendöd, om jag istället simulerar i MPLAB SIM får jag en kämpa hög med
"CORE-E0002: Stack under flow error occurred from instruction at 0x000000" och den stoppar efter 200 st av dessa.

Om jag istället ändrar lite till ABSOLUT MODE fungerar skiten alldeles utmärkt.

Jag ändrar starten av programmet till:

Kod: Markera allt

    cblock 0x20
My_Swap
    endc

    org 0x000
    goto    Start
    nop
    nop
    nop
    nop                 ; Really to be goto "ISR-routine"

Start:
    banksel	TRISA
och allting fungerar.

MPLAB är senaste, nerladdad i morse men jag har haft samma problem tidigare men inte haft så mycket gång i PIC ett tag.

Och nu kommer frågan: varför tusan gör den på detta viset?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC: Relocatable mode fungerar inte

Inlägg av sodjan »

Det fungerer helt OK med "STARTUP CODE h'0000'"
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC: Relocatable mode fungerar inte

Inlägg av Icecap »

Messerschmitt :vissla:

Jag läste i din beskrivning (eller var det Microchips?) av relokerbart mode att det var nog att skriva just STARTUP för att den var predefinierat till "startadressen" men OK, jag ska testa att skriva in detta.

*skriver o testar*

Jahopp... sodjan har rätt (som vanligt) *suck*, man ska inte tro på allt man läser alltså...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC: Relocatable mode fungerar inte

Inlägg av sodjan »

Det fungerar utan hårdkodad adress *om* det finns en "section"
i LKR filen som heter likdant som man har skrivit föra CODE. Och jag
har bestämt för mig att det var så i LKR filerna "för ett tag sedan"
men det ser ut som att det är ändrat i senare MPLAB versioner.

Jämför t.ex det exempel på LKR fil som jag hade kopierat till denna sida :
http://www.jescab.se/Relocmode.html (det var nog den du hade sett !?)
med den aktuella i en senare MPLAB installation. Jag tar med de viktiga delarna här nedan:

Kod: Markera allt

CODEPAGE   NAME=vectors  START=0x0      END=0x4      PROTECTED          <<<===
CODEPAGE   NAME=page0    START=0x5      END=0x7FF
...
...
SECTION    NAME=STARTUP  ROM=vectors    // Reset and interrupt vectors   <<<===
SECTION    NAME=PROG1    ROM=page0      // ROM code space - page0
...
Det är de två markerade raderna som gjorde att det *då* räckte med att
kalla en section för "STARTUP" (precis som du provade med) för att den skulle
mappas till h'0000' (alltså till den "protected" section som kallas "vectors").

Sen kan man undrar varför MPLINK i alla fall inte la den första CODE section
på adress h'0000', men det vet jag inte just nu. Så min sida är inte korrekt
längre med avseende på just detta. Om jag får ofantligt med ork någon dag
så kanske jag till och med ändrar det... :-)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC: Relocatable mode fungerar inte

Inlägg av v-g »

Jag har också stångat min panna pga EXAKT detta det står att det finns en sektion som heter STARTUP och det finns det om man skriver dit den själv :vissla:

Numera heter min RESET_VECTOR precis som i templates (står såklart CODE 0x0000 efter denna ;) )
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC: Relocatable mode fungerar inte

Inlägg av sodjan »

> ...en sektion som heter STARTUP och det finns det om man skriver dit den själv

Ja, nu ja (i senare MPLAB versioner) får man skriva det det själv om man vill ha
det så. Man jag har bestämt för mig att det var så per default i tidigare versioner.

Det kan finnas en liten poäng (det är "snyggt") att ha en lösning som helt saknar
hårdkodade adresser i koden. Men å andra sidan så är kanske en adress för
just h'0000' inte hela världen... :-)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC: Relocatable mode fungerar inte

Inlägg av v-g »

sodjan:Det beror på hur ren i läran man är ;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC: Relocatable mode fungerar inte

Inlägg av sodjan »

Så är det. Det viktiga är att förstå tekniken bakom, och varför man skulle
vilja göra det ena eller det andra och vilka eventuella för resp nackdelar
de olika alternativen/metoderna har. Då kommer ju det val man sedan gör
i alla fall att vara väl underbyggt.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC: Relocatable mode fungerar inte

Inlägg av Icecap »

Som jag ser det är det OK att man vill ange en "hård" adress där koden ska börja MEN jag anser att man inte ska ange det i tal!

OK, startadressen är "alltid" 0x000 i PIC men denna adress varierar efter vilken processor man väljer (tänk ARM, AVR, Z80 osv) och jag tycker att man skulle ha en sektion som man använde ("BOOT" kanske?) just för startadressen.

Jag vet om att mnemonic'sen inte är lika för olika processortyper men en fasta namn för viktiga sektorer ville vara trevligt, det finns ju skillnader mellan PIC16 och PIC18 i interruptadresser t.ex. vilket kan ge problem med hårdkodade adresser om man migrerar kod, hade man bara angivit "STARTUP CODE BOOT" (eller liknande) och låtit LKR-filen ta hand om resten ville man komma förbi många av de idiotfel som kan vara så svåra att hitta för att de är så dumma.

Och ja, jag kan skriva in dom för hand, nemas problemas och då fungerar det... till nästa uppdatering av MPLAB - och då får jag skriva in dom igen osv. Ett rent Sysifosarbete som kommer att bli fel någon gång då och då.
Skriv svar