Keyboard firmwares for Atmel AVR and Cortex-M
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
13 роки тому
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. Copyright 2011 Jun Wako <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include <avr/io.h>
  15. #include <avr/interrupt.h>
  16. #include <stdint.h>
  17. #include "timer.h"
  18. // counter resolution 1ms
  19. volatile uint16_t timer_count = 0;
  20. void timer_init(void)
  21. {
  22. // Timer0 CTC mode
  23. TCCR0A = 0x02;
  24. #if TIMER_PRESCALER == 1
  25. TCCR0B = 0x01;
  26. #elif TIMER_PRESCALER == 8
  27. TCCR0B = 0x02;
  28. #elif TIMER_PRESCALER == 64
  29. TCCR0B = 0x03;
  30. #elif TIMER_PRESCALER == 256
  31. TCCR0B = 0x04;
  32. #elif TIMER_PRESCALER == 1024
  33. TCCR0B = 0x05;
  34. #else
  35. # error "Timer prescaler value is NOT vaild."
  36. #endif
  37. OCR0A = TIMER_RAW_TOP;
  38. TIMSK0 = (1<<OCIE0A);
  39. }
  40. inline
  41. void timer_clear(void)
  42. {
  43. uint8_t sreg = SREG;
  44. cli();
  45. timer_count = 0;
  46. SREG = sreg;
  47. }
  48. inline
  49. uint16_t timer_read(void)
  50. {
  51. uint16_t t;
  52. uint8_t sreg = SREG;
  53. cli();
  54. t = timer_count;
  55. SREG = sreg;
  56. return t;
  57. }
  58. inline
  59. uint16_t timer_elapsed(uint16_t last)
  60. {
  61. uint16_t t;
  62. uint8_t sreg = SREG;
  63. cli();
  64. t = timer_count;
  65. SREG = sreg;
  66. return TIMER_DIFF_MS(t, last);
  67. }
  68. // excecuted once per 1ms.(excess for just timer count?)
  69. ISR(TIMER0_COMPA_vect)
  70. {
  71. timer_count++;
  72. }