Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "derivative.h" /* include peripheral declarations */
- #include "TSI.h"
- unsigned short kalibracja[2];
- unsigned char currentElectrode;
- short deltaResult[2];
- void CalibrateTSI(void)
- {
- TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear end of scan flag
- // Scan first electrode (TSI9)
- TSI0_DATA |=TSI_DATA_TSICH(9);
- TSI0_DATA |= TSI_DATA_SWTS_MASK; // Request scan
- while(!(TSI0_GENCS & (1<<TSI_GENCS_EOSF_SHIFT))); // poczekaj az skanowanie dobiegnie konca-> EOSF=1
- TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // zeruj flage zakonczenia skanowania -> wpisz 1 do EOSF
- kalibracja[0] = (TSI0_DATA & TSI_DATA_TSICNT_MASK); // zapisz wynik skanowania pierwszej elektrody do tablicy
- // Scan second electrode (TSI10)
- TSI0_DATA =TSI_DATA_TSICH(10);
- TSI0_DATA |= TSI_DATA_SWTS_MASK; // Request scan
- while(!(TSI0_GENCS & (1<<TSI_GENCS_EOSF_SHIFT))); // Spin until done
- TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear end of scan flag
- kalibracja[1] = (TSI0_DATA & TSI_DATA_TSICNT_MASK);
- TSI0_DATA =TSI_DATA_TSICH(9); // Select electrode to scan
- currentElectrode = 0; // Set flag for first electrode
- }
- void TSI_init(void)
- {
- SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK; //sygnał zegarowy na PORTB
- SIM_SCGC5 |= SIM_SCGC5_TSI_MASK; // sygnał zegarowy na moduł TSI
- // Enable GPIO pins as TSI channels
- PORTB_PCR16 = PORT_PCR_MUX(0); // multipleks PTB16 as TSI channel 9
- PORTB_PCR17 = PORT_PCR_MUX(0); // multipleks PTB17 as TSI channel 10
- TSI0_GENCS |= (TSI_GENCS_ESOR_MASK
- | TSI_GENCS_MODE(0) // Non-noise detection -> tylko dla srodowisk z dużymi zakłoceniami EMI
- | TSI_GENCS_REFCHRG(4) // 8 micro-amp charge ->prąd referencjnego oscylatora
- | TSI_GENCS_DVOLT(0) // Set voltage rails -> ustaw szyny Vp=1,33V Vmin=0,30V
- | TSI_GENCS_EXTCHRG(7) // Set charge/discharge current -> prąd oscylatora zewnętrznego 64uA
- | TSI_GENCS_PS(4) // Frequency divided by 16 -> częstotliwosć oscylatora zewnętrznego
- | TSI_GENCS_NSCN(11) // Scan electrode count -> skanuj elektrodę 12x
- //| TSI_GENCS_TSIIEN_MASK // interrupts
- | TSI_GENCS_STPE_MASK // pozwol na prace TSI w kazdym z trybów pracy procesora
- // | TSI_GENCS_STM_MASK // Scan trigger type software
- // 0 = software
- );
- // Do not enable TSI module until all other settings are in place!
- 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
- CalibrateTSI();
- } // End InitTSI()
- void SwapElectrode(void)
- {
- // Swap to other electrode
- if(currentElectrode == 0)
- {
- currentElectrode = 1; // change flag
- // Select the electrode to scan
- TSI0_DATA = TSI_DATA_TSICH(10);
- }
- else
- {
- currentElectrode = 0;
- TSI0_DATA = TSI_DATA_TSICH(9);
- }
- } // end SwapElectrode()
- void ScanTSI(void)
- {
- /*
- * PROSTA FUNKCJA WYKONUJACA POJEDYNCZY POMIAR POJEMNOSCI SUWAKA POJEMNOSCIOWEGO
- */
- short int delta;
- unsigned short int konwersja[2]={0,0};
- TSI0_DATA |= TSI_DATA_SWTS_MASK; // Issue a scan
- while(!(TSI0_GENCS & (1<<TSI_GENCS_EOSF_SHIFT))); // Wait to complete
- TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear end of scan flag
- // ZAPISZ WYNIK POMIARU DO TABLICY
- konwersja[currentElectrode] = (TSI0_DATA &TSI_DATA_TSICNT_MASK);
- // OBLICZ DELTE WYKORZYSTUJAC AKTUALNY POMAIR I POMIAR Z PROCESU KALIBRACJI
- delta = konwersja[currentElectrode] - kalibracja[currentElectrode];
- // Handle underflow
- if( !delta)
- deltaResult[currentElectrode] = 0;
- else
- deltaResult[currentElectrode] = delta;
- SwapElectrode(); // Switch to other electrode
- } // end ScanTSI()
- unsigned char sliderPercentagePosition[2] = {NO_TOUCH,NO_TOUCH};
- unsigned char absolutePercentagePosition = NO_TOUCH;
- unsigned char ReadTSI(unsigned char stan)
- {
- // If there's a touch, calculate its position on slider
- if((deltaResult[0] >=THRESHOLD) || (deltaResult[1]>= THRESHOLD))
- { // jesli wyniki pomiaru sa wieksze od 100> przejdz do obliczen
- sliderPercentagePosition[0] = (deltaResult[0]*100)/(deltaResult[0]+deltaResult[1]);
- sliderPercentagePosition[1] = (deltaResult[1]*100)/(deltaResult[0]+deltaResult[1]);
- absolutePercentagePosition = ((100 - sliderPercentagePosition[0]) + sliderPercentagePosition[1])/2;
- }
- else
- {
- if(stan)
- { // No touch, purge variables to prevent spurious events // brak dotyku, nie rob nic
- sliderPercentagePosition[0] = NO_TOUCH;
- sliderPercentagePosition[1] = NO_TOUCH;
- absolutePercentagePosition = NO_TOUCH;
- }
- } // end else
- return ((unsigned char)absolutePercentagePosition);
- } // end ReadTSI()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement