Thomas Schöngeld
/
interupt_counter
Test für den Test 1
Fork of interupt_counter by
main1.cpp@0:6ef5de7d9560, 2016-01-18 (annotated)
- Committer:
- schoeni_91
- Date:
- Mon Jan 18 09:44:43 2016 +0000
- Revision:
- 0:6ef5de7d9560
Test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
schoeni_91 | 0:6ef5de7d9560 | 1 | #include "mbed.h" |
schoeni_91 | 0:6ef5de7d9560 | 2 | |
schoeni_91 | 0:6ef5de7d9560 | 3 | InterruptIn iiUp(p15); |
schoeni_91 | 0:6ef5de7d9560 | 4 | DigitalIn diUp(p15); |
schoeni_91 | 0:6ef5de7d9560 | 5 | InterruptIn iiDown(p12); |
schoeni_91 | 0:6ef5de7d9560 | 6 | DigitalIn diDown(p12); |
schoeni_91 | 0:6ef5de7d9560 | 7 | BusOut leds(LED1, LED2, LED3, LED4); |
schoeni_91 | 0:6ef5de7d9560 | 8 | |
schoeni_91 | 0:6ef5de7d9560 | 9 | // prototypes |
schoeni_91 | 0:6ef5de7d9560 | 10 | |
schoeni_91 | 0:6ef5de7d9560 | 11 | // functions |
schoeni_91 | 0:6ef5de7d9560 | 12 | // Diese Funktion ist zum Entprellen von Tastern geeignet: |
schoeni_91 | 0:6ef5de7d9560 | 13 | // Durch den zusätzlichen Code kann eine Entprellzeit von durchschnittlich 1,5-4ms |
schoeni_91 | 0:6ef5de7d9560 | 14 | // (mindestens 8*150us = 1,2ms) erreicht werden. |
schoeni_91 | 0:6ef5de7d9560 | 15 | // Grundsätzlich prüft die Funktion den Pegel des Pins eine DigitalIn. |
schoeni_91 | 0:6ef5de7d9560 | 16 | // Wenn der Pegel 8 Mal konstant war, wird die Schleife verlassen. |
schoeni_91 | 0:6ef5de7d9560 | 17 | // Diese Funktion kann sehr gut eingesetzt werden, um in einer Endlosschleife Taster |
schoeni_91 | 0:6ef5de7d9560 | 18 | // anzufragen, da sie, wie erwähnt, eine kurze Wartezeit hat. |
schoeni_91 | 0:6ef5de7d9560 | 19 | uint8_t debounce(DigitalIn myIn) |
schoeni_91 | 0:6ef5de7d9560 | 20 | { |
schoeni_91 | 0:6ef5de7d9560 | 21 | #define LEVEL_CHECKS 8 |
schoeni_91 | 0:6ef5de7d9560 | 22 | #define MAX_LOOPS 30 // stoppt das Überprüfen des Prellen nach max. MAX_LOOPS Durchläufen |
schoeni_91 | 0:6ef5de7d9560 | 23 | unsigned char port_buffer; |
schoeni_91 | 0:6ef5de7d9560 | 24 | unsigned char debounceCounter = 0; |
schoeni_91 | 0:6ef5de7d9560 | 25 | uint8_t loopCounter = 0; |
schoeni_91 | 0:6ef5de7d9560 | 26 | |
schoeni_91 | 0:6ef5de7d9560 | 27 | do { |
schoeni_91 | 0:6ef5de7d9560 | 28 | port_buffer = myIn; |
schoeni_91 | 0:6ef5de7d9560 | 29 | wait_us(150); |
schoeni_91 | 0:6ef5de7d9560 | 30 | loopCounter++; |
schoeni_91 | 0:6ef5de7d9560 | 31 | if(myIn == port_buffer) |
schoeni_91 | 0:6ef5de7d9560 | 32 | debounceCounter++; // mindestens 'LEVEL_CHECKS' Abtastungen in Folge: gleicher Pegel |
schoeni_91 | 0:6ef5de7d9560 | 33 | else |
schoeni_91 | 0:6ef5de7d9560 | 34 | debounceCounter = 0; |
schoeni_91 | 0:6ef5de7d9560 | 35 | } while ((debounceCounter <= LEVEL_CHECKS) && (loopCounter <= MAX_LOOPS)); |
schoeni_91 | 0:6ef5de7d9560 | 36 | return loopCounter; |
schoeni_91 | 0:6ef5de7d9560 | 37 | } |
schoeni_91 | 0:6ef5de7d9560 | 38 | |
schoeni_91 | 0:6ef5de7d9560 | 39 | // ISR |
schoeni_91 | 0:6ef5de7d9560 | 40 | void cntUp() |
schoeni_91 | 0:6ef5de7d9560 | 41 | { |
schoeni_91 | 0:6ef5de7d9560 | 42 | debounce(diUp); |
schoeni_91 | 0:6ef5de7d9560 | 43 | leds = leds + 1; |
schoeni_91 | 0:6ef5de7d9560 | 44 | } |
schoeni_91 | 0:6ef5de7d9560 | 45 | |
schoeni_91 | 0:6ef5de7d9560 | 46 | void cntDown() |
schoeni_91 | 0:6ef5de7d9560 | 47 | { |
schoeni_91 | 0:6ef5de7d9560 | 48 | debounce(diDown); |
schoeni_91 | 0:6ef5de7d9560 | 49 | leds = leds - 1; |
schoeni_91 | 0:6ef5de7d9560 | 50 | } |
schoeni_91 | 0:6ef5de7d9560 | 51 | |
schoeni_91 | 0:6ef5de7d9560 | 52 | |
schoeni_91 | 0:6ef5de7d9560 | 53 | // main program |
schoeni_91 | 0:6ef5de7d9560 | 54 | int main() |
schoeni_91 | 0:6ef5de7d9560 | 55 | { |
schoeni_91 | 0:6ef5de7d9560 | 56 | iiUp.rise(&cntUp); |
schoeni_91 | 0:6ef5de7d9560 | 57 | iiDown.rise(&cntDown); |
schoeni_91 | 0:6ef5de7d9560 | 58 | while(1) { |
schoeni_91 | 0:6ef5de7d9560 | 59 | } |
schoeni_91 | 0:6ef5de7d9560 | 60 | } |