Вот фрагмент схемы
Нажмите для просмотра прикрепленного файлаи код
CODE
#include <avr/io.h>
#include <touch_api.h>
#include <avr/interrupt.h>
extern y_line_info_t y_line_info[NUM_Y_LINES];
extern x_line_info_t x_line_info[NUM_X_LINES];
x_line_info_t x_line_info[NUM_X_LINES]= {
FILL_OUT_X_LINE_INFO( 1,0u ),
FILL_OUT_X_LINE_INFO( 1,1u ),
FILL_OUT_X_LINE_INFO( 1,2u ),
FILL_OUT_X_LINE_INFO( 1,3u ),
FILL_OUT_X_LINE_INFO( 1,4u ),
FILL_OUT_X_LINE_INFO( 1,5u ),
FILL_OUT_X_LINE_INFO( 1,6u ),
FILL_OUT_X_LINE_INFO( 1,7u )
};
y_line_info_t y_line_info[NUM_Y_LINES]= {
FILL_OUT_Y_LINE_INFO(1u),
FILL_OUT_Y_LINE_INFO(0u)
};
uint16_t qt_measurement_period_msec = 25u;
/* flag set by timer ISR when it's time to measure touch */
static volatile uint8_t time_to_measure_touch = 0u;
/* current time, set by timer ISR */
static volatile uint16_t current_time_ms_touch = 0u;
static volatile unsigned int lastpos;
extern qt_touch_lib_measure_data_t qt_measure_data;
#define GET_SENSOR_STATE(SENSOR_NUMBER) qt_measure_data.qt_touch_status.sensor_states[SENSOR_NUMBER]
#define GET_SENSOR_POS(SENSOR_NUMBER) qt_measure_data.qt_touch_status.rotor_slider_values[SENSOR_NUMBER]
#define GET_SENSOR_SIGNAL(SENSOR_NUMBER) qt_measure_data.channel_signals[SENSOR_NUMBER]
#define GET_SENSOR_REFERENCE(SENSOR_NUMBER) qt_measure_data.channel_references[SENSOR_NUMBER]
void init()
{
/* disable pull-ups */
SFIOR |= (1 << PUD);
qt_reset_sensing();
qt_enable_rotor(CHANNEL_8, CHANNEL_15, NO_AKS_GROUP, 10u, 3, RES_8_BIT, 2u);
qt_init_sensing();
qt_config_data.qt_di = DEF_QT_DI;
qt_config_data.qt_neg_drift_rate = DEF_QT_NEG_DRIFT_RATE;
qt_config_data.qt_pos_drift_rate = DEF_QT_POS_DRIFT_RATE;
qt_config_data.qt_max_on_duration = DEF_QT_MAX_ON_DURATION;
qt_config_data.qt_drift_hold_time = DEF_QT_DRIFT_HOLD_TIME;
qt_config_data.qt_recal_threshold = DEF_QT_RECAL_THRESHOLD;
qt_config_data.qt_pos_recal_delay = DEF_QT_POS_RECAL_DELAY;
/* set timer compare value (how often timer ISR will fire) */
OCR1A = ( 1000 * qt_measurement_period_msec);
/* enable timer ISR */
TIMSK |= (1u << OCIE1A);
/* timer prescaler = system clock / 8 */
TCCR1B |= (1u << CS11);
/* timer mode = CTC (count up to compare value, then reset) */
TCCR1B |= (1u << WGM12);
}
volatile uint16_t status_flag;
volatile uint16_t status;
int main()
{
uint16_t burst_flag = 0u;
spi_init();
init();
sei();
/* loop forever */
for( ; ; )
{
if( time_to_measure_touch )
{
/* clear flag: it's time to measure touch */
time_to_measure_touch = 0u;
do
{
/* one time measure touch sensors */
status_flag = qt_measure_sensors( current_time_ms_touch );
burst_flag = status_flag & QTLIB_BURST_AGAIN;
if(status_flag & QTLIB_STATUS_CHANGE)
{
lastpos = GET_SENSOR_POS(0);
}
}while (burst_flag) ;
status = status_flag;
}
/* Time Non-critical host application code goes here */
}
return 0;
}
ISR(TIMER1_COMPA_vect)
{
/* set flag: it's time to measure touch */
time_to_measure_touch = 1u;
/* update the current time */
current_time_ms_touch += qt_measurement_period_msec;
}
ISR(SPISTC_vect)
{
if( SPDR == 0x01)
{
SPDR = (status & 0x0F) | ((status & 0x0F00) >> 8);
}
if( SPDR == 0x02)
{
SPDR = lastpos;
}
}
в опциях самого проекта делаю следующие дефайны:
-D_QMATRIX_=1
-DQT_NUM_CHANNELS=16
-DPORT_X_1=D
-DPORT_YB=A
-DPORT_YA=B
-DPORT_SMP=A
-DNUM_X_LINES=8
-DSMP_PIN=3
-DPORT_NUM_1=1
-DNUM_Y_LINES=2
-DNUM_X_PORTS=1
-DQT_MAX_NUM_ROTORS_SLIDERS=2
-DQT_DELAY_CYCLES=4
-D_ROTOR_SLIDER_