/*! \file command.c
\author Travis Goodspeed
- \brief These functions manage command interpretation.
+ \brief These functions manage command interpretation and timing.
*/
#include "command.h"
//! brief Debug a hex word string.
void debughex(u16 v) {
- unsigned char a[7];
- a[0]='0'; a[1]='x';
-
- a[2]=0xf&(v>>12);
- a[2]+=(a[2]>9)?('a'-10):'0';
-
- a[3]=0xf&(v>>8);
- a[3]+=(a[3]>9)?('a'-10):'0';
-
- a[4]=0xf&(v>>4);
- a[4]+=(a[4]>9)?('a'-10):'0';
-
- a[5]=0xf&(v>>0);
- a[5]+=(a[5]>9)?('a'-10):'0';
-
- a[6]=0;
+ debugbytes((void *)&v, 2);
+}
- txstring(0xFF,0xFF,a);
+//! brief Debug a hex word string.
+void debughex32(u32 v) {
+ debugbytes((void *)&v, 4);
}
/*! \brief Transmit debug bytes.
/* To better satisfy the somewhat odd timing requirements for
- dsPIC33F/PIC24H ICSP programming, and for better control of GoodFET
- timing more generally, here are a few delay routines that use Timer A.
+ PIC33F/24H/24F ICSP programming, and for better control of GoodFET
+ timing more generally, here are a few delay routines that use Timer B.
Note that I wrote these referring only to the MSP430x2xx family
manual. Beware on MSP430x1xx chips. Further note that, assuming
delaying slightly longer than requested. */
void prep_timer()
{
- BCSCTL2 = 0x00; /* In particular, use DCOCLK as SMCLK source with
- divider 1. Hence, Timer A ticks with system
- clock at 16 MHz. */
+ BCSCTL2 = 0x00; /* In particular, use DCOCLK as SMCLK source with
+ divider 1. Hence, Timer B ticks with system
+ clock at 16 MHz. */
- TACTL = 0x0204; /* Driven by SMCLK; disable Timer A interrupts;
- reset timer in case it was previously in use */
+ TBCTL = 0x0204; /* Driven by SMCLK; disable Timer B interrupts;
+ reset timer in case it was previously in use */
}
//! Delay for specified number of milliseconds (given 16 MHz clock)
void delay_ms( unsigned int ms )
{
- // 16000 ticks = 1 ms
- TACTL |= 0x20; // Start timer!
- while (ms--) {
- while (TAR < 16000)
- asm( "nop" );
- TACTL = 0x0224;
- }
- TACTL = 0x0204; // Reset Timer A, till next time
+ // 16000 ticks = 1 ms
+ TBCTL |= 0x20; // Start timer!
+ while (ms--) {
+ while (TBR < 16000)
+ asm( "nop" );
+ TBCTL = 0x0224;
+ }
+ TBCTL = 0x0204; // Reset Timer B, till next time
}
//! Delay for specified number of microseconds (given 16 MHz clock)
void delay_us( unsigned int us )
{
- // 16 ticks = 1 us
- TACTL |= 0x20; // Start timer!
- while (us--) {
- while (TAR < 16)
- asm( "nop" );
- TACTL = 0x0224;
- }
- TACTL = 0x0204; // Reset Timer A, till next time
+ // 16 ticks = 1 us
+ TBCTL |= 0x20; // Start timer!
+ while (us--) {
+ while (TBR < 16)
+ asm( "nop" );
+ TBCTL = 0x0224;
+ }
+ TBCTL = 0x0204; // Reset Timer B, till next time
}
//! Delay for specified number of clock ticks (16 MHz clock implies 62.5 ns per tick).
void delay_ticks( unsigned int num_ticks )
{
- TACTL |= 0x20; // Start timer
- while (TAR < num_ticks)
- asm( "nop" );
- TACTL = 0x0204; // Reset Timer A, till next time
+ TBCTL |= 0x20; // Start timer
+ while (TBR < num_ticks)
+ asm( "nop" );
+ TBCTL = 0x0204; // Reset Timer B, till next time
}