This has been verified with a GF31 board (hence x2274 chip) and
read/write/erase and dev ID extraction on dsPIC33FJ128GP710 and
PIC24FJ64GA002 chips.
Use of Timer B should work as specified on GF1x boards (hence
msp430f161x chips) based on my (cursory) review of the MSP430x1xx
family "user's guide." However note that this has still NOT been
tested on hardware.
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@643
12e2690d-a6be-4b82-a7b7-
67c4a43b65c8
void msdelay(unsigned int ms);
void msdelay(unsigned int ms);
-//! Prepare Timer A; call before using delay_ms or delay_us.
+//! Prepare Timer B; call before using delay_ms or delay_us.
void prep_timer();
//! Delay for specified number of milliseconds (given 16 MHz clock)
void prep_timer();
//! Delay for specified number of milliseconds (given 16 MHz clock)
/*! \file command.c
\author Travis Goodspeed
/*! \file command.c
\author Travis Goodspeed
- \brief These functions manage command interpretation.
+ \brief These functions manage command interpretation and timing.
/* To better satisfy the somewhat odd timing requirements for
/* 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
Note that I wrote these referring only to the MSP430x2xx family
manual. Beware on MSP430x1xx chips. Further note that, assuming
void prep_timer()
{
BCSCTL2 = 0x00; /* In particular, use DCOCLK as SMCLK source with
void prep_timer()
{
BCSCTL2 = 0x00; /* In particular, use DCOCLK as SMCLK source with
- divider 1. Hence, Timer A ticks with system
+ divider 1. Hence, Timer B ticks with system
- TACTL = 0x0204; /* Driven by SMCLK; disable Timer A interrupts;
+ TBCTL = 0x0204; /* Driven by SMCLK; disable Timer B interrupts;
reset timer in case it was previously in use */
}
reset timer in case it was previously in use */
}
void delay_ms( unsigned int ms )
{
// 16000 ticks = 1 ms
void delay_ms( unsigned int ms )
{
// 16000 ticks = 1 ms
- TACTL |= 0x20; // Start timer!
+ TBCTL |= 0x20; // Start timer!
- TACTL = 0x0204; // Reset Timer A, till next time
+ 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
}
//! Delay for specified number of microseconds (given 16 MHz clock)
void delay_us( unsigned int us )
{
// 16 ticks = 1 us
- TACTL |= 0x20; // Start timer!
+ TBCTL |= 0x20; // Start timer!
- TACTL = 0x0204; // Reset Timer A, till next time
+ 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 )
{
}
//! 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)
+ TBCTL |= 0x20; // Start timer
+ while (TBR < num_ticks)
- TACTL = 0x0204; // Reset Timer A, till next time
+ TBCTL = 0x0204; // Reset Timer B, till next time