Interrupts

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Interrupts

Inlägg 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!
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg 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å?
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg 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!
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg 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
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg 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.
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg av unzuf »

Ahaaa! Fan vad dum man är ibland! :D
Tack så mycket EagleSpirit och cyr!
Användarvisningsbild
Schnegelwerfer
Inlägg: 1863
Blev medlem: 8 november 2004, 13:46:56

Inlägg 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.
Skriv svar