Microcontroller Programmeren in C

12
MICPRG Les 8 Microcontroller Programmeren in C

description

Microcontroller Programmeren in C. MICPRG Les 8. Pulse input. Veel signalen in de buitenwereld zijn pulsvormig . Veel sensoren leveren een pulsvormig signaal: Tachometer (toerenteller) . Hartslagsensor. Snelheidsmeter (fietscomputer) . Foto-elektrische sensoren. Pedometer, enz... - PowerPoint PPT Presentation

Transcript of Microcontroller Programmeren in C

Page 1: Microcontroller Programmeren in C

MICPRG Les 8

Microcontroller Programmeren in C

Page 2: Microcontroller Programmeren in C

2

Pulse inputVeel signalen in de buitenwereld zijn pulsvormig.

Veel sensoren leveren een pulsvormig signaal:Tachometer (toerenteller). Hartslagsensor. Snelheidsmeter (fietscomputer). Foto-elektrische sensoren. Pedometer, enz...

Om de pulsduur te kunnen meten hebben veel µC’s een ingebouwde input capture unit.

Page 3: Microcontroller Programmeren in C

3

Meten van pulsduurAlgoritme:

Wacht tot ingang hoog wordt en reset Timer.Wacht tot ingang laag wordt en lees Timer uit.Tel indien nodig Timer overflows.Pulsduur = (overflows*(MAX+1) + TCNT) * N / fclk

Waarom is dit niet zo’n goed idee?Als je iets anders aan het doen bent kan het even duren

voordat je in de gaten hebt dat ingang veranderd is.Interrupt als ingang veranderd?

Beter maar: Als je ook andere interrupts gebruikt kan het nog steeds even duren voordat je kan reageren…

Page 4: Microcontroller Programmeren in C

4

Input capture unitTimer/Counter1 van de ATmega32 heeft een speciale

Input Capture unit voor het meten van pulsduur.Waarde van de TCNT1 wordt gekopieerd in het ICR1

(Input Capture Register 1) bij een bepaalde flank op pin IC1 = PD6.

Page 5: Microcontroller Programmeren in C

5

0x15C7

0x15C60x15C70x15C8

0x0000IC1PD6

=110

=0

Input capture

count-ingang

015TCNT1

ICF1 TICIE0

TIMER1_CAPT_vectinterrupt

capture

Inputcontrol

ICR1

ICNC ICES1

015

Page 6: Microcontroller Programmeren in C

6

Input capture

ICNC1 = Input Capture Noise Canceler 10 = Flank wordt meteen herkend.1 = Flank wordt pas herkend als signaal 4 CPU klokperioden

stabiel is. ICES1 = Input Capture Edge Select 1

0 = capture bij 1 = capture bij

CS1x = Clock Select 1Instelbare prescaler 1, 8, 64, 256, 1024

Lage prescaler = hoge nauwkeurigheid

Filtert HF stoorpulsen weg.

Page 7: Microcontroller Programmeren in C

7

Meten van pulsduurToepassing:

Zend ultrasoon puls en ontvang reflectie

verschil = maat voor afstand.

Huiswerk:Lees blz. 119 t/m 121 in het AVR boek (AT90S2313).Schrijf een programma om de pulsduur van een positieve puls

op pin PD6 te meten. Gegeven:fCPU = 8 MHz.100 µs <= pulsduur <= 10000 µs.Meting moet op 1 µs nauwkeurig zijn.Programma hoeft verder niets te doen.

Bij fCLK = 8 MHz nauwkeurigheid +/- 0,04 mm

Page 8: Microcontroller Programmeren in C

8

Pulse inputVeel signalen in de buitenwereld zijn pulsvormig.

Veel sensoren leveren een pulsvormig signaal:Tachometer (toerenteller). Hartslagsensor. Snelheidsmeter (fietscomputer). Foto-elektrische sensoren. Pedometer, enz...

Om de pulsen te kunnen tellen hebben veel µC’s een ingebouwde counter.

Page 9: Microcontroller Programmeren in C

9

Timer/Counter0Counter: kies externe clock T0 = PB0.

Instellingen in TCCR0 (Timer/Counter Control Register 0)

Page 10: Microcontroller Programmeren in C

10

10

0xFF

=0=1

T/C0 kan een interrupt genereren als TCNT0 overloopt.Deze interrupt kun je aanzetten met het TOIE0 bit in het

TIMSK register.

T/C0 overflow interrupt

T0 = PB0

07

TCNT0

TOV0

0x00

TOIE0

TIMER0_OVF_vectinterrupt

R

CS0=111

Page 11: Microcontroller Programmeren in C

11

Tellen van pulsenHuiswerk:

Schrijf een programma dat telkens na 24 neergaande pulsen op pin PB0 een interrupt geeft (kratje vol).

1 2 3

Page 12: Microcontroller Programmeren in C

12

Uitwerking#include <avr/io.h>#include <stdint.h>#include <avr/interrupt.h>

/* inverteer PB7 na 24 neergaande flanken op PB0 */

ISR(TIMER0_COMP_vect) { PORTB ^= 0x80;}

int main(void) { TCCR0 = 0x0E; OCR0 = 23; TIMSK = 0x02; DDRB = 0x80; sei(); while (1); return 0;}