Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //NOWY PROJEKT - sprawdzanie predkosci naciskania 2x klawisza.
- //jezeli szybko moze swiecic jedna dioda, jesli wolniej 2 diody, jak przepełni sie licznik to nic.
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #define LED_PIN (1<PB1)
- #define KEY_PIN (1<<PD2)
- #define KEY_DOWN !(PIND & KEY_PIN)
- static inline void init_led(void);
- static inline void init_switch(void);
- static inline void init_timer(void);
- static inline void init_exti(void);
- uint8_t is_switch_pressed(void);
- int main(void)
- {
- init_led();
- init_switch();
- init_timer();
- init_exti();
- sei(); //globalne odblokowanie przerwan
- while (1)
- {
- //tu system powiadomien predkosci naciskania
- }
- }
- static inline void init_led(void)
- {
- DDRB |= LED_PIN ;//kierunek pinu na wyjscie LED
- PORTB |= LED_PIN ;//wylaczenie LED
- }
- static inline void init_switch(void)
- {
- PORTD |= KEY_PIN ;
- }
- static inline void init_timer(void)
- {
- OCR1A = 31249;//wartosc przez ktora dzieli sie taktowanie dla 1sekundy
- TCCR1B |= (1 << WGM12)//tryb CTC (compare)
- | (1 << CS12);//prescaler = 256
- }
- static inline void init_exti(void)
- {
- EICRA |= (1 << ISC01);//generowanie przerwan zboczem narastajacym
- EIMSK |= (1 << INT0);//maska przerwania - wlaczenie przerwania
- }
- ISR(TIMER1_COMPA_vect)
- {
- //if (EIFR | (1 << INTF0))//External Interrupt Flag Register 1 odsyła do wykonania przerwania
- //PORTB ^= LED_PIN;//zmien stan led
- }
- ISR(INT0_vect)
- {
- //if (is_switch_pressed() && OCR1A >= 1000) //jesli klawisz klikniety
- OCR1A -= 1000;//pomniejsz wartosc rejestru porownawczego
- if (OCR1A < 1000)
- {
- OCR1A = 65534;////jesli rejestr dojdzie do zera przekrec go do maxa
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement