Rev 2 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*****************************************************************************
* Filename: timer.c *
* Author: Ziglioli Marco (Doctor Stein) *
* Date: 25/03/2001 *
* Last update: *
* Description: Contains routines used to interface with two 24 bits general *
* Purpouse Timer Conter on PCI6025E board *
*----------------------------------------------------------------------------*
* Notes: Pulse generation and position sensing isn't implemented yet *
*****************************************************************************/
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <drivers/pci6025e/timer.h>
/*****************************************************************************
* Reset the specified counter. If argument is grater than 1 both counters *
* will be reset *
*****************************************************************************/
void TIM_reset(BYTE ct)
{
switch(ct){
case C0: reset_counter_0(); break;
case C1: reset_counter_1(); break;
default: reset_counter_0(); reset_counter_1(); break;
}
}
void reset_counter_0(void)
{
set(joint_reset, 2);
DAQ_STC_Windowed_Mode_Write(JOINT_RESET, joint_reset); //Reset flag raised
clr(joint_reset, 2);
//clears some registers
g0_mode = g0_input_select = g0_command = g0_autoincrement = 0;
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
DAQ_STC_Windowed_Mode_Write(G0_INPUT_SELECT, g0_input_select);
DAQ_STC_Windowed_Mode_Write(G0_AUTOINCREMENT, g0_autoincrement);
interrupt_a_enable &= 0xFEBF;
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ENABLE, interrupt_a_enable);
//Set synchronized gate flag
set(g0_command, 8);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
interrupt_a_ack |= 0xC060;
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK, interrupt_a_ack);
DAQ_STC_Windowed_Mode_Write(G0_AUTOINCREMENT, g0_autoincrement);
}
void reset_counter_1(void)
{
set(joint_reset, 3);
DAQ_STC_Windowed_Mode_Write(JOINT_RESET, joint_reset); //Reset flag raised
clr(joint_reset, 3);
//clears some registers
g1_mode = g1_input_select = g1_command = g1_autoincrement = 0;
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
DAQ_STC_Windowed_Mode_Write(G1_INPUT_SELECT, g1_input_select);
DAQ_STC_Windowed_Mode_Write(G1_AUTOINCREMENT, g1_autoincrement);
interrupt_b_enable &= 0xF9FF;
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ENABLE, interrupt_b_enable);
//Set synchronized gate flag
set(g1_command, 8);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
interrupt_b_ack |= 0xC006;
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ACK, interrupt_b_ack);
DAQ_STC_Windowed_Mode_Write(G1_AUTOINCREMENT, g0_autoincrement);
}
/*****************************************************************************
* Arming the specified counter. If argument is grater than 1 both counters *
* will be armed *
*****************************************************************************/
void TIM_arm(BYTE counter)
{
switch(counter){
case C0: arm_counter_0(); break;
case C1: arm_counter_1(); break;
default: arm_counter_0(); arm_counter_1(); break;
}
}
void arm_counter_0(void)
{
set(g0_command, 0);
set(g1_command, 13);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
clr(g0_command, 0);
clr(g1_command, 13);
}
void arm_counter_1(void)
{
set(g1_command, 0);
set(g0_command, 13);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
clr(g1_command, 0);
clr(g0_command, 13);
}
/*****************************************************************************
* Disarming the specified counter. If argument is grater than 1 both *
* counters will be disarmed *
*****************************************************************************/
void TIM_disarm(BYTE counter)
{
switch(counter){
case C0: disarm_counter_0(); break;
case C1: disarm_counter_1(); break;
default: disarm_counter_0(); disarm_counter_1(); break;
}
}
void disarm_counter_0(void)
{
set(g0_command, 4);
set(g1_command, 15);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
clr(g0_command, 4);
clr(g1_command, 15);
}
void disarm_counter_1(void)
{
set(g1_command, 4);
set(g0_command, 15);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
clr(g1_command, 4);
clr(g0_command, 15);
}
/*****************************************************************************
* DWORD TIM_readCounter(BYTE counter) *
*----------------------------------------------------------------------------*
* Use this function to read counter value while it's armed and without *
* disturbing the counting process. *
* Counter specifies which counter will be readed *
*****************************************************************************/
DWORD TIM_readCounter(BYTE counter)
{
DWORD s1, s2;
if(counter == C0){
clr(g0_command, 1);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
set(g0_command, 1);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
clr(g0_command, 1);
s1 = (DWORD)DAQ_STC_Windowed_Mode_Read(G0_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G0_SAVE_HI) << 16);
s2 = (DWORD)DAQ_STC_Windowed_Mode_Read(G0_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G0_SAVE_HI) << 16);
if(s1 != s2)
s1 = (DWORD)DAQ_STC_Windowed_Mode_Read(G0_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G0_SAVE_HI) << 16);
} else {
clr(g1_command, 1);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
set(g1_command, 1);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
clr(g1_command, 1);
s1 = (DWORD)DAQ_STC_Windowed_Mode_Read(G1_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G1_SAVE_HI) << 16);
s2 = (DWORD)DAQ_STC_Windowed_Mode_Read(G1_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G1_SAVE_HI) << 16);
if(s1 != s2)
s1 = (DWORD)DAQ_STC_Windowed_Mode_Read(G1_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G1_SAVE_HI) << 16);
}
return s1;
}
/*****************************************************************************
* DWORD TIM_readHWSaveReg(BYTE counter) *
*----------------------------------------------------------------------------*
* Use this function to read the value in Hardware save registers. *
* Counter specifies which counter will be readed *
*****************************************************************************/
DWORD TIM_readHWSaveReg(BYTE counter)
{
DWORD s1;
if(counter == C0){
if( (DAQ_STC_Windowed_Mode_Read(AI_STATUS_1) & 0x0004) != 0 )
s1 = (DWORD)DAQ_STC_Windowed_Mode_Read(G0_HW_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G0_HW_SAVE_HI) << 16);
} else {
if( (DAQ_STC_Windowed_Mode_Read(AO_STATUS_1) & 0x0004) != 0 )
s1 = (DWORD)DAQ_STC_Windowed_Mode_Read(G1_HW_SAVE_LO) +
((DWORD)DAQ_STC_Windowed_Mode_Read(G1_HW_SAVE_HI) << 16);
}
return s1;
}
/*****************************************************************************
*void TIM_eventCounting(BYTE counter, BYTE source, BYTE gate, *
* BYTE interrupts, DWORD in) *
*----------------------------------------------------------------------------*
* Use this function to perform an event counting through source line *
* selected and, in the case of gating event counting, when gate enable *
* counting operation *
* Parameters: *
* counter: select which counter must perform counting *
* source: bit 0..4: source select: 0 G_IN_TIMEBASE1 *
* 1 through 10 PFI 0..9 *
* 11 through 17 RTSI 0..6 *
* 18 IN_TIMEBASE_2 *
* 19 other G_TC *
* bit 5: source polarity: 0 counting rising edge *
* 1 counting falling edge *
* bit 6: output polarity of G_OUT 0 active hi *
* 1 active lo *
* bit 7: counting direction 0 down counting *
* 1 up counting *
* gate: bit 0..4: gate select: 1 through 10 PFI 0..9 *
* 11 through 17 RTSI 0..6 *
* 18 IN_TIMEBASE2 *
* 19 UI2_TC *
* 20 other G_TC *
* 21 AI_START1 *
* 31 Logic low (not gated count) *
* bit 5: gate polarity 0 active high *
* 1 active low *
* bit 6..7 output mode for G_OUT: 1 one clock cycle output *
* 2 toggle on TC *
* 3 toggle on TC or gate *
* interrupts: bit 0: Terminal Count Interrupt enable *
* bit 1: Gate Interrupt enable *
* in: Initial value loaded into the counter *
*****************************************************************************/
void TIM_eventCounting(BYTE counter, BYTE source, BYTE gate,
BYTE interrupts, DWORD in)
{
in &= 0x00FFFFFF;
if(counter == C0){
clr(g0_mode, 7);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_HI, (WORD)(in >> 16));
set(g0_command, 2);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
clr(g0_command, 2);
g0_input_select &= 0x0003; //reset bits that I'm going to manage
g0_input_select |= (source & 0x1F) << 2; //Source selected
if(source & 0x20) set(g0_input_select, 15); //Source polarity
else clr(g0_input_select, 15);
g0_input_select |= (gate & 0x1F) << 7; //Gate selected
/* GI_OR_GATE = 0
GI_GATE_SELECT_LOAD_SOURCE = 0
this bit is 0*/
if(source & 0x40) set(g0_input_select, 14);
else clr(g0_input_select, 14);
g0_mode &= 0x8080;
if(gate & 0x20) set(g0_mode, 13);
else clr(g0_mode, 13);
g0_mode |= (gate & 0xC0) << 2;
g0_mode |= 0x0011;
g0_command &= 0xE79F;
if(source & 0x80) set(g0_command, 5);
interrupt_a_enable &= 0xFEBF;
if(interrupts & 0x01) set(interrupt_a_enable, 6);
if(interrupts & 0x02) set(interrupt_a_enable, 8);
DAQ_STC_Windowed_Mode_Write(G0_INPUT_SELECT, g0_input_select);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ENABLE, interrupt_a_enable);
} else {
clr(g1_mode, 7);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_HI, (WORD)(in >> 16));
set(g1_command, 2);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
clr(g1_command, 2);
g1_input_select &= 0x0003; //reset bits that I'm going to manage
g1_input_select |= (source & 0x1F) << 2; //Source selected
if(source & 0x20) set(g1_input_select, 15); //Source polarity
else clr(g1_input_select, 15);
g1_input_select |= (gate & 0x1F) << 7; //Gate selected
/* Gi_OR_GATE = 0
Gi_GATE_SELECT_LOAD_SOURCE = 0
this bit is 0*/
if(source & 0x40) set(g1_input_select, 14);
else clr(g1_input_select, 14);
g1_mode &= 0x8080;
if(gate & 0x20) set(g1_mode, 13);
else clr(g1_mode, 13);
g1_mode |= (gate & 0xC0) << 2;
g1_mode |= 0x0011;
g1_command &= 0xE79F;
if(source & 0x80) set(g1_command, 5);
interrupt_b_enable &= 0xF9FF;
if(interrupts & 0x01) set(interrupt_b_enable, 9);
if(interrupts & 0x02) set(interrupt_b_enable, 10);
DAQ_STC_Windowed_Mode_Write(G1_INPUT_SELECT, g1_input_select);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ENABLE, interrupt_b_enable);
}
}
/*****************************************************************************
* void TIM_bufferedEventCounting(BYTE counter, BYTE source, BYTE gate, *
* BYTE cumulative, DWORD in) *
*----------------------------------------------------------------------------*
* Like previous function performs an event counting but saves into Hardware *
* save registers counter value when gate is enabled. *
* if parameter cumulative is 0 every activation of gate makes counter *
* resetting and starting from 0 the new count. If parameter is 1 the counting*
* is cumulative and counter doesn't reset. *
*****************************************************************************/
void TIM_bufferedEventCounting(BYTE counter, BYTE source, BYTE gate,
BYTE cumulative, DWORD in)
{
in &= 0x00FFFFFF;
if(counter == C0){
clr(g0_mode, 7);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_HI, (WORD)(in >> 16));
set(g0_command, 2);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
clr(g0_command, 2);
g0_input_select &= 0x0003; //reset bits that I'm going to manage
g0_input_select |= (source & 0x1F) << 2; //Source selected
if(source & 0x20) set(g0_input_select, 15); //Source polarity
else clr(g0_input_select, 15);
g0_input_select |= (gate & 0x1F) << 7; //Gate selected
/* GI_OR_GATE = 0
GI_GATE_SELECT_LOAD_SOURCE = 0
this bit is 0*/
if(source & 0x40) set(g0_input_select, 14);
else clr(g0_input_select, 14);
g0_mode &= 0x0080;
if(gate & 0x20) set(g0_mode, 13);
else clr(g0_mode, 13);
g0_mode |= (gate & 0xC0) << 2;
g0_mode |= 0x0011;
set(g0_mode, 15);
if(!cumulative)
set(g0_mode, 14);
g0_mode |= 0x001A;
g0_command &= 0xE79F;
if(source & 0x80) set(g0_command, 5);
interrupt_a_enable &= 0xFEBF;
set(interrupt_a_enable, 8);
DAQ_STC_Windowed_Mode_Write(G0_INPUT_SELECT, g0_input_select);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ENABLE, interrupt_a_enable);
} else {
clr(g1_mode, 7);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_HI, (WORD)(in >> 16));
set(g1_command, 2);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
clr(g1_command, 2);
g1_input_select &= 0x0003; //reset bits that I'm going to manage
g1_input_select |= (source & 0x1F) << 2; //Source selected
if(source & 0x20) set(g1_input_select, 15); //Source polarity
else clr(g1_input_select, 15);
g1_input_select |= (gate & 0x1F) << 7; //Gate selected
/* GI_OR_GATE = 0
GI_GATE_SELECT_LOAD_SOURCE = 0
this bit is 0*/
if(source & 0x40) set(g1_input_select, 14);
else clr(g1_input_select, 14);
g1_mode &= 0x0080;
if(gate & 0x20) set(g1_mode, 13);
else clr(g1_mode, 13);
g1_mode |= (gate & 0xC0) << 2;
g1_mode |= 0x0011;
set(g1_mode, 15);
if(!cumulative)
set(g1_mode, 14);
g1_mode |= 0x001A;
g1_command &= 0xE79F;
if(source & 0x80) set(g1_command, 5);
interrupt_b_enable &= 0xFEBF;
set(interrupt_b_enable, 8);
DAQ_STC_Windowed_Mode_Write(G1_INPUT_SELECT, g1_input_select);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ENABLE, interrupt_b_enable);
}
}
/*****************************************************************************
* void TIM_timeMeasurement(BYTE counter, BYTE source, BYTE, gate, BYTE type *
* BYTE itr, DWORD in) *
*----------------------------------------------------------------------------*
* Use this function to perform a single period or a single pulsewidth *
* measurement. Parameters "counter source gate and in" are equal to previous *
* function so watch above. *
* Other parameters: type: specifies type of measure: (0)single period *
* (1)pulsewidth *
* itr: specifies which interrupt events enable: *
* bit 0 enable TC event *
* bit 1 enable gate event *
*****************************************************************************/
void TIM_timeMeasurement(BYTE counter, BYTE source, BYTE gate, BYTE type,
BYTE itr, DWORD in)
{
if(counter == C0){
clr(g0_mode, 7);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_HI, (WORD)(in >> 16));
set(g0_command, 2);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
clr(g0_command, 2);
g0_input_select &= 0x0003;
g0_input_select |= (source & 0x1F) << 2;
if(source & 0x20) set(g0_input_select, 15);
g0_input_select |= (gate & 0x1F) << 7;
if(source & 0x40) set(g0_input_select, 14);
g0_mode &= 0x0080;
if(gate & 0x20) set(g0_mode, 13);
g0_mode |= ((WORD)gate & 0x00C0) << 2;
if(!type) g0_mode |= 0x8802;
else g0_mode |= 0x4811;
g0_command &= 0xE79F;
set(g0_command, 5);
interrupt_a_enable &= 0xFEBF;
if(itr & 0x01) set(interrupt_a_enable, 6);
if(itr & 0x02) set(interrupt_a_enable, 8);
DAQ_STC_Windowed_Mode_Write(G0_INPUT_SELECT, g0_input_select);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ENABLE, interrupt_a_enable);
} else {
clr(g1_mode, 7);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_HI, (WORD)(in >> 16));
set(g1_command, 2);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
clr(g1_command, 2);
g1_input_select &= 0x0003;
g1_input_select |= (source & 0x1F) << 2;
if(source & 0x20) set(g1_input_select, 15);
g1_input_select |= (gate & 0x1F) << 7;
if(source & 0x40) set(g1_input_select, 14);
g1_mode &= 0x0080;
if(gate & 0x20) set(g1_mode, 13);
g1_mode |= ((WORD)gate & 0x00C0) << 2;
if(!type) g1_mode |= 0x8802;
else g1_mode |= 0x4811;
g1_command &= 0xE79F;
set(g1_command, 5);
interrupt_b_enable &= 0xF9FF;
if(itr & 0x01) set(interrupt_a_enable, 9);
if(itr & 0x02) set(interrupt_a_enable, 10);
DAQ_STC_Windowed_Mode_Write(G1_INPUT_SELECT, g1_input_select);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ENABLE, interrupt_b_enable);
}
}
/*****************************************************************************
* void TIM_bufferedTimeMeasurement(BYTE counter, BYTE source, BYTE gate, *
* BYTE type, DWORD in) *
*----------------------------------------------------------------------------*
* Use this function to perform a period or semiperiod or pulsewidth multiple *
* measurement. Refer to DAQ-STC technical reference manual to understand what*
* are this kind of measurement. See above TIM_eventCounting for parameters *
* counter, source, gate, in. *
* Parameter type: type of buffered measurement: (0)period *
* (1)semiperiod *
* (2)pulsewidth *
*****************************************************************************/
void TIM_bufferedTimeMeasurement(BYTE counter, BYTE source, BYTE gate,
BYTE type, DWORD in)
{
if(counter == C0){
clr(g0_mode, 7);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G0_LOAD_A_HI, (WORD)(in >> 16));
set(g0_command, 2);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
clr(g0_command, 2);
g0_input_select &= 0x0003;
g0_input_select |= (source & 0x1F) << 2;
if(source & 0x20) set(g0_input_select, 15);
g0_input_select |= (gate & 0x1F) << 7;
if(source & 0x40) set(g0_input_select, 14);
g0_mode &= 0x0080;
if(gate & 0x20) set(g0_mode, 13);
g0_mode |= ((WORD)gate & 0x00C0) << 2;
switch(type){
case 0: g0_mode |= 0x401A; break;
case 1: g0_mode |= 0x401F; break;
case 2: g0_mode |= 0x4019; break;
default: g0_mode |= 0x401A; break;
}
g0_command &= 0xE79F;
set(g0_command, 5);
interrupt_a_enable &= 0xFEBF;
set(interrupt_a_enable, 8);
DAQ_STC_Windowed_Mode_Write(G0_INPUT_SELECT, g0_input_select);
DAQ_STC_Windowed_Mode_Write(G0_MODE, g0_mode);
DAQ_STC_Windowed_Mode_Write(G0_COMMAND, g0_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ENABLE, interrupt_a_enable);
} else {
clr(g1_mode, 7);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_LO, (WORD)in);
DAQ_STC_Windowed_Mode_Write(G1_LOAD_A_HI, (WORD)(in >> 16));
set(g1_command, 2);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
clr(g1_command, 2);
g1_input_select &= 0x0003;
g1_input_select |= (source & 0x1F) << 2;
if(source & 0x20) set(g1_input_select, 15);
g1_input_select |= (gate & 0x1F) << 7;
if(source & 0x40) set(g1_input_select, 14);
g1_mode &= 0x0080;
if(gate & 0x20) set(g1_mode, 13);
g1_mode |= ((WORD)gate & 0x00C0) << 2;
switch(type){
case 0: g1_mode |= 0x401A; break;
case 1: g1_mode |= 0x401F; break;
case 2: g1_mode |= 0x4019; break;
default: g1_mode |= 0x401A; break;
}
g1_command &= 0xE79F;
set(g1_command, 5);
interrupt_b_enable &= 0xF9FF;
set(interrupt_a_enable, 10);
DAQ_STC_Windowed_Mode_Write(G1_INPUT_SELECT, g1_input_select);
DAQ_STC_Windowed_Mode_Write(G1_MODE, g1_mode);
DAQ_STC_Windowed_Mode_Write(G1_COMMAND, g1_command);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ENABLE, interrupt_b_enable);
}
}
/* End of file: Timer.c */