//! 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
}
//Set GSEL high to disable glitching.
P5DIR|=0x80;
- P6DIR|=0x40;
+ P6DIR|=BIT6+BIT5;
P5OUT|=0x80;
- P6OUT|=0x40;
+ 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
+ CCR0 = glitchcount+0x15; //clock divider
+ TACTL |= MC_3;
_EINT(); // Enable interrupts
#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;
- //DAC12_0DAT = glitchL;
- /*
- switch(glitchstate){
- case 0:
- P1OUT|=1;
- glitchstate=1;
- DAC12_0DAT = glitchH;
- break;
- case 1:
- P1OUT|=1;
- glitchstate=0;
- DAC12_0DAT = glitchL;
- break;
- default:
- P1OUT&=~1;
- //Do nothing.
- break;
- }
- */
-#endif
+ 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.");
+ //debugstr("Set glitching voltages: GND and VCC");
+ //debughex(gnd);
+ //debughex(vcc);
#ifdef DAC12IR
ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref on
// Delay here for reference to settle.
for(i=0;i!=0xFFFF;i++) asm("nop");
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_0DAT = 0x0880;
+ 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],
txdata(app,verb,2);
break;
case START:
+ glitchvoltages(0xFFF,0);//Inverted VCC and GND.
+ P5OUT|=BIT7;//Normal
+ P5DIR|=BIT7;
+ while(1){
+ P5OUT&=~BIT7;//Glitch
+ //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");
+ }
+ txdata(app,verb,0);
+ break;
case STOP:
case GLITCHAPP:
default: