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
- Slå på interruptkilden
- Skriv interrupt service routine (ISR)
- 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}
16bit→216216=65536
Max = 25535
Min = 0
Hvert steg tar
\frac{\text{klokkehastighet}}{\text{prescaler}}
prescalerklokkehastighet
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}
2563333333Hz=13020.83HzT=f1=13020.83Hz1=0.0768ms0.0768ms×13=0.9984msavbruddsintervall=klokkehastighetprescaler×TOP
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/
AVR-kurs Del 2
By Hans Elias Bukholm Josephsen
AVR-kurs Del 2
- 548