Interuppt

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

Interuppt

Inlägg av Markus »

skulle vilja lära mig interrupt. Har kollat databladet men känns även där att jag behöver lite förkunskaper. Någon som vet något bra ställa att läsa om det.boker eller något anat bra littratur. Det jag skulle vilja ha är tre ingångar på en pic krets. När nogon av dessa ingångar blir höga så gör processorn en interrupt och hoppar till en subrutin och sedan när den är klar sågår den tillbaka. en egen subrutin som är olika varandra för varje av dessa tre ben på Ingången på processorn. Hur gör jag detta. Kollade i och där fanns det inga exempel bra en massa bitar och en header fil som man var tvungen att includera. *.inc. men den är ju redan inkluderad via kommandot #include <P18F452.INC> i *.asm filen.


Mina frågor är följande.

Skulle vilja ha någon bra littratur att läsa om detta.

andra frågan

Är ionte header filen inkluderad när det står kommandot #include <P18F452.INC> i *.asm filen

någon som kan visa mig ett exempel på en tre external ingångar på processorn som ger ett varit enskilt interrupt. Och bryts när ett annat interuppt kommer in. alltså interrupten ska kunna bryta varandra. Interrupt INT1,INT2,INT3.

Om interuppt INT1 kört kan det brytas av interrupt INT2,INT3

Om interuppt INT2 kört kan det brytas av interrupt INT1,INT3
Om interuppt INT3 kört kan det brytas av interrupt INT2,INT1
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det jag skulle vilja ha är tre ingångar på en pic krets. När nogon av dessa ingångar blir höga så gör processorn en interrupt

"PORTB Interrupt-on-Change". Databladet kap 8.8 sid 85.
Ben RB4 - RB7 kan användas för detta.

> hoppar till en subrutin

"Interrupt Service Routine", eller ISR kort.

> en egen subrutin som är olika varandra för varje av dessa tre ben på Ingången på processorn.

I din ISR får du kolla vilket ben av RB4 - RB7 som orsakade avbrottet, och sedan köra lämplig kod för respektive funktion (GOTO eller CALL eller hur du vill strukturera det hela).

> Skulle vilja ha någon bra littratur att läsa om detta.

Databladet, kap 8.x sid 77-85.

> Är ionte header filen inkluderad när det står kommandot #include <P18F452.INC> i *.asm filen

Jo. Jag förstår inte problemet ?

> alltså interrupten ska kunna bryta varandra.

Varför det ? Beskriv vad du vill uppnå.
Hur ofta kommer interrupten på de tre pinnarna ?
Hur snabbt måste ISRen svara på interrupten ?

> Om interuppt INT1 kört kan det brytas av interrupt INT2,INT3

Om INT1 är "kört", så kan det väll inte (av-) brytas !!??
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

Forts följer

Inlägg av Markus »

I grova drag så ska konstruktionen se ut så här att A1-A3 är externa interrupt signaler .Sedan har du utsignalen PWM till mitt servo. Om det blir en interrupt på A1 så börjar programmet att ge ut en pulsbred(PWM-utsignal) på 2mS som sedan minskar segvis ner till ett viss värde. Om det blir ett interrupt på A2 så bryter programmet tvärt och fortsätter med Interrupt subrutinen för A2. När interrupt sker i A2 så ska PWM-Signalen behålla tidigaste värdet på Pulsbreden. I denna subrutin ska inte pulsbreden öka eller minska bara behålla värdet. Om A3 skapar interrupt så kommer den att utgå från pulsbredden tidigare värde och öka till ett vis värde på pulsbredden.

Denna konstruktion sitter i hopp med en annan picprocessor som skapar dessa signaler till A1-A3 om ni undrar vad som ska skicka signalerna till denna . Enda denna krets ska göra är att skicka ut rätt PWM signal som ska skicka vidare till ett servo.




Så då vill jag att interrupt fungera så att A1 interrupt subrutinen kan brytas via Signal på A2 och A3
Så då vill jag att interrupt fungera så att A2 interrupt subrutinen kan brytas via Signal på A1 och A3
Så då vill jag att interrupt fungera så att A3 interrupt subrutinen kan brytas via Signal på A2 och A1

Så med andra ord så fort programmet i cpu(pic18f452) kör en interrupt subrutin A1 och det kommer en signal på A2 så vill jag att A1 Subrutinen avslutas och subrutinen A2 börjar.



Detta är kravspec jag har. Nu behöver jag hjälp och lite exempel hur jag ska gå till väga i mitt program. Denna konstruktion skulle fixa mitt problem med RC servot.Fråga inte varför. Min fråga är går det att bygga något sådant program. Vilken bok skulle ni rekommendera att börja läsa i angående interrupt i. Jag har läst data bladet men fattat inte direkt hur jag ska använda informationen. Finns inga exempel. Har byggt enklare konstruktionen förut så det är inte första gången jag programmerar, men med interrupt är jag inte så hemma. Men vill lära mig så att jag kan ska denna funktion. Jag vill lära mig interrupt andvändandet i pic:en.
Om någon kunde visa mig ett exempel hur man skulle programmera så skulle det också hjälpa
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag förstår inte vad du ska med interrupt till, frågan om hur fort du vill att responsen ska vara kvarstår och jag kan av din beskrivning förstå att det inte alls behövs interrupt till detta!

Det räcker fint med en pollning av status på portpinnerna och lite programmering eller är dina styrpulser (A1-A3) så korta att det inte går?

Så som begärd förut:
Lite tekniska data, pulstider, responstid osv.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

Inlägg av Markus »

respontider och pulstider är kraven inte så höga på. Går det rent programmeringsmässsigt att skapa något sådant.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

varför jag andvänder interrupt

Inlägg av Markus »

det är för att slippa läsa av ingångarna och göra interrupt subrutinen direkt när någon av a1-a3 aktivera. Varföra jag ska ha detta är flör att det löser problemet jag har från tigare konstruktion. Jag vill lösa detta med int ingångar. Enda jag vill ha hjälp med är hur man skapar ett sådant program som hoppar till olika subrutiner beroende på vilekn av interrupt ingångarna som blir höga.
Jag vill bara lära mig hur man andvänder interrupt också. Visa mig ett exempel så kanske jag får en uppfattning hur du skapar external interrupter.

Koden ska vara helst på lågnivå.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Varje interrupt rutin skall vara mycket kort och igentligen bara sätta någon flagga som talar om för huvudkoden vilket "läge" det hela befinner sig i. Alltså "Ner", "Upp" eller "Stopp".

Sedan är det huvudkodens ansvar att manipulera PWM/ervo signalen på rätt sätt utifrån aktuellt "drift-läge", eller vad man skall kalla det.

Den ändra som interrupten A1-A3 är att sätta någon flagga.

Det är helt OK att använda interrupt för A1-A3, antagligen enklast så. Men det du har lite fel i är att processorn skulle ligga kvar i ISR'en någon längre tid.

Jag får se vad jag har tid med i kväll...
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

Tackar på förhand.

Inlägg av Markus »

enda jag vill ha är att ni kan visa på ett exempel hur man kan programmera för att utnytja external int signaler på processorn. få se struturen och få en förstårlse hur man bygger up. Edna jag vill
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

En saxning från ett PIC16F873-projekt med interrupt-exempel

Kod: Markera allt

;*************************** Here the program goes *****************************
	org	h'000'		; Processor reset vector
Reset
	nop
	clrf	PCLATH		; Ensure page bits are cleared
	goto	Initiate
;-------------------------- Interrupt Service Rutine ---------------------------
	org	h'004'
	movwf	Temp_W		; save off current W register contents
	movf	STATUS,w	; move status register into W register
	movwf	Temp_Status	; save off contents of STATUS register
	movf	PCLATH,w
	movwf	Temp_Pclath
	movf	FSR,w
	movwf	Temp_FSR
Timer_ISR
	btfss	PIR1,TMR2IF
	goto	Rx_ISR
	bcf	PIR1,TMR2IF
        ... ; Do my stuff for the timer interrupt
Rx_ISR
	btfss	PIR1,RCIF	; Test if Recieve flag
	goto	End_ISR		; Jump if not
	bcf	PIR1,RCIF	; Clear Recieved flag
	movf	RCREG,w		; Get recieved value
	movwf	Recieved	; Save for later use
        ... ; do my stuff for serial RX interrupt
End_ISR
	; Restore task switching
	movf	Temp_FSR,w
	movwf	FSR
	movf	Temp_Pclath,w
	movwf	PCLATH
	movf	Temp_Status,w	; Retrieve copy of STATUS register
	movwf	STATUS		; Restore pre-isr STATUS register contents
	swapf	Temp_W,f
	swapf	Temp_W,w	; Restore pre-isr W register contents
	retfie
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Notera att PIC18 har automatisk context-saving (om man kör med en interrupt prio nivå, vilken man antagligen gör...), så ca halva koden behövs inte. Det är också en annan adress för interruptvektorn, så klart.

En snabb skiss av än tänkbar struktur (jag vet inte vad du menar med att koden helst skall vara på "lågnivå"...), det behöver sedan fyllas i med "riktiga" instruktioner. Exakt hur de olika delarna (timers m.m.) skall ställas in beror lite på hur det hela ska fungera, t.ex hur snabbt servot skall röra sig. :

Kod: Markera allt

;***************************
      code h'0000'
      goto main_start

;***************************
isr   code h'0008'

      om A1
         state = state_down

      om A2
         state = state_stopp

      om A3
         state = state_up

      om pwm_timer_overflow
         (hantera pwm utgången)

      om down_up_timer_overflow
         om state = state_down
            minska pulslängd
         om state = state_up
            öka pulslängd
         om state = state_down
            gör ingenting...

      (återställ interrupt flaggor och gör retfie...)

;***************************
main  code

main_start
      call init

loop
      goto loop      

;***************************
init  code

init
      init av portar m.m.
      init av interrupt
      init av timer för pwm
      init av timer för down/up     
      init av övrigt delar (om några)...
      return
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det är fortfrande oklart vilka krav du ställer, t.ex hur snabbt servot skall stanna efter A2 signalen. Det enda jag hittar är att du säger att när A2 inträffar så "bryter programmet tvärt". Jag har inte en aning om vad du menar med "tvärt" !!??

Översätt "tvärt" till millisekunder eller mikrosekunder, så har vi något att gå på.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

svar sodjan

Inlägg av Markus »

Tack så mycket för hjälpen. det jag menar är om du kan skriva strukturen i assembler kod, som tex icecap har gjort.


sedan stanna tvärt =1 ms typ
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag får se om jag kan göra ett ASM exempel senare...

Eller ta Icecaps kod och porta den till PIC18 ! Trevlig övning :-)

För övrigt, 1 ms är ju knappast "tvärt" ! :-)
Din processor hinner köra ca 5.000 instruktioner vid 40 Mhz på den tiden...
Du kommer att få en svarstid på ca 10-50 us utan speciell trimmning eller trixande. Det beror lite på när interruptet inträffar, om processorn redan servar ett tidigare interrupt (t.ex från en timer), så måste det köras klart först.
Skriv svar