Code source pour le BE-CHTI de l'année 2020-2021
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

principal.c 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include <stdlib.h>
  2. #include "Affichage_Valise.h"
  3. #include "DriverJeuLaser.h"
  4. #define SEUIL_MIN 0x00020510
  5. #define SEUIL_MAX 0x01933510
  6. //short int = 16 bit signé
  7. //char = 8 bit non signé (0 à 255)
  8. extern int PeriodeSonMicroSec;
  9. extern void CallBackSon(void);
  10. extern int TableauIndex;
  11. extern int LongueurSon;
  12. extern int DFT_ModuleAuCarre(short int*, char);
  13. extern short int LeSignal;
  14. short int dma_buff[64] ;
  15. int res[4];
  16. char cible_active, LED_cible_active;
  17. typedef struct {
  18. short int valeur_k, score, confirmations;
  19. } Joueur;
  20. Joueur tous_joueurs[4];
  21. void jouerSon() {
  22. //on remet l'index du tableau à zéro, du coup ça va jouer une fois le son
  23. TableauIndex = 0;
  24. }
  25. void changer_cible(){
  26. int i;
  27. for(i = 0; i < 4; i++){
  28. Prepare_Afficheur(i+1,tous_joueurs[i].score);
  29. }
  30. int prochaine_cible = cible_active;
  31. int LED_prochaine_cible;
  32. while(prochaine_cible == cible_active){
  33. prochaine_cible = (rand() % 4 + 1);
  34. }
  35. Choix_Capteur(prochaine_cible);
  36. if(prochaine_cible == 1){
  37. LED_prochaine_cible = LED_Cible_1;
  38. }
  39. else if(prochaine_cible == 2){
  40. LED_prochaine_cible = LED_Cible_2;
  41. }
  42. else if(prochaine_cible == 3){
  43. LED_prochaine_cible = LED_Cible_3;
  44. }
  45. else {
  46. LED_prochaine_cible = LED_Cible_4;
  47. }
  48. Prepare_Clear_LED(LED_cible_active);
  49. Prepare_Set_LED(LED_prochaine_cible);
  50. Mise_A_Jour_Afficheurs_LED();
  51. cible_active = prochaine_cible;
  52. LED_cible_active = LED_prochaine_cible;
  53. jouerSon();
  54. for(i = 0; i < 4; i++){
  55. tous_joueurs[i].confirmations = 0;
  56. }
  57. }
  58. void faire_dft() {
  59. //on fait la mesure
  60. Start_DMA1(64);
  61. Wait_On_End_Of_DMA1();
  62. Stop_DMA1;
  63. //on l'exploite en regardant que les raies qui nous intéresse
  64. char k[4] = {17,18,19,20};
  65. int i;
  66. /*
  67. for(i=0;i<64;i++){
  68. res[i] = DFT_ModuleAuCarre(dma_buff, i);
  69. }*/
  70. for(i=0;i<4;i++){
  71. res[i] = DFT_ModuleAuCarre(dma_buff, k[i]);
  72. if (res[i] > SEUIL_MIN && res[i] < SEUIL_MAX){
  73. if(tous_joueurs[i].confirmations < 5){
  74. tous_joueurs[i].confirmations++;
  75. if(tous_joueurs[i].confirmations == 5){
  76. tous_joueurs[i].score++;
  77. changer_cible();
  78. }
  79. }
  80. }
  81. }
  82. }
  83. int main(void)
  84. {
  85. // ===========================================================================
  86. // ============= INIT PERIPH (faites qu'une seule fois) =====================
  87. // ===========================================================================
  88. // Après exécution : le coeur CPU est clocké à 72MHz ainsi que tous les timers
  89. CLOCK_Configure();
  90. // 72Mhz pour 1s
  91. // ? ticks pour 5*10^-3 s
  92. // règle de trois.
  93. //on décide de faire une DFT toutes les 5 ms
  94. Systick_Period_ff(360000);
  95. //on met priorité 9 car la mise à jour de la LED est de priorité 8
  96. Systick_Prio_IT(9,faire_dft);
  97. Init_Conversion_On_Trig_Timer_ff( ADC1, TIM2_CC2, 225 );
  98. //il faut configurer la fréquence d'échantillonage de l'ADC
  99. Init_TimingADC_ActiveADC_ff(ADC1,72);
  100. Single_Channel_ADC(ADC1,2);
  101. Init_Conversion_On_Trig_Timer_ff( ADC1, TIM2_CC2, 225 );
  102. Init_ADC1_DMA1( 0, dma_buff );
  103. //============================================================================
  104. //initialiser les pistolets
  105. Init_Affichage();
  106. srand(21);
  107. int nbCycles = PeriodeSonMicroSec * 72; //PeriodeSonMicroSec * 0.000001 * 72 000 000
  108. Timer_1234_Init_ff( TIM4, nbCycles);
  109. //Timer_1234_Init_ff( TIM5, 72000000 * 3); // Permet de lancer le timer de changement de cible toutes les 3 secondes
  110. //avant de config le timer on va mettre la taille de l'index supérieur à la taille du fichier audio
  111. //comme ça, le logiciel ne va pas jouer le son de suite
  112. TableauIndex = LongueurSon;
  113. Active_IT_Debordement_Timer( TIM4, 2, CallBackSon );
  114. //on l'active avec une priorité de 9 car la led est de priorité 8
  115. //Active_IT_Debordement_Timer( TIM5, 9, changer_cible);
  116. PWM_Init_ff( TIM3, 3, 720); //initialisation de la PWM sur canal 3 timer 3
  117. //on met période tick à 720 sur une clock à 72 Mhz
  118. //période de 720/72.10^6 = 72 / 72.10^5 = 1 / 10^5 = 10^-5 = 10 µs
  119. // donc fréquence de 10^5 Hz = 100 kHz
  120. GPIO_Configure(GPIOB, 0, OUTPUT, ALT_PPULL);
  121. SysTick_On;
  122. SysTick_Enable_IT; // activer l'interruption configurée
  123. changer_cible();
  124. while (1)
  125. {
  126. }
  127. }