1.3.12 Avbrudd og tidsmåler MCS51

Ved datastyring av ulike systemer vil avbrudd (eng, Interrupt) og bruk av tidsfunksjoner og forsinkelser (eng. Timer) være nyttig og nødvendig. Disse mekanismene finner vi innebygget i en mikrokontroller.

Avbrudd aktiveres på bestemte betingelser. Da kjøres programmet inn i en avbruddsrutine for deretter å vende tilbake til hovedprogrammet. Det opereres med software-avbrudd og hardware-avbrudd. Ved software-avbrudd aktiveres avbruddet ved en spesiell instruksjon. Ved hardwareavbrudd kan det være spenningsnivået inn på en spesiell fysisk inngang/port som genererer avbruddet. Inngangen kan eksempelvis være koblet til et alarmsignal i systemet. Når det utløses en alarm, hopper programmet til avbruddsrutinen og utfører instruksjonene der. Dette kan eksempelvis være utføring av visse sikkerhetsprosedyrer i systemet som stopp av motorer og pumper, stengning av ventiler etc. hvis vi eksempelvis tenker oss at mikrokontrolleren inngår i styringen av en vaskemaskin.

Når mikrokontrollere benyttes til styring av elektromekanisk utstyr, vil det være nødvendig med tidsforsinkelser. Elektromekaniske komponenter som releer og motorer er svært trege å operere sammenlignet med hastigheten til mikrokontrolleren.

Avbrudd (interrupt)

  • Avbrudd fører til at selve hovedprosessen avbrytes, og programmet starter en avbruddsrutine.

  • Noen mikrokontrollere skiller mellom eksternt og internt avbrudd (interrupt).

  • Eksternt avbrudd

    • Starter når et fysisk signal registreres på en på forhånd definert port (inngang).

  • Internt avbrudd (eller bare avbrudd)

    • Starter ved at et bestemt bit (enable bit) settes, enten ved en instruksjon eller at timer er utløpt.

  • For kontroll av avbruddrutiner er det to registre:

    • IE (Interrupt Enable)

    • IP (Interrupt Priority)

  • Etter at avbruddsrutinen er kjørt, hopper prosessoren tilbake til hovedprogrammet.

  • I styringselektronikk kan det eksempelvis være aktuelt å benytte eksternt avbrudd når det utløses en alarm i systemet.

IE-registeret (interrupt enable)

EA  Deaktiverer alle interrupt

X  reserve 

ES  Aktiverer/deaktiver interrupt via seriellport

ET1  Aktiverer/deaktiver Timer 1 overflow interrupt

EX1  Aktiverer/deaktiver eksternt interrupt 1

ET0  Aktiverer/deaktiver Timer 0 overflow interrupt

EX0  Aktiverer/deaktiver eksternt interrupt 0

IP-registeret (interrupt priority)

X  Reserve 

PS  Definerer interrupt via seriellport-prioritetsnivå

PT1  Definerer Timer 1 overflow interrupt-prioritetsnivå

PX1  Definerer eksternt interrupt 1-prioritetsnivå

PT0  Definerer Timer 0 overflow interrupt-prioritetsnivå

PX0  Definerer eksternt interrupt 0-prioritetsnivå

Tidsforsinkelser og tellere

  • Spesielt aktuelt når mikrokontrolleren skal benyttes til styring av elektromekaniske operasjoner.

  • De fleste mikrokontrollere har disse funksjonene (timer/counter) innebygd.

  • Dersom funksjonen benyttes til tidsmåler, kan den ikke samtidig brukes til teller og omvendt.

  • Noen av SFR-registrene aktiverer og kontrollerer disse funksjonene.

  • For MCS51 er disse:

    • TCON

    • TMOD

    • TL

    • TH

  • Fordelen med bruk av innebygde tidsfunksjoner (timer) og tellere er at vi ikke trenger å utarbeide et eget program som utfører disse, men kun sørge for å skrive instruksjonene som kontrollerer disse funksjonene.

TCON-registeret (Timer/counter control)

TF1   Settes når timer/counter er utløpt for Timer/Counter 1.

TR1   Settes/nullstilles av programvare når Timer/Counter 1 slås av/på.

TF0   Samme som TF1 for Timer/Counter 0.

TR0   Samme som TR1 for Timer/Counter 0.

IE1   Flankeflagg for eksternt avbrudd for Timer 1.

          Settes når flanke på eksternt avbruddssignal detekteres.

IT1   Flagg for internt avbrudd for Timer 1. Settes av programvare.

IE0   Samme som IE1 for Timer 0.

IT0   Samme som IT1 for Timer 1.

TMOD-registeret (Timer/counter mode control)

TL og TH

  • I disse registrene settes tiden for tidsforsinkelsen (avhengig av tallverdi og klokkehastigheten til prosessoren).

  • Tidsmålerne virker som en nedteller som teller ned til null fra angitt tallverdi.

  • Hastigheten som tellerne teller ned med, er én telling for hver maskinsyklus. (En maskinsyklus er lik 1/12 av mikrokontrollerens klokkefrekvens.)

Aktivering av timer, eksempel

  • Setter vi TH lik 5A og TL lik 00 i timer 0, vil telleren telle ned 5A00 heksadesimale ganger (23 040 desimalt). Setting av registrene gjøres ved hjelp av operasjonskoden MOV:

  MOV TH,#5AH og MOV TL,#00H

  • Dersom mikrokontrolleren tilføres en klokkehastighet på 12 MHz, vil telleren telle ned med en hastighet som er 1/12 av denne, altså 1 MHz, som innebærer at det er 1μs mellom hver tellepuls.

  • Tidsforsinkelsen T blir: T = 1μs · 23 040 = 23,040 ms

  • Start av timer 0 gjøres ved å sette TR0-biten i TCON-registeret på denne måten:

  SETB TR0 eller SETB TCON.4

  • Samtidig må vi sørge for at bit 2 i TMOD-registeret er lavt, slik at timer 0 fungerer som timer og ikke som teller. Skal timer slås av, benyttes tilsvarende:

  CLR TR0 eller CLR TCON.4

  • Vi kontrollerer om timer har gått ut (telt ned til null) ved regelmessig å kontrollere om TF-biten i TCON-registeret har gått høyt. Dette gjøres ved hjelp av betinget hopp i programmet på denne måten:

  JB TCON.5,TID_UTE  ;hopp til adresse TID_UTE hvis bit TF er satt

  • Hvis ikke TF-biten er satt, vil programtelleren fortsette i hovedprogrammet.

Endring/forlenging av tidsintervall

  • Vi kan endre tiden i tidsforsinkelsen ved å endre verdien i registrene TH og TL, som hver for seg maksimalt kan settes til FF heksadesimalt.

  • Ønsker vi en tidsforsinkelse større enn det TH og TL kan settes til, er det relativt enkelt å lage en programsløyfe som kontrollerer en egen teller i RAM og teller ned hver gang timeren går ut.

  • I flytdiagrammet til høyre har vi kalt denne RAM-adressen TID.

Aktuelle linker

Programmering av timer i assembler:

http://www.8052.com/tuttimer.phtml

Oppgaver mikrokontrollere

  1. Hvor mange enkeltporter kan totalt være utstyrt i MCS51-serien?

  2. Hvilken benevnelse er det på portene i MCS51-serien?

  3. Hva vil det si at en port er bidireksjonal?

  4. Hva vil det si at en port er TTL-LS-kompatibel?

  5. Hva er normale arbeidsfrekvenser for mikrokontrollere i MCS51-serien?

  6. Hvilken funksjon har inngangene XTAL1 og XTAL2?

  7. Hva skjer når signalet RESET aktiveres?

  8. Hvordan skiller en MCS51 mellom adresser i programhukommelsen og datahukommelsen?

  9. På hvilke adresser ligger programtelleren?

  10. Hva vil det si at et register eller enhet er bitadresserbar?

  11. Forklar hva som skjer ved utførelse av følgende instruksjon:
    SETB P1.3

  12. Forklar hva som skjer ved utførelse av følgende instruksjon:
    CLR C

  13. Forklar hva som skjer ved utførelse av følgende instruksjon:
    CPL A

  14. Forklar hva som skjer ved utførelse av følgende instruksjon:
    CLR P0.7

  15. Forklar hva som skjer ved utførelse av følgende instruksjon:
    ANL A,#0F1

  16. Forklar hva som skjer ved utførelse av følgende instruksjon:
    DEC A

  17. Forklar hva som skjer ved utførelse av følgende instruksjon:
    INC DPTR

  18. Forklar hva som skjer ved utførelse av følgende instruksjon:
    MOV A,R2

  19. Forklar hva som skjer ved utførelse av følgende instruksjon:
    MOV A,#1B

  20. Forklar hva som skjer ved utførelse av følgende instruksjon:
    MOV A,1B

  21. Forklar hva som skjer ved utførelse av følgende instruksjon:
    MOV A,3C10

  22. Forklar hva som skjer ved utførelse av følgende instruksjon:
    MOV SIGNAL,01B2

  23. Forklar hva som skjer ved utførelse av følgende instruksjon:
    JB P1.2,PORT

  24. Forklar hva som skjer ved utførelse av følgende instruksjon:
    MUL A,#03

  25. Lag et program som tester om et signal (inngang på mikrokontroller) er aktivt. Når det er aktivt, skal et utgangssignal (utgang på mikrokontroller) pulsere med en frekvens på 1 kHz (duty cycle 0,5). Programmet skal ikke benytte kontrollerens «timer». Mikrokontrollerens arbeidsfrekvens er 12 MHz.
    NB! Dersom du har tilgang til Multisim, kan du løse oppgave 25 og 26 der. I Multisim kan du både tegne kretsen, skrive program, utføre assemblering og simulere programmet.

  26. Lag et tilsvarende program som i forrige oppgave, men denne gangen ved å bruke en av kontrollerens innebygde «timere».
    NB! Dersom du har tilgang til Multisim, kan du løse oppgave 25 og 26 der. I Multisim kan du både tegne kretsen, skrive program, utføre assemblering og simulere programmet.