interrupt med roliga fel
interrupt med roliga fel
Hej på er där ute era smarta pic programmerare. Nu kommer jag med en fråga av ett liknande karaktär från tidigare inlägg. Jag har kortat ner allt på mallen jag använder när man skapar ett ett projekt med MPLAB till pic18f452. Tagit bort allt onödigt som jag inte andvänder. Bara för att ni ska kunna lättare förstå mitt program. Minska röran så mycket som möjligt.
OBS:
Därför programmet ser litet ut är att jag vill bara skapa en programmerings kropp först som fungerar innan jag går vidare med själva programmeringen. Därför har jag skrivit in onödiga kommando rader som NOP.Sammtidigt blir det lättare överskådligt för er som vill hjälpa en nybörjare i Mplab.
Här kommer koden:
LIST P=18F452 F=INHX32 ;directive to define processor and file format
#include <P18F452.INC> ;processor specific variable definitions
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
UDATA
WREG_TEMP RES 1 ;variable in RAM for context saving
STATUS_TEMP RES 1 ;variable in RAM for context saving
BSR_TEMP RES 1 ;variable in RAM for context saving
;******************Reset_start*************************************************
;Reset vector
; This code will start executing when a reset occurs.
org 0x0000
goto Main ;go to start of main code
org 0x0008
goto ISR
;**************************************************************************
;***************interrupt****************************************************
ISR
;**************init**************************************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.
init:
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
bsf RCON,IPEN ;Enable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
return
;*********************Main********************************************
;Start of main program
; The main program code is placed here.
Main
call init
Loop
nop
nop
nop
nop
goto Loop
;******************************************************************************
;End of program
END
Som ni ser finns det rester kvar av mallen men det visentliga kvar bara.
Nu kommer mina frågor.
Fråga nummer 1:
Jag simulerar ett interrupt signal på PortB(RB1) sedan kollar jag på INTCON3(INT1IF) denna blir en etta och interrupt har inträffat registerar pic:en. Allt är som det ska vara blir en etta när den går från låg till hög. Bra tänker jag och förväntar mig att det blir ett hopp till min Interrupt subrutin ISR. Svaret på denna hypotes blir ett nej. Så min fråga är varför hoppar inte den till ISR. Laben är länkad med org att den ska börja på adressen 0x0008 men den hoppar inte ändå. Varför inte?
Fråga nummer 2:
När min interrupt subrutin är klar så ska programmet hoppa tillbaka till huvudprogrammet där ifrån den kom. Detta gör man med kommandot retfie. När jag skriver in denna rad ett par rader nedanför ISR så får jag detta felmeddelande.
Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000008, length=0x00000024
Passar inte den absoluta sektionen startar på den angivna adressen och har en längd på angivet värde. Hur ska jag tyda denna information. Vart ligger felet i mitt program. Hur ändrar jag för att det ska bli rätt?
Fråga nummer 3:
Om jag vill ha fler interrupt nivåer än två går det att skapa med tanke på att det bara finns två interrupt adresser angivna? Eller måste jag välja en pic som har tre interruptnivåer, Vilken har det?
Med Vänlig Hälsning Markus Carlsson
OBS:
Därför programmet ser litet ut är att jag vill bara skapa en programmerings kropp först som fungerar innan jag går vidare med själva programmeringen. Därför har jag skrivit in onödiga kommando rader som NOP.Sammtidigt blir det lättare överskådligt för er som vill hjälpa en nybörjare i Mplab.
Här kommer koden:
LIST P=18F452 F=INHX32 ;directive to define processor and file format
#include <P18F452.INC> ;processor specific variable definitions
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
UDATA
WREG_TEMP RES 1 ;variable in RAM for context saving
STATUS_TEMP RES 1 ;variable in RAM for context saving
BSR_TEMP RES 1 ;variable in RAM for context saving
;******************Reset_start*************************************************
;Reset vector
; This code will start executing when a reset occurs.
org 0x0000
goto Main ;go to start of main code
org 0x0008
goto ISR
;**************************************************************************
;***************interrupt****************************************************
ISR
;**************init**************************************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.
init:
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
bsf RCON,IPEN ;Enable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
return
;*********************Main********************************************
;Start of main program
; The main program code is placed here.
Main
call init
Loop
nop
nop
nop
nop
goto Loop
;******************************************************************************
;End of program
END
Som ni ser finns det rester kvar av mallen men det visentliga kvar bara.
Nu kommer mina frågor.
Fråga nummer 1:
Jag simulerar ett interrupt signal på PortB(RB1) sedan kollar jag på INTCON3(INT1IF) denna blir en etta och interrupt har inträffat registerar pic:en. Allt är som det ska vara blir en etta när den går från låg till hög. Bra tänker jag och förväntar mig att det blir ett hopp till min Interrupt subrutin ISR. Svaret på denna hypotes blir ett nej. Så min fråga är varför hoppar inte den till ISR. Laben är länkad med org att den ska börja på adressen 0x0008 men den hoppar inte ändå. Varför inte?
Fråga nummer 2:
När min interrupt subrutin är klar så ska programmet hoppa tillbaka till huvudprogrammet där ifrån den kom. Detta gör man med kommandot retfie. När jag skriver in denna rad ett par rader nedanför ISR så får jag detta felmeddelande.
Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000008, length=0x00000024
Passar inte den absoluta sektionen startar på den angivna adressen och har en längd på angivet värde. Hur ska jag tyda denna information. Vart ligger felet i mitt program. Hur ändrar jag för att det ska bli rätt?
Fråga nummer 3:
Om jag vill ha fler interrupt nivåer än två går det att skapa med tanke på att det bara finns två interrupt adresser angivna? Eller måste jag välja en pic som har tre interruptnivåer, Vilken har det?
Med Vänlig Hälsning Markus Carlsson
OK, då skall vi se... 
Du bygger med länkaren, eftersom du gar UDATA och RES med, d.v.s "relocatable mode". Helt OK, det är så man skall köra.
Dock, i reloc mode är inte ORG godkänt. Får du ingen varning eller fel på det ?
Det bör se ut ungefär så här :
Sedan något i stil med (taget ur huvudet, *ej* debuggat !) :
CODE skrivet med versaler för att göra det tydligt, annars
spelar det ingen roll.
Sedan, sätt *inte* RCON,IPEN, jag är helt övertygad om att du
just nu *inte* behöver två interrupt prioriteter, eller ? Det är inte
speciellt vanligt utom om man har mycket speciella krav på
svarstiden för något interrupt, att man gör det. En hel del blir
enklare med en nivå...
Fråga två:
jag har inte kollat i LKR filen, men sannoolikt ligger det
en "code section" på 0008 som inte är så stor. Spelar ingen roll,
med de extra CODE som jag har lagt in, så kommer den andra
koden att flyttas över till den generella sektionen där det finns
massor av plats.
Fråga tre:
Du har blandat ihop interupt "prioritet" och "källor".
Du kan ha massor av olika interrupt som alla går till h'0008'.
Där (först i ISR'en) får du börja med att kolla vilken xxIF flagga
som är satt och hoppa till rätt rutin. Sedan kan man antingen
kolla resten av xxIF flaggorna innan RETFIE, eller bara helt enkelt
gör RETFIE, och låta processorn göra ett nytt avbott om det behövs.
Glöm inte bort att kolla xxIE flaggorna samtidigt ! Du kan jag ha
stängt av ISR'en för en viss källa tillfälligt, och då vill du sannolikt inte
att den körs "av misstag".
Ordningen som du testar xxIF flaggorna kommer att bli en slags
"prioritet", om två xxIF är satta, kommer den som du testar först
att också köras först.

Du bygger med länkaren, eftersom du gar UDATA och RES med, d.v.s "relocatable mode". Helt OK, det är så man skall köra.
Dock, i reloc mode är inte ORG godkänt. Får du ingen varning eller fel på det ?
Det bör se ut ungefär så här :
Kod: Markera allt
;********Reset_start****************
;Reset and interrupt vector
CODE h'0000'
goto Main
CODE h'0008'
goto ISR
;**************************************
Kod: Markera allt
;*********interrupt*****************
myisr CODE
ISR
nop
nop
nop
retfie
;**************init*********************
myinit CODE
init
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
bsf RCON,IPEN ;Enable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
return
;*********************Main************
; Start of main program
; The main program code is placed here.
mymain CODE
Main
call init
Loop
nop
nop
nop
nop
goto Loop
;*************************************
;End of program
END
spelar det ingen roll.
Sedan, sätt *inte* RCON,IPEN, jag är helt övertygad om att du
just nu *inte* behöver två interrupt prioriteter, eller ? Det är inte
speciellt vanligt utom om man har mycket speciella krav på
svarstiden för något interrupt, att man gör det. En hel del blir
enklare med en nivå...
Fråga två:
jag har inte kollat i LKR filen, men sannoolikt ligger det
en "code section" på 0008 som inte är så stor. Spelar ingen roll,
med de extra CODE som jag har lagt in, så kommer den andra
koden att flyttas över till den generella sektionen där det finns
massor av plats.
Fråga tre:
Du har blandat ihop interupt "prioritet" och "källor".
Du kan ha massor av olika interrupt som alla går till h'0008'.
Där (först i ISR'en) får du börja med att kolla vilken xxIF flagga
som är satt och hoppa till rätt rutin. Sedan kan man antingen
kolla resten av xxIF flaggorna innan RETFIE, eller bara helt enkelt
gör RETFIE, och låta processorn göra ett nytt avbott om det behövs.
Glöm inte bort att kolla xxIE flaggorna samtidigt ! Du kan jag ha
stängt av ISR'en för en viss källa tillfälligt, och då vill du sannolikt inte
att den körs "av misstag".
Ordningen som du testar xxIF flaggorna kommer att bli en slags
"prioritet", om två xxIF är satta, kommer den som du testar först
att också köras först.
interrupt forts
alltså sodjan är inte lika inne i programmeringen som du.Kan du förklara på ett mer lättförstårligt sätt.är säker rätt det du säger med jag begriper inte ett skvatt. Jag fattar tex inte fortfarande varför programmet inte hoppar. Vart sitter felet.
Varför kan jag inte ha flera prioteringsnivåer än två hur skapar jag det. I mitt program som jag ska skapa som jag har tänkt bygger på att jag ska ha tre prioteringsnivåer. fråga mig inte varför. visa mig i stället hur man skulle kunna bygga en sådan programmeringskropp.
sedan ska jag lägga Till kodenraden myisr CODE ,myinit CODE, mymain
CODE i koden eller. vad gör dom för nytta. CODE och inget efter.
Varför kan jag inte ha flera prioteringsnivåer än två hur skapar jag det. I mitt program som jag ska skapa som jag har tänkt bygger på att jag ska ha tre prioteringsnivåer. fråga mig inte varför. visa mig i stället hur man skulle kunna bygga en sådan programmeringskropp.
sedan ska jag lägga Till kodenraden myisr CODE ,myinit CODE, mymain
CODE i koden eller. vad gör dom för nytta. CODE och inget efter.
fungerar inte
CODE h'0000'
goto Main
CODE h'0008'
goto ISR
de ovanstående kodraderna har jag nu andvänt i stället för
org 0x0000
goto Main
org 0x0008
goto ISR
men det hjälper inte för då får jag följande felmeddelnade
Error[154 E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 32 : Each object file section must be contiguous (section .code)
och sedan får jag föjande warningar med detta har inget med Error att gör men bara en enkel fråga varför tycker den inte om att få etikketter efter column 1
Warning[207] E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 41 : Found label after column 1. (ISR)
Warning[207] E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 51 : Found label after column 1. (init)
sedan en annan fråga är kan man läsa mer om felmedalandet än det som står i output fönstret. bara undrar. kanske förstår bättre om man fick mer info från MPLAB
goto Main
CODE h'0008'
goto ISR
de ovanstående kodraderna har jag nu andvänt i stället för
org 0x0000
goto Main
org 0x0008
goto ISR
men det hjälper inte för då får jag följande felmeddelnade
Error[154 E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 32 : Each object file section must be contiguous (section .code)
och sedan får jag föjande warningar med detta har inget med Error att gör men bara en enkel fråga varför tycker den inte om att få etikketter efter column 1
Warning[207] E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 41 : Found label after column 1. (ISR)
Warning[207] E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 51 : Found label after column 1. (init)
sedan en annan fråga är kan man läsa mer om felmedalandet än det som står i output fönstret. bara undrar. kanske förstår bättre om man fick mer info från MPLAB
> Varför kan jag inte ha flera prioteringsnivåer än två hur skapar jag det.
En PIC 18 kan ha en (1) eller två (2) interrupt prioritetsnivåer. Du behöver antagligen bara en (1) nivå.
Det kan inte vara så svårt att förstå. Vi tar det en gång till :
En PIC 18 kan ha en (1) eller två (2) interrupt prioritetsnivåer. Du behöver antagligen bara en (1) nivå.
OK ??
Jag tänker inte upprepa det en gång till, så sluta att tala om tre eller flera nivåer !!!
Beskriv vad du menar med "prioritetsnivå". Och vilka interrupt det handlar om, samt vilka krav ("svartstid" m.m) du har på dom.
Läs mitt tidigare inlägg en gång till där jag skrev att "Du har blandat ihop interupt "prioritet" och "källor"". Det verkar gälla fortfarande...
När det gäller vad CODE gör, så se "MPASM/MPLINK User's Guide" :
http://ww1.microchip.com/downloads/en/D ... 33014J.pdf .
Har du inte redan gjort det är det hög tid att ladda ner den.
CODE startar en ny "code section" i din applikation.
Denna kommer av länkaren "MPLINK" att läggas in på lämplig plats
i minnet, d.v.s där MPLINK finner det lämpligt.
Har du gjort de ändringar som jag föreslog ?
Främst att köra med 1 int prio-nivå, koden blir enklare då...
> jag begriper inte ett skvatt.
Det gör du säkert...
Var lite mer konkret, så tar du det som du inte förstår..
> jag ska ha tre prioteringsnivåer. fråga mig inte varför.
Du har attityd problem. Glöm inte bort att det är *DU* som ber
om gratissupport, så lite mer ödmjukhet tack !
En PIC 18 kan ha en (1) eller två (2) interrupt prioritetsnivåer. Du behöver antagligen bara en (1) nivå.
Det kan inte vara så svårt att förstå. Vi tar det en gång till :
En PIC 18 kan ha en (1) eller två (2) interrupt prioritetsnivåer. Du behöver antagligen bara en (1) nivå.
OK ??
Jag tänker inte upprepa det en gång till, så sluta att tala om tre eller flera nivåer !!!
Beskriv vad du menar med "prioritetsnivå". Och vilka interrupt det handlar om, samt vilka krav ("svartstid" m.m) du har på dom.
Läs mitt tidigare inlägg en gång till där jag skrev att "Du har blandat ihop interupt "prioritet" och "källor"". Det verkar gälla fortfarande...
När det gäller vad CODE gör, så se "MPASM/MPLINK User's Guide" :
http://ww1.microchip.com/downloads/en/D ... 33014J.pdf .
Har du inte redan gjort det är det hög tid att ladda ner den.
CODE startar en ny "code section" i din applikation.
Denna kommer av länkaren "MPLINK" att läggas in på lämplig plats
i minnet, d.v.s där MPLINK finner det lämpligt.
Har du gjort de ändringar som jag föreslog ?
Främst att köra med 1 int prio-nivå, koden blir enklare då...
> jag begriper inte ett skvatt.
Det gör du säkert...

Var lite mer konkret, så tar du det som du inte förstår..
> jag ska ha tre prioteringsnivåer. fråga mig inte varför.
Du har attityd problem. Glöm inte bort att det är *DU* som ber
om gratissupport, så lite mer ödmjukhet tack !
nej du sodjan
OK ursäkta föregående inlägg men jag menade inte så att du inte får frågasätta,utan jag tyckte att det inte är värt att diskutera och lägga ner energi på, samtidfigt som jag har frusterande kört fast totlalt jämnt nu i miitt project.
så sorry det var inte så jag menade.ska förklar jättr hjärna för dig hur jag har tänkt att programmet ska arbeta men årkade inte jämnt då.sorry.
Ovasett nu så det jag vill är att börja med att få programmet att hoppa tilll min interrrupt subrutin och köra denna som första steg. en sådan enkelt programm borde gå att åstakomma med enkel kod. Då är min fråga har jag initierat rätt i min INIT subrutin eller inte.vad är det som är fel.
Sedan ersatte jag mitt upplägg med programstrukturen mot din och fick samma felmedelande
E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 11 : Each object file section must be contiguous (section .code)
så det verkar inte att hjälpa.
sedan när jag har fått programmet att hoppa till min subrutin ISR så ska jag med glädje av det förklara hur programmet är tänk att fungera.och då kanske jag har mer kött på benen så då kanske jag förstår mer exakt vad man kan göra och inte.
så vi börjar på ruta ett nu vill jag bara få programmet att hopp till en interrupt subrutin när jag gen en signal in på RB1(INT1). Är jag på rätt väg.vart är felet att dn inte hoppar. och varför får jag felmeddelande ovan när jag till och med program?
så sorry det var inte så jag menade.ska förklar jättr hjärna för dig hur jag har tänkt att programmet ska arbeta men årkade inte jämnt då.sorry.
Ovasett nu så det jag vill är att börja med att få programmet att hoppa tilll min interrrupt subrutin och köra denna som första steg. en sådan enkelt programm borde gå att åstakomma med enkel kod. Då är min fråga har jag initierat rätt i min INIT subrutin eller inte.vad är det som är fel.
Sedan ersatte jag mitt upplägg med programstrukturen mot din och fick samma felmedelande
E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 11 : Each object file section must be contiguous (section .code)
så det verkar inte att hjälpa.
sedan när jag har fått programmet att hoppa till min subrutin ISR så ska jag med glädje av det förklara hur programmet är tänk att fungera.och då kanske jag har mer kött på benen så då kanske jag förstår mer exakt vad man kan göra och inte.
så vi börjar på ruta ett nu vill jag bara få programmet att hopp till en interrupt subrutin när jag gen en signal in på RB1(INT1). Är jag på rätt väg.vart är felet att dn inte hoppar. och varför får jag felmeddelande ovan när jag till och med program?
- JimmyAndersson
- Inlägg: 26578
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Markus:
Förstår att det kan vara knepigt i början. (Det var inte så jättelänge sedan jag själv började med just interrupt, men då i MikroBasic.)
En detalj som förenklar är om man kollar igenom vad man skrivit. Har man något problem med koden så kan det vara svårt att förklara det steg för steg. Därför är det bra om man grundligt förklarar en sak i taget.
Det ser tyvärr inte ut som om du kollat igenom vad du skrivit. Ingen kritik, men ett tips.
Se själv:
samtidfigt - samtidigt
totlalt - totalt
förklar - "förklara" eller möjligen "förklarar" ?
jättr - ??
hjärna - I detta fallet ska det vara "gärna"
årkade - orkade
en sådan enkelt programm ett sådant enkelt program
gen - ??
vart är felet att dn inte hoppar. - ??
varför får jag felmeddelande ovan när jag till och med program? - ?? Den meningen ser inte färdig ut...
Förstår att det kan vara knepigt i början. (Det var inte så jättelänge sedan jag själv började med just interrupt, men då i MikroBasic.)
En detalj som förenklar är om man kollar igenom vad man skrivit. Har man något problem med koden så kan det vara svårt att förklara det steg för steg. Därför är det bra om man grundligt förklarar en sak i taget.
Det ser tyvärr inte ut som om du kollat igenom vad du skrivit. Ingen kritik, men ett tips.

Se själv:
samtidfigt - samtidigt
totlalt - totalt
förklar - "förklara" eller möjligen "förklarar" ?
jättr - ??
hjärna - I detta fallet ska det vara "gärna"
årkade - orkade
en sådan enkelt programm ett sådant enkelt program
gen - ??
vart är felet att dn inte hoppar. - ??
varför får jag felmeddelande ovan när jag till och med program? - ?? Den meningen ser inte färdig ut...
Senast redigerad av JimmyAndersson 29 december 2005, 16:06:58, redigerad totalt 1 gång.
Nedanstående kod bygger utan fel.
När jag kör i MPSIM och toggglar RB1, så hamnar man i ISR'en.
En viktig sak som du hade missat var att sätta GIE.
Sen hade du inte satt några CONFIG bitar, så WDT var på
och ställde till det.
Formatteringen var konstig med allt i pos 1, jag vet inte om det blev
så när du klippte in koden i inlägget. Se över det till nästa gång.
xxx_TEMP variablerna behövs inte.
Nu får du "fylla på" med själva applikationen.
Det finns även en del att göra i ISR'en, speciellt om du planerar
att ha flera interrupt-källor. Du måste kolla vilken xxIF flagga som
triggade interruptet.
När jag kör i MPSIM och toggglar RB1, så hamnar man i ISR'en.
En viktig sak som du hade missat var att sätta GIE.
Sen hade du inte satt några CONFIG bitar, så WDT var på
och ställde till det.
Formatteringen var konstig med allt i pos 1, jag vet inte om det blev
så när du klippte in koden i inlägget. Se över det till nästa gång.
xxx_TEMP variablerna behövs inte.
Nu får du "fylla på" med själva applikationen.
Det finns även en del att göra i ISR'en, speciellt om du planerar
att ha flera interrupt-källor. Du måste kolla vilken xxIF flagga som
triggade interruptet.
Kod: Markera allt
list P=18F452
#include <P18F452.INC>
CONFIG OSC=HS ; Sätt in det som stämmer överens med din miljö !!
CONFIG OSCS=OFF, PWRT=ON, BOR=OFF, WDT=OFF, LVP=OFF, DEBUG=OFF
CONFIG CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF
CONFIG WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF
CONFIG EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
;
;UDATA
;
;WREG_TEMP RES 1 ;variable in RAM for context saving
;STATUS_TEMP RES 1 ;variable in RAM for context saving
;BSR_TEMP RES 1 ;variable in RAM for context saving
;
; OVANSTÅENDE BEHÖVS INTE...
;
;
;******************Reset_start*************************************************
;Reset and interrupt vectors
reset_vec code h'0000'
goto Main
ISR_vec code h'0008'
goto isr_start
;**************************************************************************
;***************interrupt****************************************************
ISR_code code
isr_start
nop
nop
nop
bcf INTCON3,INT1IF ;Clear INT1 external interrupt flag.
retfie fast
;**************init**************************************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.
init_code code
init
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
bcf RCON,IPEN ;Disable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
bcf INTCON3,INT1IF ;Clear INT1 external interrupt flag.
bsf INTCON,GIE ;Enable global interrupts.
return
;*********************Main********************************************
; Start of main program
main_code code
Main
call init
Loop
nop
nop
goto Loop
;******************************************************************************
;End of program
END
ok,nu börjar vi snacka samma språk sodjan.
Nu börjar få svar på mina frågor.
vad andvänder du etiketterna ISR_code, ISR_VEC, reset_vec till. Van häder om du tar bort dessa. det är det enda jag inte förstår. sedan står det code och inget efter bara tomrum. Jag antar att det finns något sammband i mellan tex ISR_VEC och ISR_code code- men vad är det i sådana fall.
vad andvänder du etiketterna ISR_code, ISR_VEC, reset_vec till. Van häder om du tar bort dessa. det är det enda jag inte förstår. sedan står det code och inget efter bara tomrum. Jag antar att det finns något sammband i mellan tex ISR_VEC och ISR_code code- men vad är det i sådana fall.
> Nu börjar få svar på mina frågor.
Jo, det hjälper att tänka till lite innan man frågar, eller hur ?
> vad andvänder du etiketterna ISR_code, ISR_VEC, reset_vec till.
Det är bara för att lätt hitta kodsektionerna i MAP filen.
De "används" inte till någonting i själva koden. Och de
kan i princip heta vad som helst.
> Van häder om du tar bort dessa.
MPASM skapar egna namn som inte är lika tydliga.
> sedan står det code och inget efter bara tomrum.
Det som skulle kunna stå där är en adress, men det är
bättre att överlämna till länkaren (MPLINK). Hela finnesen
med "relocatabel code" är ju att så långt som möjligt undvika
att ange "hårda" adresser i koden. Reset och interrupt vektorerna
är ett undantag, de måste ju ligga på fasta adresser.
> Jag antar att det finns något sammband i mellan tex ISR_VEC
> och ISR_code code- men vad är det i sådana fall.
Inte mer är att båda har med interrupt att göra. Vad menar du med "samband" ?
ISR_VEC är namnet på det kodsegment där interrupt vektorn ligger.
ISR_CODE är namnet på det kodsegment där resten av interrupt koden ligger.
Båda namnen är bara tagna "ur luften", de kan heta vad som helst och
behöver t.ex inte alls börja med just "ISR...", det vara bara jag som tyckte
att det blev tydligt så...
Jo, det hjälper att tänka till lite innan man frågar, eller hur ?

> vad andvänder du etiketterna ISR_code, ISR_VEC, reset_vec till.
Det är bara för att lätt hitta kodsektionerna i MAP filen.
De "används" inte till någonting i själva koden. Och de
kan i princip heta vad som helst.
> Van häder om du tar bort dessa.
MPASM skapar egna namn som inte är lika tydliga.
> sedan står det code och inget efter bara tomrum.
Det som skulle kunna stå där är en adress, men det är
bättre att överlämna till länkaren (MPLINK). Hela finnesen
med "relocatabel code" är ju att så långt som möjligt undvika
att ange "hårda" adresser i koden. Reset och interrupt vektorerna
är ett undantag, de måste ju ligga på fasta adresser.
> Jag antar att det finns något sammband i mellan tex ISR_VEC
> och ISR_code code- men vad är det i sådana fall.
Inte mer är att båda har med interrupt att göra. Vad menar du med "samband" ?
ISR_VEC är namnet på det kodsegment där interrupt vektorn ligger.
ISR_CODE är namnet på det kodsegment där resten av interrupt koden ligger.
Båda namnen är bara tagna "ur luften", de kan heta vad som helst och
behöver t.ex inte alls börja med just "ISR...", det vara bara jag som tyckte
att det blev tydligt så...
relocatabel code kodning
Ursäkta men är inte insatt i hur man programmerar det riktigt. Finns det något bra ställa och läsa om det eller kan du förklara lite mera om det om det går bra för dig.
Jag tog bort etiketterna i koden och då fick jag felet
Error[154] E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 32 : Each object file section must be contiguous (section .code)
Som jag fattade på dig så har dom inget med koden att göra.ok kan beskriva lite mer hur map filen fungerar. eller ja kanske blir för mycket för min del .jag vill bara lära mig tanken och stukturuppläget bakom relocatabel code kodningen. Ungefär som när du började med if och else. Hur man bygger upp och tänker för att sedan kunna bygga något själv av det.
Jag tog bort etiketterna i koden och då fick jag felet
Error[154] E:\MICROCHIP\PROJECT MICROPIC\PWM\F452TMPO.ASM 32 : Each object file section must be contiguous (section .code)
Som jag fattade på dig så har dom inget med koden att göra.ok kan beskriva lite mer hur map filen fungerar. eller ja kanske blir för mycket för min del .jag vill bara lära mig tanken och stukturuppläget bakom relocatabel code kodningen. Ungefär som när du började med if och else. Hur man bygger upp och tänker för att sedan kunna bygga något själv av det.
> Finns det något bra ställa och läsa
MPASM/MPLINK Manualen från Microchip.
> Jag tog bort etiketterna i koden och då fick jag felet
OK, ta inte bort dom då. Jag hade fel och det framgår av
MPASM/MPLINK manualen varför. Kolla där (i avsnittet om CODE).
> Som jag fattade på dig så har dom inget med koden att göra.
Nja, vad jag menade är att de inte används som "target" för en GOTO
eller liknande. Namn måste CODE segmenten ha i alla fall.
Undantaget är när man enbart har ett CODE segment i en och samma
ASM fil, då kan default namnet ".code" fungera, men det är inte snyggt...
> kan beskriva lite mer hur map filen fungerar
Fungerar och fungerar, den beskriver hur koden och variabler
har allokerats i minnet i PIC'en. Vad den innhåller beskrivs
i MPASM/MPLINK manualen (förvånad ?
).
> jag vill bara lära mig tanken och stukturuppläget bakom relocatabel
> code kodningen. Ungefär som när du började med if och else. Hur
> man bygger upp och tänker för att sedan kunna bygga något själv av det.
Normalt tar man väll något befintligt och bygger vidare från det.
Mycket trial-n-error, men så är det.
Det är bara att hoppa i och simma som f-n...
Här i forumet passar det nog bäst med konkreta frågor på någon
speciellt detalj, inte svepande utläggningar av generell karaktär.
Så sätt i gång och återkom när du kör fast !
MPASM/MPLINK Manualen från Microchip.
> Jag tog bort etiketterna i koden och då fick jag felet
OK, ta inte bort dom då. Jag hade fel och det framgår av
MPASM/MPLINK manualen varför. Kolla där (i avsnittet om CODE).
> Som jag fattade på dig så har dom inget med koden att göra.
Nja, vad jag menade är att de inte används som "target" för en GOTO
eller liknande. Namn måste CODE segmenten ha i alla fall.
Undantaget är när man enbart har ett CODE segment i en och samma
ASM fil, då kan default namnet ".code" fungera, men det är inte snyggt...
> kan beskriva lite mer hur map filen fungerar
Fungerar och fungerar, den beskriver hur koden och variabler
har allokerats i minnet i PIC'en. Vad den innhåller beskrivs
i MPASM/MPLINK manualen (förvånad ?

> jag vill bara lära mig tanken och stukturuppläget bakom relocatabel
> code kodningen. Ungefär som när du började med if och else. Hur
> man bygger upp och tänker för att sedan kunna bygga något själv av det.
Normalt tar man väll något befintligt och bygger vidare från det.
Mycket trial-n-error, men så är det.
Det är bara att hoppa i och simma som f-n...

Här i forumet passar det nog bäst med konkreta frågor på någon
speciellt detalj, inte svepande utläggningar av generell karaktär.
Så sätt i gång och återkom när du kör fast !
> jag vill bara lära mig tanken och stukturuppläget bakom
> relocatabel code kodningen.
Principen bakom relocatable code (relokerbar kod) är att linkern (har jag för mig) skall kunna placera in koden på lämpligt ledigt ställe i minnet när du länkar ihop flera fristående kodsnuttar.
Låt säga att du bestämt att utveckla 5 projekt med processor X. I alla projekten kommer du att använda seriell sändning och mottagning via RS232. Då skriver du en fristående grupp funktioner för att skicka och ta emot data via RS232 i en source fil som du tänkt använda till alla dina 5 projekt.
Istället för att kopiera och klistra in koden i alla dina 5 projekts källkodsfiler så ser du till att den är relocatable och sedan kompilerar du den separat för att senare länka ihop den med var och ett av dina övriga projekt.
Iomed att den är relokerbar så behöver du inte bekymmra dig om att den kan skriva över annan kod som du skrivit för var och ett av projekten, linkern ser till att koden hamnar i fritt minne och att dina anrop "konverteras" till rätt address.
Om du upptäcker en bugg i dina rutiner för RS232 och rättar till dom i koden, så behöver du (om du inte ändrar funktionsnamn och så) bara kompilera om RS232 koden och sedan länka om den med din ordinarie kod. Du behöver inte sitta och ändra källkod i alla 5 projekt, enbart länka om dom.
Med andra ord, om du bara gör ett smärre projekt och håller dig till en källkodsfil, så är det inte nödvändigt att skriva relokerbar kod. Om du däremot tänker lägga upp egna bibliotek med funktioner för t.ex A/D omvandling, mattefunktioner, sändning/mottagning, m.m. eller om du vill splitta upp en lååång källkodsfil för bättre översikt av ditt projekt, så är det smidigt att använda.
mvh Mats
> relocatabel code kodningen.
Principen bakom relocatable code (relokerbar kod) är att linkern (har jag för mig) skall kunna placera in koden på lämpligt ledigt ställe i minnet när du länkar ihop flera fristående kodsnuttar.
Låt säga att du bestämt att utveckla 5 projekt med processor X. I alla projekten kommer du att använda seriell sändning och mottagning via RS232. Då skriver du en fristående grupp funktioner för att skicka och ta emot data via RS232 i en source fil som du tänkt använda till alla dina 5 projekt.
Istället för att kopiera och klistra in koden i alla dina 5 projekts källkodsfiler så ser du till att den är relocatable och sedan kompilerar du den separat för att senare länka ihop den med var och ett av dina övriga projekt.
Iomed att den är relokerbar så behöver du inte bekymmra dig om att den kan skriva över annan kod som du skrivit för var och ett av projekten, linkern ser till att koden hamnar i fritt minne och att dina anrop "konverteras" till rätt address.
Om du upptäcker en bugg i dina rutiner för RS232 och rättar till dom i koden, så behöver du (om du inte ändrar funktionsnamn och så) bara kompilera om RS232 koden och sedan länka om den med din ordinarie kod. Du behöver inte sitta och ändra källkod i alla 5 projekt, enbart länka om dom.
Med andra ord, om du bara gör ett smärre projekt och håller dig till en källkodsfil, så är det inte nödvändigt att skriva relokerbar kod. Om du däremot tänker lägga upp egna bibliotek med funktioner för t.ex A/D omvandling, mattefunktioner, sändning/mottagning, m.m. eller om du vill splitta upp en lååång källkodsfil för bättre översikt av ditt projekt, så är det smidigt att använda.
mvh Mats