AVR Assembler handledning 3 (6 / 9 steg)
Steg 6: Overflow Handler
Så låt oss anta att timer/counter0 registret musdata bara. Vi vet nu att programmet får en avbrottssignal och utför 0x0020 som berättar räknaren Program, PC att hoppa till etiketten "overflow_handler" följande är koden vi skrev efter att etikett:
overflow_handler:
Inc svämmar över
CPI översvämningar, 61
brne PC + 2
CLR svämmar över
Reti
Det första den gör är öka variabeln "svämmar över" (som är vårt namn för allmänna ändamål arbetar registret R17) då den "jämför" innehållet i svämmar över med nummer 61. Det sätt som instruktion cpi verk är att det helt enkelt subtraherar två tal och om resultatet är noll det definierar flaggan Z i registret över SREG (jag sa ju vi skulle få se detta register hela tiden). Om de två talen är lika då blir flaggan Z en 1, om de två talen inte är lika då blir det en 0.
Nästa rad säger "brne PC + 2" vilket betyder "förgrena sig om inte lika". I huvudsak, kontrollerar den flaggan Z i SREG och om det inte är en en (dvs. två numrerar är inte lika, om de var lika, noll flaggan skulle anges) PC förgrena sig till PC + 2, vilket innebär att det hoppar över nästa rad och går direkt till "reti" som avkastning från avbrottet till oavsett rum det var i koden när avbrottet kom. Om instruktionen brne hittade en 1 i noll flagga lite det skulle inte filial och istället skulle det bara fortsätta till nästa rad som skulle clr översvämningar återställs till 0.
Vad är resultatet av allt detta?
Vi ser också att varje gång det finns en timer overflow detta handler ökar värdet av "svämmar över" med ett. Variabeln "svämmar över" så räknar antal svämmar över när de inträffar. När den nummer når 61 vi återställa det till noll.
Nu varför i världen skulle vi göra det?
Låt oss se. Minns att vår klockhastighet för vår CPU är 16MHz och vi "prescaled" den med TCCR0B så att timern räknar bara med en hastighet av 15625 räknas per andra höger? Och varje gång timern når en sammanräkning av 255 det svämmar över. Så det betyder att det svämmar över 15625/256 = 61.04 gånger per sekund. Vi att hålla reda på antalet svämmar över med våra variabel "svämmar över" och vi jämför den siffran med 61. Så ser vi att "svämmar över" kommer lika 61 en gång varje sekund! Så återställs våra handler "svämmar över" till noll en gång per sekund. Så om vi helt enkelt övervaka de variabel "svämmar över" och ta del av varje gång återställs det till noll vi skulle räkna andra-av-andra i realtid.
Nu har vi "hanterat" timer overflow avbrotten. Se till att du förstår hur detta fungerar och sedan gå vidare till nästa steg där vi göra använda av detta faktum.