//! Call this before the function to be glitched.
void glitchprime(){
#ifdef DAC12IR
- //Set to high voltage.
- DAC12_0DAT = glitchH;
-
- //Reconfigure TACTL.
- TACTL=0; //Clear dividers.
- TACTL|=TACLR; //Clear TimerA Config
- TACTL|=
- TASSEL_SMCLK | //SMCLK source,
- MC_1 | //Count up to CCR0
- TAIE; //Enable Interrupt
- CCTL0 = CCIE; // CCR0 interrupt enabled
- CCR0 = glitchcount;
+ WDTCTL = WDTPW + WDTHOLD; // Stop WDT
- //Enable general interrupts, just in case.
+ glitchsetup();
_EINT();
+ return;
#endif
}
void glitchsetup(){
#ifdef DAC12IR
//Set GSEL high to disable glitching.
-
- P5DIR|=0x80;
- P6DIR|=BIT6+BIT5;
- P5OUT|=0x80;
+ //Normal voltage, use resistors instead of output.
+ //P5DIR=0x80; //ONLY glitch pin is output.
+ P5OUT|=0x80; //It MUST begin high.
+ //P5REN|=0x7F; //Resistors pull high and low weakly.
+
+ P6DIR|=BIT6+BIT5;
P6OUT|=BIT6+BIT5;
- glitchsetupdac();
-
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
TACTL = TASSEL1 + TACLR; // SMCLK, clear TAR
CCTL0 = CCIE; // CCR0 interrupt enabled
- CCR0 = glitchcount;
- TACTL |= MC1; // Start Timer_A in continuous mode
- _EINT(); // Enable interrupts
+ CCR0 = glitchcount+0x15; //clock divider
+ TACTL |= MC_3;
#endif
}
-//! Setup analog chain for glitching.
-void glitchsetupdac(){
- glitchvoltages(glitchL,glitchH);
-}
-
// Timer A0 interrupt service routine
-interrupt(TIMERA0_VECTOR) Timer_A (void)
-{
-#ifdef DAC12IR
- //debugstr("Glitching.");
- DAC12_0DAT = glitchL;
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- DAC12_0DAT = glitchH;
-#endif
- TACTL |= MC0; // Stop Timer_A;
+interrupt(TIMERA0_VECTOR) Timer_A (void){
+ P5OUT&=~BIT7;//Glitch
+ //P5DIR=BIT7; //All else high impedance.
+ P5OUT|=BIT7;//Normal
+ TACTL |= MC0;// Stop Timer_A;
+ return;
}
-
-
-u16 glitchH=0xfff, glitchL=0xfff,
- glitchstate=2, glitchcount=0;
+u16 glitchcount=0;
//! Glitch an application.
void glitchapp(u8 app){
//! Set glitching voltages.
-void glitchvoltages(u16 low, u16 high){
+void glitchvoltages(u16 gnd, u16 vcc){
int i;
- glitchH=high;
- glitchL=low;
+ //debugstr("Set glitching voltages: GND and VCC");
+ //debughex(gnd);
+ //debughex(vcc);
- //debugstr("Set glitching voltages.");
+ /** N.B., because this is confusing as hell. As per Page 86 of
+ SLAS541F, P6SEL is not what controls the use of the DAC0/DAC1
+ functions on P6.6 and P6.5. Instead, CAPD or DAC12AMP>0 sets
+ the state.
+ */
#ifdef DAC12IR
ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref on
DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
// 1.0V 0x0666, 2.5V 0x0FFF
- DAC12_0DAT = high;
- DAC12_1DAT = low;
+ DAC12_0DAT = vcc; //high;
+ DAC12_1DAT = gnd; //low;
#endif
}
//! Set glitching rate.
void glitchhandle(unsigned char app,
unsigned char verb,
unsigned long len){
+ P1OUT&=~1;
switch(verb){
case GLITCHVOLTAGES:
glitchvoltages(cmddataword[0],
while(1){
P5OUT&=~BIT7;//Glitch
//asm("nop");//asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
- asm("nop");asm("nop");
+ asm("nop"); //Not necessary.
P5OUT|=BIT7;//Normal
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");