Sida 1 av 1

Interrupts

Postat: 14 april 2005, 21:42:32
av unzuf
hej hej.. provar lite med å programmera en PIC16F628 med
mikroPascal och undrar lite över interrupts.

Just nu har jag gjort så att toner spelas på en liten löjlig
högtalare (sådan som sitter i datorn), men jag vill ha en
knapp som avbryter det hela. Knappens signal ignoneras
när ljudet spelas ända tills ljudet spelats klart (då är det
försent med att avbryta :D )..

Jag förstår mig inte riktigt på detta.. jaja, här är koden till
ett interrupt-exempel som följde med mikroPascal:

Kod: Markera allt

//******************************************************************************
// microcontroller : P16F628
//
// Project: Tmr0
// This project is designed to work with PIC 16F628;
// with minor adjustments, it should work with any other PIC MCU.
//
// This code demonstrates using interrupts in mikroPascal.
// Program turns on/off leds on portb each second.
//******************************************************************************
program Tmr0;

var brojac, a, b : byte;

procedure interrupt;
begin
   brojac := brojac + 1;   // increment value of brojac on every interrupt
   TMR0   := 96;
   INTCON := $20;          // set T0IE, claer T0IF
end;

begin
  a := 0;
  b := 1;
  OPTION_REG := $84;       // assign prescaler to TMR0
  trisb  :=   0;           // designate portb as output
  portb  := $FF;           // initialize portb
  brojac :=   0;           // initialize brojac
  TMR0   :=  96;
  INTCON := $A0;           // enable TMRO interrupt

  repeat
    begin
      if brojac = 200 then // if brojac is 200, then toggle portb leds and reset brojac
         begin
           portb  := not(portb);
           brojac := 0;
         end;
      end;
  until 0 = 1;
end.
Vad har denna kod med interrupts att göra..? :S

tack för mig!

Postat: 14 april 2005, 22:00:33
av EagleSpirit
När TMR0 kommit till 0, alltså från 96 enligt "TMR0 := 96" så skapas ett interrupt och går till "procedure interrupt;"... dvs varje gång TMR0 räknat 96ggr så går den till rutinen begin och startar om timern och samtidigt ökar brojac med ett... när brojac = 200 så ändrar utgången status..

går det att förstå?

Postat: 14 april 2005, 22:12:33
av unzuf
Tack, det var bra beskrivet! Men det gör mig inte
ett dugg klokare vad gäller att använda en knapp..
Det finns en funktion för att kolla en knapp's status:

Kod: Markera allt

if button(PORTA,0,1,1) = 1 then KNAPP_NEDTRYCKT;
Hur ska jag då göra för att proceduren "interrupt" ska
köras när knappen är nedtryckt..? För jag menar, den ska
ju kunna reagera på knappen fast MCU'n sysslar med nåt
helt annat, t.ex inne i en loop m.m..

tack!

Postat: 14 april 2005, 22:30:28
av EagleSpirit
då måste du läsa databladet för PICen du använder... du måste aktivera intteruptfunktionen för just ändring på en port... det finns begränsat med såna i en PIC och de vanligaste brukar vara:

RB0 interrupt
RB1 interrupt

och RB4-RB7 interrupt on change

dvs, RB0 och RB1 kan du känna av enskilt på en gång medan vid RB4-RB7 så måste du testa vilken av dom blivit aktiverad.

att ställa in dessa interrupts gör du i INTCON registret... det står i databladet hur det ska ställas in.. kom ihåg att dessutom göra RB0 till ingång

Postat: 14 april 2005, 22:31:55
av cyr
Det finns ett visst antal interrupt-källor i processorn, och de är det enda som kan skapa ett interrupt.

T.ex. finns det ett par timers, man kan få interrupt när man skickat klart en byte med UARTen osv.

För knappar så duger det nog bra att köra med en timer, och helt enkelt kolla om någon knapp är nedtryckt varje gång timer-interruptet körs. Det räcker bra om man den körs 100 ggr/s eller nåt.

Alltså, lägg in "if button(.." i själva interrupt-proceduren, så kommer den kollen att köras med jämna mellanrum även om processorn gör något annat.

Postat: 14 april 2005, 22:50:29
av unzuf
Ahaaa! Fan vad dum man är ibland! :D
Tack så mycket EagleSpirit och cyr!

Postat: 15 april 2005, 10:54:10
av Schnegelwerfer
Eller så kopplar man in knappen direkt in på en interrupt-ingång på uC:n, och gör en interrupt-rutin som startar när knappen aktiveras.