Advertisement
Guest User

dlamackasiemanko

a guest
Dec 6th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. #include "at91sam9263.h"
  2. //transistors
  3. #define TRANSISTOR_Q1 (1<<29)//brightness
  4. #define TRANSISTOR_Q2 (1<<28)//turns left display
  5. #define TRANSISTOR_Q3 (1<<30)//turns right display
  6. //segments
  7. #define A (1<<25)
  8. #define B (1<<24)
  9. #define C (1<<22)
  10. #define D (1<<21)
  11. #define E (1<<20)
  12. #define F (1<<27)
  13. #define G (1<<26)
  14. #define DOT (1<<23)
  15. #define ALL_SEGMENTS (A | B | C | D | E | F | G | DOT)
  16. //digits
  17. #define NR0 (A | B | C | D | E | F)
  18. #define NR1 (B | C)
  19. #define NR2 (A | B | D | E | G)
  20. #define NR3 (A | B | C | D | G)
  21. #define NR4 (B | C | F | G)
  22. #define NR5 (A | C | D | F | G)
  23. #define NR6 (A | C | D | E | F | G)
  24. #define NR7 (A | B | C)
  25. #define NR8 (A | B | C | D | E | F | G)
  26. #define NR9 (A | B | C | D | F | G)
  27. //const
  28. #define REFRESH 50
  29. #define CYCLES_TO_MS 6250 // 100MHz main clock -> divided by the prescaler = 16 -> 6.25Mhz of the PIT clock
  30. #define SEC_TO_MILISEC 1000
  31. void dbgu_print_ascii(const char *a) {}
  32. void PIT_init();
  33. void start_PIT();
  34. void stop_PIT();
  35. void PIT_delay(float delay);
  36. void interrupt_handler();
  37. void PIT_interrupts_init();
  38. void set_disp();
  39. void enable_left_disp();
  40. void enable_right_disp();
  41. void disable_left_disp();
  42. void disable_right_disp();
  43. void next_nr(int nr);
  44. volatile int counter = 0;
  45. volatile int interrupt_flag = 0;
  46. int loop = 0;
  47.  
  48. int main(void) {
  49. int numbers[10] = {NR0, NR1, NR2, NR3, NR4, NR5, NR6, NR7, NR8, NR9};
  50. int i = 0;
  51. int tens = 0;
  52. int units = 0;
  53. set_disp();
  54. PIT_interrupts_init();
  55. disable_left_disp();
  56. disable_right_disp();
  57. PIT_init();
  58.  
  59. while(1){
  60. for(tens = 0; tens < 10; ++tens){
  61. for(units = 0; units < 10; ++units){
  62. for(i = 0; i < REFRESH; ++i){
  63. if(tens){
  64. next_nr(numbers[tens]);
  65. enable_left_disp();
  66. }
  67. PIT_delay(0.01);
  68. disable_left_disp();
  69. next_nr(numbers[units]);
  70. enable_right_disp();
  71. PIT_delay(0.01);
  72. disable_right_disp();
  73. }
  74. }
  75. }
  76.  
  77. }
  78. }
  79.  
  80. void PIT_delay(float delay){
  81. start_PIT();
  82. counter = 0;
  83. interrupt_flag = 0;
  84. loop = delay * SEC_TO_MILISEC;
  85. while(interrupt_flag == 0) {
  86. if(interrupt_flag == 1){
  87. stop_PIT();
  88. break;
  89. }
  90. }
  91. }
  92.  
  93. void PIT_init(){
  94. AT91C_BASE_PITC -> PITC_PIMR |= (0x000FFFFFU & CYCLES_TO_MS);
  95. stop_PIT();
  96. }
  97.  
  98. void start_PIT(){
  99. AT91C_BASE_PITC -> PITC_PIMR |= AT91C_PITC_PITEN;
  100. }
  101.  
  102. void stop_PIT(){
  103. AT91C_BASE_PITC -> PITC_PIMR &= ~AT91C_PITC_PITEN;
  104. }
  105.  
  106. void interrupt_handler(){
  107. if(AT91C_BASE_PITC -> PITC_PIMR & AT91C_PITC_PITIEN){
  108. if(AT91C_BASE_PITC -> PITC_PISR & AT91C_PITC_PITS) {
  109. AT91C_BASE_PITC -> PITC_PIVR;
  110. ++counter;
  111. if(counter >= loop){
  112. interrupt_flag = 1;
  113. }
  114. }
  115. }
  116. }
  117.  
  118. void PIT_interrupts_init(){
  119. AT91C_BASE_AIC -> AIC_IDCR = 1 << AT91C_ID_SYS;//2.disabling pit interrupts
  120. AT91C_BASE_AIC -> AIC_SVR[AT91C_ID_SYS] = (unsigned int) interrupt_handler;//3.configuring pointer for handler
  121. AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | AT91C_AIC_PRIOR_LOWEST;//4.configuring triggering method
  122. AT91C_BASE_AIC -> AIC_ICCR = 1 << AT91C_ID_SYS;//5.clearing interrupt flag
  123. AT91C_BASE_AIC -> AIC_IECR = 1 << AT91C_ID_SYS;//6.turning on interrupt
  124. AT91C_BASE_PITC -> PITC_PIMR = AT91C_PITC_PITIEN; //7
  125. }
  126. void set_disp(){
  127. AT91C_BASE_PIOB -> PIO_PER = ALL_SEGMENTS;
  128. AT91C_BASE_PIOB -> PIO_PER = TRANSISTOR_Q1 | TRANSISTOR_Q2 | TRANSISTOR_Q3;
  129. AT91C_BASE_PIOB -> PIO_OER = ALL_SEGMENTS;
  130. AT91C_BASE_PIOB -> PIO_OER = TRANSISTOR_Q1 | TRANSISTOR_Q2 | TRANSISTOR_Q3;
  131. AT91C_BASE_PIOB -> PIO_CODR = ALL_SEGMENTS;
  132. AT91C_BASE_PIOB -> PIO_CODR = TRANSISTOR_Q1;
  133. }
  134. void enable_left_disp(){
  135. AT91C_BASE_PIOB -> PIO_CODR = TRANSISTOR_Q2;
  136. }
  137. void enable_right_disp(){
  138. AT91C_BASE_PIOB -> PIO_CODR = TRANSISTOR_Q3;
  139. }
  140. void disable_left_disp(){
  141. AT91C_BASE_PIOB -> PIO_SODR = TRANSISTOR_Q2;
  142. }
  143. void disable_right_disp(){
  144. AT91C_BASE_PIOB -> PIO_SODR = TRANSISTOR_Q3;
  145. }
  146. void next_nr(int nr){
  147. AT91C_BASE_PIOB -> PIO_CODR = ALL_SEGMENTS;
  148. AT91C_BASE_PIOB -> PIO_SODR = nr;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement