Interuppt
Interuppt
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
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
> 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 !!??
"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 !!??
Forts följer
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
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
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.
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.
varför jag andvänder interrupt
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å.
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å.
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...
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...
Tackar på förhand.
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
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
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. :
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
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å.
Översätt "tvärt" till millisekunder eller mikrosekunder, så har vi något att gå på.
svar sodjan
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
sedan stanna tvärt =1 ms typ
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.
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.