interrupt med roliga fel

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

interrupt med roliga fel

Inlägg av Markus »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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 :

Kod: Markera allt

;********Reset_start****************
;Reset and interrupt vector

        CODE  h'0000'
        goto Main

        CODE  h'0008'
        goto ISR

;************************************** 
Sedan något i stil med (taget ur huvudet, *ej* debuggat !) :

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
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.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

interrupt forts

Inlägg av Markus »

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.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

fungerar inte

Inlägg av Markus »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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 !
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Lägg de olika delarna av koden i rätt positioner.
Se mitt exempel.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

nej du sodjan

Inlägg av Markus »

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?
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

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...
Senast redigerad av JimmyAndersson 29 december 2005, 16:06:58, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag ska ta din kod och se till att den får en "clean build" i MPASM,
skall bara äta middag först !



Återkommer...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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.

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
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

ok,nu börjar vi snacka samma språk sodjan.

Inlägg av Markus »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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å...
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

relocatabel code kodning

Inlägg av Markus »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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 !
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

> 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
Skriv svar