Advertisement
Guest User

asdvuiaubsifda

a guest
Nov 22nd, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.60 KB | None | 0 0
  1. #include "at91sam9263.h"
  2.  
  3. #define TRANSISTOR_Q1 (1<<29) //pnp, regulates brightness
  4. #define TRANSISTOR_Q2 (1<<28) //pnp, switches left display
  5. #define TRANSISTOR_Q3 (1<<30) //pnp, switches right display
  6.  
  7. #define SEG_A (1<<25)
  8. #define SEG_B (1<<24)
  9. #define SEG_C (1<<22)
  10. #define SEG_D (1<<21)
  11. #define SEG_E (1<<20)
  12. #define SEG_F (1<<27)
  13. #define SEG_G (1<<26)
  14. #define SEG_DOT (1<<23)
  15.  
  16. #define SEG_ALL (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DOT)
  17.  
  18. #define NUM_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
  19. #define NUM_1 (SEG_B | SEG_C)
  20. #define NUM_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
  21. #define NUM_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
  22. #define NUM_4 (SEG_B | SEG_C | SEG_F | SEG_G)
  23. #define NUM_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
  24. #define NUM_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
  25. #define NUM_7 (SEG_A | SEG_B | SEG_C)
  26. #define NUM_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
  27. #define NUM_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
  28.  
  29.  
  30. // peripheral B (L_LED)
  31. #define PIOB_OER (volatile unsigned int*) 0xFFFFF410 // output enable register
  32. #define PIOB_PER (volatile unsigned int*) 0xFFFFF400 // PIO enable register
  33. #define PIOB_SODR (volatile unsigned int*) 0xFFFFF430 //set output data register
  34. #define PIOB_CODR (volatile unsigned int*) 0xFFFFF434 //clear output data register
  35. // peripheral C (BUTTONS and R_LED)
  36. #define PIOC_ODR (volatile unsigned int*) 0xFFFFF614 //disable output register
  37. #define PIOC_OER (volatile unsigned int*) 0xFFFFF610 // output enable register
  38. #define PIOC_PER (volatile unsigned int*) 0xFFFFF600 // PIO enable register
  39. #define PIOC_SODR (volatile unsigned int*) 0xFFFFF630 //set output data register
  40. #define PIOC_CODR (volatile unsigned int*) 0xFFFFF634 //clear output data register
  41. #define PIOC_PUER (volatile unsigned int*) 0xFFFFF664 //enables pull-up register
  42. #define PIOC_PUDR (volatile unsigned int*) 0xFFFFF660 //disables pull-up resistor
  43. #define PIOC_PDSR (volatile unsigned int*) 0xFFFFF63C //pin data status resistor
  44. //clock enable
  45. #define PMC_PCER (volatile unsigned int*) 0xFFFFFC10
  46.  
  47.  
  48.  
  49. #define PIT_SR (volatile unsigned int*) 0xFFFFFD34 //status reg
  50. #define PIT_MR (volatile unsigned int*) 0xFFFFFD30 // mode reg
  51. #define PIT_PIVR (volatile unsigned int*) 0xFFFFFD38 // PIT value reg
  52.  
  53.  
  54. // const
  55. #define TRUE 1
  56. #define FALSE 0
  57.  
  58. #define START -1
  59. #define FINISHED 1
  60. #define PROGRESS 0
  61.  
  62. #define CYCLES_PER_MILISECOND 6250
  63. #define MILISECONDS_PER_SECONDS 1000
  64. #define REFRESH_FREQ 500
  65. #define DELAY_TIME_SEC 0.5
  66.  
  67.  
  68. #define LEFT_LED (1<<8) //B peripheral
  69. #define RIGHT_LED (1<<29) //C peripheral
  70. #define LEFT_BUTTON (1<<5) //C peripheral
  71. #define RIGHT_BUTTON (1<<4) //C peripheral
  72. #define CLOCK (1<<4)
  73.  
  74. #define PITEN_ON (1<<24)
  75.  
  76. dbgu_print_ascii(const char *a) {}
  77.  
  78.  
  79. int button_pressed = FALSE;
  80. int diode_on = FALSE;
  81. int global_interrupt_flag = FINISHED;
  82. unsigned int global_counter = 0;
  83.  
  84.  
  85. void PIT_delay_IRQ(float seconds);
  86. void toggle_led();
  87. void cfg_output();
  88. void cfg_input();
  89. void cfg_interrupts();
  90. int isButtonPressed(unsigned int button);
  91. void right_led_turn_on();
  92. void right_led_turn_off();
  93. void left_led_turn_on();
  94. void left_led_turn_off();
  95.  
  96. void disp_init();
  97. void disp_l_enable();
  98. void disp_r_enable();
  99. void disp_l_disable();
  100. void disp_r_disable();
  101. void update_number(int number);
  102.  
  103.  
  104. void PIT_delay_IRQ(float seconds){ // the lowest possible value is 0.001s (1 milisecond)
  105. static unsigned int PIT_loops;
  106.  
  107. if(global_interrupt_flag == FINISHED){
  108. global_counter = 0;
  109. AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN | (0x000FFFFFU & CYCLES_PER_MILISECOND);
  110. PIT_loops = seconds * MILISECONDS_PER_SECONDS;
  111. global_interrupt_flag = PROGRESS;
  112. }
  113. if(global_interrupt_flag == PROGRESS){
  114. if(global_counter >= PIT_loops) {
  115. global_interrupt_flag = FINISHED;
  116. }
  117. }
  118. }
  119.  
  120. void PIT_delay(float seconds){ // the lowest possible value is 0.001s (1 milisecond)
  121. unsigned int cycles = seconds * 1000 * CYCLES_PER_MILISECOND;
  122. unsigned int PIT_loops = seconds * 1000;
  123. *PIT_MR = PITEN_ON | (0x000FFFFFU & CYCLES_PER_MILISECOND); //turn on PITEN MODE
  124.  
  125. int i = 0;
  126. while(TRUE){
  127. if((*PIT_SR) & (1<<0)){
  128. *PIT_PIVR; // reset
  129. ++i;
  130. if(i >= PIT_loops){
  131. break;
  132. }
  133. }
  134. }
  135. }
  136.  
  137. void PIT_interrupt_handler(void){
  138. if(AT91C_BASE_PITC->PITC_PIMR & (AT91C_PITC_PITIEN)){
  139. if (AT91C_BASE_PITC->PITC_PISR & (AT91C_PITC_PITS)){
  140. AT91C_BASE_PITC->PITC_PIVR;
  141. ++global_counter;
  142. }
  143. }
  144. }
  145.  
  146. void main(void) {
  147. int decoder[10] = {NUM_0, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9};
  148. int num_of_tens = 0;
  149. int num_of_ones = 0;
  150. int refresh_counter = 0;
  151.  
  152.  
  153. cfg_input();
  154. cfg_output();
  155. cfg_interrupts();
  156.  
  157. disp_init();
  158.  
  159. disp_l_disable();
  160. disp_r_disable();
  161.  
  162. while(1){
  163.  
  164. ++refresh_counter;
  165. if(refresh_counter == 3200) {
  166. disp_l_disable();
  167. update_number(decoder[num_of_ones]);
  168. disp_r_enable();
  169. } else if (refresh_counter == 6400) {
  170. disp_r_disable();
  171. if(num_of_tens){
  172. update_number(decoder[num_of_tens]);
  173. disp_l_enable();
  174. }
  175. }
  176.  
  177. refresh_counter %= 6400;
  178.  
  179. PIT_delay_IRQ(1);
  180.  
  181. if(global_interrupt_flag == FINISHED){
  182. ++num_of_ones;
  183. if (num_of_ones == 10) {
  184. ++num_of_tens;
  185. num_of_tens %= 10;
  186. }
  187. num_of_ones %= 10;
  188. }
  189.  
  190. }
  191. }
  192.  
  193.  
  194. void cfg_output(){
  195. *PIOB_PER = LEFT_LED;
  196. *PIOB_OER = LEFT_LED;
  197. *PIOB_SODR = LEFT_LED;
  198.  
  199. *PIOC_PER = RIGHT_LED;
  200. *PIOC_OER = RIGHT_LED;
  201. right_led_turn_off();
  202. left_led_turn_off();
  203. }
  204.  
  205. void cfg_input(){
  206. *PIOC_PER = LEFT_BUTTON | RIGHT_BUTTON;
  207. *PIOC_ODR = LEFT_BUTTON | RIGHT_BUTTON;
  208. *PIOC_PUER = LEFT_BUTTON | RIGHT_BUTTON;
  209. *PMC_PCER = (CLOCK);
  210. }
  211.  
  212. void cfg_interrupts(){
  213. // disabling interrupt command register
  214. AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_SYS;
  215. //configuring pointer for timer interrupt handler
  216. AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) PIT_interrupt_handler;
  217. //configuring trigger method
  218. AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | AT91C_AIC_PRIOR_HIGHEST;
  219. //clear interrupt command register for peripherals
  220. AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_SYS;
  221. //enable interrupt command register for peripherals
  222. AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_SYS;
  223. //enable PIT timer interrupt
  224. AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITIEN;
  225.  
  226. }
  227.  
  228. void toggle_led() {
  229. if(diode_on) {
  230. left_led_turn_off(); //turns diode off by clearing output data register
  231. diode_on = FALSE;
  232. } else {
  233. left_led_turn_on();
  234. diode_on = TRUE;
  235. }
  236. }
  237.  
  238. int is_button_pressed(unsigned int button){
  239. return (!(button & *PIOC_PDSR)) ? TRUE : FALSE;
  240. }
  241.  
  242. void delay(int cycles){
  243. volatile int c = 0;
  244. while(c < cycles){
  245. c++;
  246. }
  247. }
  248.  
  249. void right_led_turn_on(){
  250. *PIOC_CODR = RIGHT_LED;
  251. }
  252.  
  253. void right_led_turn_off(){
  254. *PIOC_SODR = RIGHT_LED;
  255. }
  256.  
  257. void left_led_turn_on(){
  258. *PIOB_CODR = LEFT_LED;
  259. }
  260.  
  261. void left_led_turn_off(){
  262. *PIOB_SODR = LEFT_LED;
  263. }
  264.  
  265. void disp_init(){
  266. *PIOB_PER = SEG_ALL;
  267. *PIOB_PER = TRANSISTOR_Q1 | TRANSISTOR_Q2 | TRANSISTOR_Q3;
  268. *PIOB_OER = SEG_ALL;
  269. *PIOB_OER = TRANSISTOR_Q1 | TRANSISTOR_Q2 | TRANSISTOR_Q3;
  270. *PIOB_CODR = SEG_ALL; // turns off all segments
  271. *PIOB_CODR = TRANSISTOR_Q1; // enables backlight
  272.  
  273.  
  274. }
  275.  
  276. void disp_l_enable(){
  277. *PIOB_CODR = TRANSISTOR_Q2;
  278. }
  279. void disp_r_enable(){
  280. *PIOB_CODR = TRANSISTOR_Q3;
  281. }
  282. void disp_l_disable(){
  283. *PIOB_SODR = TRANSISTOR_Q2;
  284. }
  285. void disp_r_disable(){
  286. *PIOB_SODR = TRANSISTOR_Q3;
  287. }
  288.  
  289. void update_number(int number){
  290. *PIOB_CODR = SEG_ALL;
  291. *PIOB_SODR = number;
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement