Frasses 'PIC från början'-tråd

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Frasse
Inlägg: 136
Blev medlem: 29 januari 2005, 10:30:42

Frasses 'PIC från början'-tråd

Inlägg av Frasse »

När jag idag skulle "assembla" min mitt första egenskrivna (delvis iaf...) assembler-program till en PIC16f628A så går något galet! Det går bra att "builda" koden och när jag simulerar den funkar den som det är tänkt, men när jag väljer assemble så skiter det sig ordentligt:

Kod: Markera allt

Executing: "C:\Program\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F628A "f628temp.asm" /l"f628temp.lst" /e"f628temp.err" /o"f628temp.o"
Warning[215] C:\EL\PROJEKT\TEST 1\F628TEMP.ASM 45 : Processor superseded by command line.  Verify processor symbol.
Error[152]   C:\EL\PROJEKT\TEST 1\F628TEMP.ASM 88 : Executable code and data must be defined in an appropriate section
Error[152]   C:\EL\PROJEKT\TEST 1\F628TEMP.ASM 89 : Executable code and data must be defined in an appropriate section
Message[302] C:\EL\PROJEKT\TEST 1\F628TEMP.ASM 90 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Error[152]   C:\EL\PROJEKT\TEST 1\F628TEMP.ASM 90 : Executable code and data must be defined in an appropriate section
Jag har sökt lite på texten i felmeddelandet och har hittat några svar som föreslår att det e något lurt med MPASM som inte vet vad som e
'CODE' och vad som e 'UDATA'...eller nåt....Döm själva:
The error message is telling you that in relocatable assembly, source code must be placed in code sections and data must be placed in data sections. Please see the MPASM User's Guide (MPASM User's Guide). Start by looking up 'CODE' and 'UDATA.'
Jag har kollat i MPASM's user guide men inte riktigt hittat en lösning på problemet. Vad innebär reloctable assembly?

EDIT: Kom på att jag kan lägga upp koden och *.inc-filen HÄR.
EDIT2: ändrade rubriken till något lite vettigare och kortade ner felmeddelandet lite
Senast redigerad av Frasse 13 oktober 2005, 19:32:31, redigerad totalt 2 gånger.
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg av pheer »

Varför kör du assemble? Det räcker med att köra build all...
Frasse
Inlägg: 136
Blev medlem: 29 januari 2005, 10:30:42

Inlägg av Frasse »

..... :wall: ....men var hamnar .hex-filen då?
Edit: Ja se på fan! DET BLINKAR!!!!!! WOOHOOOO
Senast redigerad av Frasse 12 oktober 2005, 21:09:31, redigerad totalt 1 gång.
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg av pheer »

I samma mapp som projektet. I alla fall för alla mina mplab-projekt. 7.21 och 7.10
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hej !
Bara för skoj skull tog jag och "snyggade till" koden lite :

Kod: Markera allt

;   list      p=p16f628A        ; list directive to define processor
   #include <p16f628A.inc>        ; processor specific variable definitions
  
   __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF

my_vars  udata
delay1   res 1
delay2   res 1

startup  code
         goto main
         
prog     code
main
         banksel  trisa
         movlw    b'00000000'    ;PORTA =ut
         movwf    TRISA
         banksel  porta

main_loop
         bsf      porta, 0       ; LED på.
         call     del_loop
         bcf      porta, 0       ; LED av.
         call     del_loop
         goto     main_loop

del_loop
         decfsz   delay1, f 
         goto     del_loop
         decfsz   delay2, f
         goto     del_loop
         return

         end
Glöm inte att lägga till P16F628A.LNK som "Linker script", annars får du en massa fel... :-)
Jag har inte testkört på "the real stuff", men det "bygger" utan fel i alla fall...
Frasse
Inlägg: 136
Blev medlem: 29 januari 2005, 10:30:42

Inlägg av Frasse »

Jo det blev ju lite renare nu, men faktum är att jag gjorde om min egen kod innan jag såg detta och den blev nästan likadan! Ett bra betyg åt mig alltså :D
En liten fråga bara:

Kod: Markera allt

my_vars  udata
delay1   res 1
delay2   res 1

startup  code
         goto main
         
prog     code
main
         banksel  trisa
         movlw    b'00000000'    ;PORTA =ut
         movwf    TRISA
         banksel  porta
Det där 'my_vars udata' och 'startup code'
Har det med Linker script att göra? Var det det som felet berodde på som jag beskrev i mitt översta inlägg?
Och 'banksel trisa' ....Vad är det för instruktion? Jag fattar att den går till Bank 0 där TRISA finns, men var hittar man den instruktionen?


Kan för övrigt hälsa att Wisp-en som jag köpte av dig häromdagen funkar kanonbra! Tummen upp för den!:tumupp:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det där 'my_vars udata' och 'startup code'
> Har det med Linker script att göra?

När man lägger till ett "Linker Script" (LNK fil) till sitt projekt, så säger man även (indirekt) att "jag kör i relocatable mode". Till skillnad mot "Absolute mode", vilket är den gamla sättet att skriva PIC assemebler kod. Rellocatable mode är att föredra. Senare PIC modeller (PIC24, PIC30, PIC33) stöder enbart relocatable mode.

Det är inga stora skillnader, så deet finns igentligen ingen större anledning till att inte köra i reloc.mode. Obs att den mesta koden som man hittar på nätet är i abs.mode, och antingen använder man den som den är (alltså *utan* Linker Script), eller så gör man de justeringar som behövs så att den blir i reloc.mode. Den mesta koden på nätet är ganska risig ändå, så man kanske i alla fall vil "snygga upp" den...

Se även : http://www.jescab.se/Rellocmode.html

> Och 'banksel trisa' ....var hittar man den instruktionen?

I *dokumentationen* (antingen "MPASM User Guide" PDF'en eller i online helpen i MPLAB), var annars ? :-)
Jag antar att du har laddat ner dokumentationen från MPLAB sidan !?

Kolla efter BANKSEL ? Kolla även efter UDATA och CODE, eftersom du frågade om dom också...

EDIT: En liten justering...
BANKSEL, CODE, UDATA och RES är inga "instruktioner", de är "direktiv", så du skall leta under "assembler directives" eller något liknande...
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

När vi ändå är inne på linkerfilen har jag lite frågor.

Kollar man på 16f628.lkr så ser den ju ut så här:

Kod: Markera allt

// Sample linker command file for 16F628
// $Id: 16f628.lkr,v 1.3 2002/01/29 22:10:01 sealep Exp $

LIBPATH  .

CODEPAGE   NAME=vectors   START=0x0      END=0x4      PROTECTED
CODEPAGE   NAME=page      START=0x5      END=0x7FF
CODEPAGE   NAME=.idlocs   START=0x2000   END=0x2003   PROTECTED
CODEPAGE   NAME=.config   START=0x2007   END=0x2007   PROTECTED
CODEPAGE   NAME=eedata    START=0x2100   END=0x217F   PROTECTED

DATABANK   NAME=sfr0      START=0x0      END=0x1F     PROTECTED
DATABANK   NAME=sfr1      START=0x80     END=0x9F     PROTECTED
DATABANK   NAME=sfr2      START=0x100    END=0x11F    PROTECTED
DATABANK   NAME=sfr3      START=0x180    END=0x19F    PROTECTED

DATABANK   NAME=gpr0      START=0x20     END=0x6F
DATABANK   NAME=gpr1      START=0xA0     END=0xEF
DATABANK   NAME=gpr2      START=0x120    END=0x14F

SHAREBANK  NAME=gprnobnk  START=0x70     END=0x7F
SHAREBANK  NAME=gprnobnk  START=0xF0     END=0xFF
SHAREBANK  NAME=gprnobnk  START=0x170    END=0x17F
SHAREBANK  NAME=gprnobnk  START=0x1F0    END=0x1FF

SECTION    NAME=STARTUP  ROM=vectors     // Reset and interrupt vectors
SECTION    NAME=PROG     ROM=page        // ROM code space
SECTION    NAME=IDLOCS   ROM=.idlocs     // ID locations
SECTION    NAME=CONFIG   ROM=.config     // Configuration bits location
SECTION    NAME=DEEPROM  ROM=eedata      // Data EEPROM
Jag tolkar det som att man har två huvudblock, det ena är fram till 0x04 och innehåller resetvectorer etc. Det andra är huvudblocket "page" där programmet kommer ligga.
Kommer man någonsin behöva ändra i denna? när skulle man vilja göra det isåfall?

Är inte 0x0-0x4 extremt snålt med utrymme?
På 18f452 har man ju

Kod: Markera allt

CODEPAGE   NAME=vectors    START=0x0            END=0x29   
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jo, detta är något som debatterar hett inom PIC-värden. En del (bl.a Olin Lathrop på Embed Inc i USA) hävdar bestämmt att de LNK filer som levereras med MPLAB är "brooken" och har "serious problems". Det är lite överdrivet, men visst, de kan skrivas lite annorlunda beroende på hur man själv vill ha det. Vi kan ta 628A's LNK fil som exempel. Den skulle kunna se ut så här (bara rellavanta delar är med) :

Kod: Markera allt

CODEPAGE   NAME=page      START=0x0      END=0x7FF
och sedan ta bort de två raderna med "vectors" och "startup".
Sedan får man skriva så här i koden:

Kod: Markera allt

         code   h'0000'
         goto main
         
prog     code
main
         banksel  trisa
         movlw    b'00000000'    ;PORTA =ut
         movwf    TRISA
         banksel  porta
och om man använder interrupt :

Kod: Markera allt

         code  h'0000'
         goto main
         
isr      code   h'0004'
         <your isr code here, or goto to isr routine...>

prog     code
main
         banksel  trisa
         movlw    b'00000000'    ;PORTA =ut
         movwf    TRISA
         banksel  porta
Jag tror faktiskt att LNK filerna som de ser ut *måste* justeras lite om mankör med interrupt, adress h'0004' (vilket ju är interrupt vektorn) ligger ju som sista adress i "vectors" sektionen, och det enda som man skulle kunna trycka in där är ett "goto", inte speciellt snyggt.

Antagligen har Olin en poäng i att LNK filerna har vissa brister, men de fungerar i alla fall för att köra igång med. Jag har tänkt att skriva något sida om hur man enkelt justerar dom för att fungera smidigare med t.ex interrupt.

Att annat sätt vore att skriva :

Kod: Markera allt

CODEPAGE   NAME=vectors   START=0x0      END=0x3      PROTECTED
CODEPAGE   NAME=isr       START=0x4      END=0x7
CODEPAGE   NAME=page      START=0x8      END=0x7FF 
...
...
SECTION    NAME=STARTUP  ROM=vectors     // Reset vector
SECTION    NAME=ISR      ROM=isr         // Interrupt vector
SECTION    NAME=PROG     ROM=page        // ROM code space
Koden i det falet skulle bli ungefär :

Kod: Markera allt

startup  code
         goto main

isr      code
         goto my_isr_routine
   
prog     code
main
         banksel  trisa
         movlw    b'00000000'    ;PORTA =ut
         movwf    TRISA
         banksel  porta
Fördelen är att man inte behöver ange "hårda" adresser för varhen reset eller interrupt vektorn direkt i källkoden. Det kan underlätta vid t.ex portning av kod från PIC16 till PIC18 arkitekturen.

Jag vet inte om det spred något ljus... :-)

EDIT:

I det sista exemplet med en "isr" sektion, så behöver man antagligen gör den lite större så att man får in "context-save" delen, alltså att man sparar under W och STATUS register innan man gör goto. Men det var mest lite snabba fixar bara för att visa på principerna.

Enklast är nog helt enkelt att bara göra hela programminnet till en enda stor sektion (som i mitt första exempel) och sedan lägga in h'0000' för reset vektorn och h'0004' för interrupt vektorn i koden. Det är ju ganska lite att ändra om man portar koden...
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Tackar, nu blev det genaste lite lättare att förstå.

Har själv gjort så här med interrupt (18f452):

Kod: Markera allt

Int	CODE    h'0008'         ;This is where our interrupt routine will start 
	btfsc	INTCON, TMR0IF	; tmr0 overflow interrupt
	goto	tmr0of
	goto	end_of_isr

tmr0of
	bsf		calcF,0		; set the "its-time-to-read"-flag
	;comf	PORTC,F
	call	resetTimer
	bcf	    INTCON, TMR0IF 	; clear interrupt flag.

end_of_isr

	retfie     
dvs hårdkodat.

Ska ta och testa att ändra lite i lkr-filen, borde t.ex. kunna dela upp vectors i boot och high/low-priority interrupts...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

h'0004' (som jag skrev) gäller för PIC16 serien. h'0008 (och h'0018' om man kör med int prio) gäller för PIC18 serien.

Jag tror inte att det är så vanligt att man använder dubbla int prioriteter, dels så behövs det normalt helt enkelt inte, dels så skapar det en del nya problem. Vissa finesser (t.ex "fast return from interrupt" med automatisk save/restore av context) fungerar inte i båda "nivåerna".
Skriv svar