SHARE
TWEET

Untitled

a guest Apr 21st, 2014 91 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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()
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top