Advertisement
Guest User

dupa

a guest
Nov 21st, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. #include "at91sam9263.h"
  2.  
  3. // peripheral B (L_LED)
  4. #define PIOB_OER (volatile unsigned int*) 0xFFFFF410 // output enable register
  5. #define PIOB_PER (volatile unsigned int*) 0xFFFFF400 // PIO enable register
  6. #define PIOB_SODR (volatile unsigned int*) 0xFFFFF430 //set output data register
  7. #define PIOB_CODR (volatile unsigned int*) 0xFFFFF434 //clear output data register
  8. // peripheral C (BUTTONS and R_LED)
  9. #define PIOC_ODR (volatile unsigned int*) 0xFFFFF614 //disable output register
  10. #define PIOC_OER (volatile unsigned int*) 0xFFFFF610 // output enable register
  11. #define PIOC_PER (volatile unsigned int*) 0xFFFFF600 // PIO enable register
  12. #define PIOC_SODR (volatile unsigned int*) 0xFFFFF630 //set output data register
  13. #define PIOC_CODR (volatile unsigned int*) 0xFFFFF634 //clear output data register
  14. #define PIOC_PUER (volatile unsigned int*) 0xFFFFF664 //enables pull-up register
  15. #define PIOC_PUDR (volatile unsigned int*) 0xFFFFF660 //disables pull-up resistor
  16. #define PIOC_PDSR (volatile unsigned int*) 0xFFFFF63C //pin data status resistor
  17. //clock enable
  18. #define PMC_PCER (volatile unsigned int*) 0xFFFFFC10
  19.  
  20.  
  21.  
  22. #define PIT_SR (volatile unsigned int*) 0xFFFFFD34 //status reg
  23. #define PIT_MR (volatile unsigned int*) 0xFFFFFD30 // mode reg
  24. #define PIT_PIVR (volatile unsigned int*) 0xFFFFFD38 // PIT value reg
  25.  
  26.  
  27. // const
  28. #define TRUE 1
  29. #define FALSE 0
  30. #define CYCLES_PER_MILISECOND 6250
  31. #define MILISECONDS_PER_SECONDS 1000
  32.  
  33.  
  34. #define LEFT_LED (1<<8) //B peripheral
  35. #define RIGHT_LED (1<<29) //C peripheral
  36. #define LEFT_BUTTON (1<<5) //C peripheral
  37. #define RIGHT_BUTTON (1<<4) //C peripheral
  38. #define CLOCK (1<<4)
  39.  
  40. #define PITEN_ON (1<<24)
  41.  
  42. #define ON_TIME 1
  43. #define OFF_TIME 2
  44.  
  45. dbgu_print_ascii(const char *a) {}
  46.  
  47.  
  48. int button_pressed = FALSE;
  49. int diode_on = FALSE;
  50. int global_interrupt_flag = FALSE;
  51. unsigned int local_counter = 0;
  52.  
  53. void PIT_delay_IRQ(float seconds);
  54. void toggle_led();
  55. void cfg_output();
  56. void cfg_input();
  57. int isButtonPressed(unsigned int button);
  58. void right_led_turn_on();
  59. void right_led_turn_off();
  60. void left_led_turn_on();
  61. void left_led_turn_off();
  62.  
  63.  
  64. void PIT_delay_IRQ(float seconds){ // the lowest possible value is 0.001s (1 milisecond)
  65. unsigned int PIT_loops = seconds * MILISECONDS_PER_SECONDS;
  66. AT91C_BASE_PITC->PITC_PIMR = (0x000FFFFFU & CYCLES_PER_MILISECOND); //turn on PITEN MODE
  67.  
  68. int i = 0;
  69. while(TRUE){
  70. if((*PIT_SR) & (1<<0)){
  71. *PIT_PIVR; // reset
  72. ++i;
  73. if(i >= PIT_loops){
  74. break;
  75. } else if (i == (PIT_loops - 1)){
  76. //global_interrupt_flag = TRUE;
  77. //toggle_led();
  78. AT91C_BASE_PITC->PITC_PIMR = (AT91C_PITC_PITIEN & 0xFFFFFFFFU);
  79. }
  80. }
  81. }
  82. }
  83.  
  84. void PIT_interrupt_handler(void){
  85. if(AT91C_BASE_PITC->PITC_PIMR & (AT91C_PITC_PITIEN)){
  86. toggle_led();
  87. }
  88. }
  89.  
  90. void cfg_interrupts(){
  91. // disabling interrupt command register
  92. AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_SYS;
  93. //configuring pointer for timer interrupt handler
  94. AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) PIT_interrupt_handler;
  95.  
  96. //configuring trigger method
  97. AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | AT91C_AIC_PRIOR_HIGHEST;
  98.  
  99. //clear interrupt command register for peripherals
  100. AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_SYS;
  101.  
  102. //enable interrupt command register for peripherals
  103. AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_SYS;
  104.  
  105. //enable PIT timer interrupt
  106. AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITIEN | AT91C_PITC_PITEN;
  107.  
  108.  
  109.  
  110. }
  111.  
  112. void task_2(){
  113. while(TRUE){
  114. left_led_turn_off();
  115. //PIT_delay(OFF_TIME);
  116. left_led_turn_on();
  117. //PIT_delay(ON_TIME);
  118. }
  119. }
  120.  
  121. void task_1(){
  122. while(TRUE){
  123. if(is_button_pressed(LEFT_BUTTON)){
  124. left_led_turn_on();
  125. } else {
  126. left_led_turn_off();
  127. }
  128. }
  129.  
  130. }
  131.  
  132.  
  133. void main(void) {
  134. cfg_input();
  135. cfg_output();
  136. cfg_interrupts();
  137.  
  138. PIT_delay_IRQ(5);
  139. }
  140.  
  141.  
  142.  
  143.  
  144. void cfg_output(){
  145. *PIOB_PER = LEFT_LED;
  146. *PIOB_OER = LEFT_LED;
  147. *PIOB_SODR = LEFT_LED;
  148.  
  149. *PIOC_PER = RIGHT_LED;
  150. *PIOC_OER = RIGHT_LED;
  151. right_led_turn_off();
  152. left_led_turn_off();
  153. }
  154.  
  155. void cfg_input(){
  156. *PIOC_PER = LEFT_BUTTON | RIGHT_BUTTON;
  157. *PIOC_ODR = LEFT_BUTTON | RIGHT_BUTTON;
  158. *PIOC_PUER = LEFT_BUTTON | RIGHT_BUTTON;
  159. *PMC_PCER = (CLOCK);
  160. }
  161.  
  162. void toggle_led() {
  163. if(diode_on) {
  164. left_led_turn_off(); //turns diode off by clearing output data register
  165. diode_on = FALSE;
  166. } else {
  167. left_led_turn_on();
  168. diode_on = TRUE;
  169. }
  170. }
  171.  
  172. int is_button_pressed(unsigned int button){
  173. return (!(button & *PIOC_PDSR)) ? TRUE : FALSE;
  174. }
  175.  
  176. void delay(int cycles){
  177. volatile int c = 0;
  178. while(c < cycles){
  179. c++;
  180. }
  181. }
  182.  
  183. void right_led_turn_on(){
  184. *PIOC_CODR = RIGHT_LED;
  185. }
  186.  
  187. void right_led_turn_off(){
  188. *PIOC_SODR = RIGHT_LED;
  189. }
  190.  
  191. void left_led_turn_on(){
  192. *PIOB_CODR = LEFT_LED;
  193. }
  194.  
  195. void left_led_turn_off(){
  196. *PIOB_SODR = LEFT_LED;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement