AVR-kurs del 2

Med Ole Hans

Slides:

goo.gl/hpRRW4

Interrupts

  • Bullet One
  • Bullet Two
  • Bullet Three

Interrupts

void loop() {
    
    if (digitalRead(BTN1)) {
        // Something that takes time
    }

    if (digitalRead(BTN2)) {
        // Something important!
    }

}

Interrupts i AVR

  1. Slå på interruptkilden
  2. Skriv interrupt service routine (ISR)
  3. Skru på interrupts globalt

1. Skru på interruptkilden

PORTA.PIN5CTRL |= PORT_ISC_FALLING_gc;

2. Skriv ISR

ISR(PORTA_PORT_vect) {

    if (PORTA.INTFLAGS & BUTTOM_Mask) {
        // Do stuff!
        PORTA.INTFLAGS = BUTTOM_Mask;
    }

}

3. Skru på interrupts globalt

sei();

La oss prøve

Databladtid!

Mikrokontrollerens klokke

\begin{aligned} \text{16bit} \rightarrow 2^{16} \\ 2^{16} = 65536 \end{aligned}
16bit216216=65536\begin{aligned} \text{16bit} \rightarrow 2^{16} \\ 2^{16} = 65536 \end{aligned}

Max = 25535

Min = 0

 

Hvert steg tar

\frac{\text{klokkehastighet}}{\text{prescaler}}
klokkehastighetprescaler\frac{\text{klokkehastighet}}{\text{prescaler}}

Desto høyere TOP verdi, desto lengre mellom avbrudd

Få periodetid på 1ms

\begin{aligned} \frac{3333333\text{Hz}}{256} = 13020.83\text{Hz} \\\\ T = \frac{1}{f} = \frac{1}{13020.83\text{Hz}} = 0.0768ms \\\\ 0.0768ms \times 13 = 0.9984ms \\\\ \text{avbruddsintervall} = \frac{\text{prescaler} \times \text{TOP}}{\text{klokkehastighet}} \end{aligned}
3333333Hz256=13020.83HzT=1f=113020.83Hz=0.0768ms0.0768ms×13=0.9984msavbruddsintervall=prescaler×TOPklokkehastighet\begin{aligned} \frac{3333333\text{Hz}}{256} = 13020.83\text{Hz} \\\\ T = \frac{1}{f} = \frac{1}{13020.83\text{Hz}} = 0.0768ms \\\\ 0.0768ms \times 13 = 0.9984ms \\\\ \text{avbruddsintervall} = \frac{\text{prescaler} \times \text{TOP}}{\text{klokkehastighet}} \end{aligned}

La oss prøve

Datablædtid!

Oppgaver

  • 10s timer: Bruk en timer til å blinke en LED hvert 10. sec
    • Tips: Regn og prøv å finn prescaler og periode som passer. Husk maksverdi for timer.
  • Kontrollerbar timer: Blink en LED med en timer, gjør at en knapp skrur timeren av og på
    • Tips: Har timere en bit i et register du kan skrive til for å slå av/på?
    • Prøv å bruk interrupt for knapp!
  • Gjør hva du vil! \o/