Sida 3 av 3

Postat: 5 juni 2006, 07:22:10
av thepirateboy
Hittade en film om interrupt häromdan, kanske roligare än databladet. Filmen visar AVR men principen är densamma http://www.tfe.umu.se/courses/uwasa/BTH/avbrott.html

Timers:

http://www.tfe.umu.se/courses/uwasa/BTH/timers.html

Postat: 5 juni 2006, 10:23:47
av sodjan
Ang IE/IF :

> Ja, nu fattade jag det när jag såg den förklaringen.

Nu förstår jag ingenting.

Att T0IE = "TMR0 Interrupt Enable bit" och att
T0IF = "TMR0 Interrupt Flag bit", står ju på sidan 24 (INTCON beskrivningen).

Det måste väl vara något annat än bara *det* som var oklart !?
T.ex hur de fungerar tillsammans eller något sådant...

> Exakt vad är det man loopar då man bara låter det finnas en end.?
> Är det hela koden då eller?

"end." i mikroBasic lägger till en "endless loop" i koden. Enklast är
att kolla assembler listan från kompilatorn så ser man hur det ser ut.
Det är *inte* hela koden som körs om, utan programmet "fastnar" på
"end.", så att säga...

Min synpunkt var att det blir lite tydligare att det inte är ett misstag
att koden hamnar på "end." om man själv lägger till till en loop på slutet.

> Detta gjorde jag för jag följde bara icecapskod vilken jag
> eventuellt missuppfattade.

Tja, vem vet. Koden saknar helt kommentarer så det är omöjligt att veta
vad du tänkte eller uppfattade.

> Så är det ockås viktigt att man lägger in kommentarer för att man
> skall fatta vad man har kodat då man skall felsöka eller ändra i koden.

Jo, men i det här fallet är kommenterarena inte avsedda för *dig*, utan
för att *vi* ska förstå hur du har tänkt...

> Var "hoppar" main till interupten i min kod?

Main "hoppar" aldrig till interruptet. Ett enterrupt är just det, ett "avbrott"
som sker asynkront och (i princip) när som helst (från main's synvinkel).

Postat: 5 juni 2006, 12:07:53
av Icecap
Interrupt kommer från hårdvaran.

På svenska kallas det "avbrott" och det är just vad det gör: stoppar det ordinarie programflöde, sparar undan viktiga registre, kör ISR'n, återställar registerna och kör vidare i det ordinarie program.

ISR'n ska alltså uppfattas som ett eget program som kör utan att resten av programmet "vet om" det. Detta medför t.ex. att kommunikationen mellan "de två programmen" måsta kluras ut ordentligt så att det inte blir idiotisk.

Om en 16-bitars variabel ska ändras kan det vara nödvändigt att stoppa alla interrupt precis innan man sparar den och direkt därefter slå på dom igen, detta för att hindra att interrupten kommer när första byten är sparat men inte andra, detta kan ge intressanta effekter.

Av samma anledning är det inte bra om "båda program" skrivar till samma variabler, jag har nära nog alltid det så att "ena programmet" bara läser vad det "andra program" har skrivit, visst har det hänt att båda ISR och main-program ändrar men det är sällsynt.

Postat: 7 juni 2006, 01:19:35
av Kaggen
Tänk dig att frugan sagt åt dig: "Jag ska ut med tjejerna en sväng, jag har nattat ungarna så du får tvätta (normal main exekvering) och se till att ungarna fortsätter att sova (ungarna vaknar = interrupt). Jag har gjort en lista hur du tvättar (Main program) och en hur du ser till att ungarna somnar ifall de skulle vakna (ISR Interrupt Service Routine)".

"Ok!" säger du glatt. Frugan går iväg och du greppar tvättlistan (Main programmet) och går med tvätten till tvättstugan. Du har precis hällt i lagom dos tvättmedel då du hör du ungarna börjar stoja i sovrummet (trigger interrupt). Du får med andra ord göra ett "avbrott" (interrupt) från tvättandet. Du kommer ihåg ungefär vad du höll på med på "tvätt-listan" (main). En microprocessor spar positionen på listan vad den sist höll på med (PC = Program Counter) på stacken.

Du får nu läsa från "natta ungar"-listan (ISR Interrupt Service Rutinen). Du börjar med ljuv stämma sjunga "bä bä vita lamm" enligt din frus ISR lista, tills ungarna somnar. Perfa! Nu kan du fortsätta med (Main) tvätten.

Du hoppar ur "interrupten" och tar vid där du avslutade i tvättstugan. En micro hämtar efter en reti (eller vad just din processor har för returnera efter interrupt instruktion) den gamla PC:n (Program Countern) från stacken och fortsätter efter den position den sist exekverade. Få se, du hade hällt i tvättmedel, dags att slänga i tvätten. Just ja, sedan står det sköljmedel på frugans lapp. Nä nu, ungarna börjar stoja igen (trigger interrupt). Dags för ett nytt avbrott. Iomed att du har dåligt minne ringar du in den punkt du höll på med på frugans tvätt-lista (sparar PC på stacken).

Du springer in till ungarna igen och läser från "natta ungarna"-listan (ISR).

o.s.v. o.s.v.

Postat: 7 juni 2006, 06:39:52
av EagleSpirit
Om barnen vaknar hela tiden har du glömt att resetta T0IF eller GIE... Väldigt bra beskrivning Kaggen... om man inte förstår det där ska man kanske inte hålla på med µC :D

Postat: 8 juni 2006, 00:44:02
av Kalf
Jag som trodde jag kunde interupt när jag såg thepirateboy's filmer och läst databladet en gång till. Men Nu kan det inte bli så mycket tydligare. Men jag har inte testat och koda något nu för jag har inte tid denna veckan då jag jobbar kväll, men i hälgen så skall vi se hurvida jag kan detta eller ej.

Tack för all hjälp så här långt. ;-)