Advertisement
Guest User

Untitled

a guest
Apr 21st, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.74 KB | None | 0 0
  1. #include "derivative.h" /* include peripheral declarations */
  2. #include "TSI.h"
  3.  
  4.  
  5. unsigned short kalibracja[2];
  6. unsigned char currentElectrode;
  7. short deltaResult[2];
  8.  
  9.  
  10. void CalibrateTSI(void)
  11. {
  12. TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear end of scan flag
  13.  
  14. // Scan first electrode (TSI9)
  15. TSI0_DATA |=TSI_DATA_TSICH(9);
  16. TSI0_DATA |= TSI_DATA_SWTS_MASK; // Request scan
  17.  
  18. while(!(TSI0_GENCS & (1<<TSI_GENCS_EOSF_SHIFT))); // poczekaj az skanowanie dobiegnie konca-> EOSF=1
  19. TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // zeruj flage zakonczenia skanowania -> wpisz 1 do EOSF
  20. kalibracja[0] = (TSI0_DATA & TSI_DATA_TSICNT_MASK); // zapisz wynik skanowania pierwszej elektrody do tablicy
  21.  
  22. // Scan second electrode (TSI10)
  23. TSI0_DATA =TSI_DATA_TSICH(10);
  24. TSI0_DATA |= TSI_DATA_SWTS_MASK; // Request scan
  25.  
  26. while(!(TSI0_GENCS & (1<<TSI_GENCS_EOSF_SHIFT))); // Spin until done
  27. TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear end of scan flag
  28. kalibracja[1] = (TSI0_DATA & TSI_DATA_TSICNT_MASK);
  29.  
  30. TSI0_DATA =TSI_DATA_TSICH(9); // Select electrode to scan
  31. currentElectrode = 0; // Set flag for first electrode
  32.  
  33. }
  34.  
  35. void TSI_init(void)
  36. {
  37. SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK; //sygnał zegarowy na PORTB
  38. SIM_SCGC5 |= SIM_SCGC5_TSI_MASK; // sygnał zegarowy na moduł TSI
  39.  
  40. // Enable GPIO pins as TSI channels
  41. PORTB_PCR16 = PORT_PCR_MUX(0); // multipleks PTB16 as TSI channel 9
  42. PORTB_PCR17 = PORT_PCR_MUX(0); // multipleks PTB17 as TSI channel 10
  43.  
  44. TSI0_GENCS |= (TSI_GENCS_ESOR_MASK
  45. | TSI_GENCS_MODE(0) // Non-noise detection -> tylko dla srodowisk z dużymi zakłoceniami EMI
  46. | TSI_GENCS_REFCHRG(4) // 8 micro-amp charge ->prąd referencjnego oscylatora
  47. | TSI_GENCS_DVOLT(0) // Set voltage rails -> ustaw szyny Vp=1,33V Vmin=0,30V
  48. | TSI_GENCS_EXTCHRG(7) // Set charge/discharge current -> prąd oscylatora zewnętrznego 64uA
  49. | TSI_GENCS_PS(4) // Frequency divided by 16 -> częstotliwosć oscylatora zewnętrznego
  50. | TSI_GENCS_NSCN(11) // Scan electrode count -> skanuj elektrodę 12x
  51. //| TSI_GENCS_TSIIEN_MASK // interrupts
  52. | TSI_GENCS_STPE_MASK // pozwol na prace TSI w kazdym z trybów pracy procesora
  53. // | TSI_GENCS_STM_MASK // Scan trigger type software
  54. // 0 = software
  55. );
  56.  
  57. // Do not enable TSI module until all other settings are in place!
  58. TSI0_GENCS |= TSI_GENCS_TSIEN_MASK; // włączenie modułu TSI, zeby zmienic powyzsze opcje nalezy wylaczyc modul,zmienic ustawienia i z powrotem wlaczyc TSI
  59.  
  60. CalibrateTSI();
  61.  
  62. } // End InitTSI()
  63.  
  64.  
  65. void SwapElectrode(void)
  66. {
  67. // Swap to other electrode
  68. if(currentElectrode == 0)
  69. {
  70. currentElectrode = 1; // change flag
  71. // Select the electrode to scan
  72. TSI0_DATA = TSI_DATA_TSICH(10);
  73. }
  74. else
  75. {
  76. currentElectrode = 0;
  77. TSI0_DATA = TSI_DATA_TSICH(9);
  78. }
  79. } // end SwapElectrode()
  80.  
  81.  
  82.  
  83.  
  84. void ScanTSI(void)
  85. {
  86. /*
  87. * PROSTA FUNKCJA WYKONUJACA POJEDYNCZY POMIAR POJEMNOSCI SUWAKA POJEMNOSCIOWEGO
  88. */
  89. short int delta;
  90. unsigned short int konwersja[2]={0,0};
  91.  
  92. TSI0_DATA |= TSI_DATA_SWTS_MASK; // Issue a scan
  93.  
  94. while(!(TSI0_GENCS & (1<<TSI_GENCS_EOSF_SHIFT))); // Wait to complete
  95. TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear end of scan flag
  96.  
  97. // ZAPISZ WYNIK POMIARU DO TABLICY
  98. konwersja[currentElectrode] = (TSI0_DATA &TSI_DATA_TSICNT_MASK);
  99. // OBLICZ DELTE WYKORZYSTUJAC AKTUALNY POMAIR I POMIAR Z PROCESU KALIBRACJI
  100. delta = konwersja[currentElectrode] - kalibracja[currentElectrode];
  101.  
  102. // Handle underflow
  103. if( !delta)
  104. deltaResult[currentElectrode] = 0;
  105. else
  106. deltaResult[currentElectrode] = delta;
  107.  
  108. SwapElectrode(); // Switch to other electrode
  109.  
  110. } // end ScanTSI()
  111.  
  112.  
  113.  
  114. unsigned char sliderPercentagePosition[2] = {NO_TOUCH,NO_TOUCH};
  115. unsigned char absolutePercentagePosition = NO_TOUCH;
  116.  
  117.  
  118.  
  119. unsigned char ReadTSI(unsigned char stan)
  120. {
  121. // If there's a touch, calculate its position on slider
  122. if((deltaResult[0] >=THRESHOLD) || (deltaResult[1]>= THRESHOLD))
  123. { // jesli wyniki pomiaru sa wieksze od 100> przejdz do obliczen
  124.  
  125. sliderPercentagePosition[0] = (deltaResult[0]*100)/(deltaResult[0]+deltaResult[1]);
  126. sliderPercentagePosition[1] = (deltaResult[1]*100)/(deltaResult[0]+deltaResult[1]);
  127.  
  128. absolutePercentagePosition = ((100 - sliderPercentagePosition[0]) + sliderPercentagePosition[1])/2;
  129.  
  130. }
  131.  
  132. else
  133. {
  134. if(stan)
  135. { // No touch, purge variables to prevent spurious events // brak dotyku, nie rob nic
  136. sliderPercentagePosition[0] = NO_TOUCH;
  137. sliderPercentagePosition[1] = NO_TOUCH;
  138. absolutePercentagePosition = NO_TOUCH;
  139. }
  140. } // end else
  141.  
  142. return ((unsigned char)absolutePercentagePosition);
  143.  
  144. } // end ReadTSI()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement