Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: mbedInterface/mbedInterface.cpp
- Revision:
- 3:d7b0a0890d96
- Parent:
- 0:8dbd6bd9167f
- Child:
- 4:abee20c0bf2a
diff -r 35266b266eaa -r d7b0a0890d96 mbedInterface/mbedInterface.cpp
--- a/mbedInterface/mbedInterface.cpp Wed Jun 03 23:41:16 2015 +0000
+++ b/mbedInterface/mbedInterface.cpp Sat Oct 10 22:37:17 2015 +0000
@@ -9,6 +9,9 @@
//globals defined in hardwareInterface.cpp
extern uint32_t timeKeeper; //the master clock
+uint32_t uSec_SinceLastClockInc = 0;
+uint32_t uSec_SinceLastReset = 0;
+
extern bool resetTimer;
extern bool clockSlave;
extern bool changeToSlave;
@@ -20,7 +23,7 @@
#ifdef MBED_RF
-//Karpova version----------------------------------------
+//We are listening to an RF signal for hardware syncing----------------------------------------
//Uses DB9->RJ45 connector to map the following channels:
//1: P28 Clock Signal In
//2: P27 Data Signal In
@@ -93,7 +96,34 @@
//------------------------------------------------------------
#endif
+void externalClockIncDown() {
+ //The external clock increment signal pulse has come back down. If the pulse was long
+ //enough, then we condsider it a valid pulse (the pulses should be 0.5 ms long)
+ if ((clockSlave)&&(uSec_SinceLastClockInc >= 300)) {
+ uSec_SinceLastClockInc = 0;
+ timeKeeper++;
+
+ //Clock resets happen upon update so we dont get a partial first ms
+ if (resetTimer) {
+ uSec_SinceLastReset = 0;
+ timeKeeper = 0;
+ resetTimer = false;
+ }
+ }
+
+}
+
+void externalResetDown() {
+
+ //The external clock reset signal pulse has come back down. If the pulse was long
+ //enough, then we condsider it a valid pulse (the pulses should be 1 ms long)
+ if ((clockSlave)&&(uSec_SinceLastReset >= 700)) {
+ uSec_SinceLastReset = 0;
+ timeKeeper = 1; //It has been 1ms since the reset pulse went up
+ textDisplay << timeKeeper << " Clock reset\r\n";
+ }
+}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
@@ -102,27 +132,37 @@
//---------------------------------------------------------------------
//translate pin numbers to hardware pins
-PinName outPins[NUMPORTS] = {p11,p13,p15,p18,p21,p23,p25,p29,p20};
+//PinName outPins[NUMPORTS] = {p11,p13,p15,p18,p21,p23,p25,p29,p20};
+PinName outPins[NUMPORTS] = {p18,p15,p13,p11,p29,p25,p23,p21,p20};
PinName inPins[NUMPORTS] = {p12,p14,p16,p17,p22,p24,p26,p30,p7};
+
//The sound output uses a SmartWav device and their simple serial library
SMARTWAV sWav(p9,p10,p19); //(TX,RX,Reset);
//This is the callback for the MBED timer
extern "C" void TIMER0_IRQHandler (void) {
- if((LPC_TIM0->IR & 0x01) == 0x01) { // if MR0 interrupt, proceed
+ if (clockSlave) {
+ //The function is called every 100 us
+ uSec_SinceLastClockInc = uSec_SinceLastClockInc+100;
+ uSec_SinceLastReset = uSec_SinceLastReset+100;
+ } else {
+ //The function is called every 1 ms
+ if((LPC_TIM0->IR & 0x01) == 0x01) { // if MR0 interrupt, proceed
- LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
- timeKeeper++;
+ LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
+ timeKeeper++;
- if (resetTimer) {
- timeKeeper = 0;
- resetTimer = false;
+ if (resetTimer) {
+ timeKeeper = 0;
+ resetTimer = false;
+ }
}
}
+
}
//-----------------------------------------------------------------------
@@ -133,6 +173,7 @@
clockExternalIncrement(p8) {
clockResetInt.rise(this, &MBEDSystem::externalClockReset);
+ clockResetInt.fall(&externalResetDown);
clockResetInt.mode(PullDown);
clockExternalIncrement.mode(PullDown);
@@ -165,8 +206,9 @@
//LPC_SC->PCLKSEL1 |= (1 << 12); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
//LPC_SC->PCLKSEL0 &= (3 << 3); //mask
//LPC_SC->PCLKSEL0 |= (1 << 3); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
- LPC_SC->PCONP |=1<1; //timer0 power on
+ LPC_SC->PCONP |=1<1; //timer0 power on
LPC_TIM0->MR0 = 23980; //1 msec
+
//LPC_TIM0->PR = (SystemCoreClock / 1000000); //microsecond steps
//LPC_TIM0->MR0 = 1000; //100 msec
//LPC_TIM0->MR0 = (SystemCoreClock / 1000000); //microsecond steps
@@ -178,6 +220,14 @@
//--------------------------------------------------------------
}
+void MBEDSystem::pauseInterrupts() {
+ __disable_irq();
+}
+
+void MBEDSystem::resumeInterrupts() {
+ __enable_irq();
+}
+
void MBEDSystem::mainLoopToDo() {
#ifdef MBED_RF
//Karpova version--------------------------
@@ -225,25 +275,35 @@
void MBEDSystem::externalClockReset() {
+ //The pulse has gone high. When the pulse comes down we will check to see if it was long enough to be valid.
+ uSec_SinceLastReset = 0;
+
+
+ /*
if (clockSlave) {
LPC_TIM0->TCR = 0x02; // reset timer
externalIncrementCounter = 0;
immediateClockReset();
- }
+ }*/
}
void MBEDSystem::setStandAloneClock() {
- timerinit();
+ clockSlave = false;
+ NVIC_DisableIRQ(TIMER0_IRQn); // Disable the interrupt
+ timerinit(); //set up and enable interrupt
clockExternalIncrement.rise(NULL); //remove the callback to the external interrupt
- clockSlave = false;
+ //clockExternalIncrement.fall(NULL);
changeToSlave = false;
changeToStandAlone = false;
}
void MBEDSystem::setSlaveClock() {
+ clockSlave = true;
NVIC_DisableIRQ(TIMER0_IRQn); // Disable the interrupt
+ //timerinit(); //set up and enable interrupt
clockExternalIncrement.rise(this, &MBEDSystem::incrementClock);
+ //clockExternalIncrement.fall(&externalClockIncDown);
clockSlave = true;
changeToSlave = false;
changeToStandAlone = false;
@@ -252,6 +312,12 @@
void MBEDSystem::incrementClock() {
if (clockSlave) {
+ //The pulse has gone high. When the pulse comes down we will check to see if it was long enough to be valid.
+ //uSec_SinceLastClockInc = 0;
+
+
+ //The clock is incremented
+
externalIncrementCounter = (externalIncrementCounter+1) % externalIncrementMod;
if (externalIncrementCounter==0) {
timeKeeper++;
@@ -261,10 +327,12 @@
timeKeeper++;
}
//Clock resets happen upon update so we dont get a partial first ms
+ /*
if (resetTimer) {
+ uSec_SinceLastReset = 0;
timeKeeper = 0;
resetTimer = false;
- }
+ }*/
}
//-----------------------------------------------------
@@ -360,3 +428,16 @@
void MBEDSerialPort::writeChar(char s) {
serialToPC->printf("%c", s);
}
+
+int MBEDSerialPort::requestToWriteString(char *s, int numBytesRequested) {
+ //request to print a string to the serial output buffer
+ //function returns the number of chars actually accepted for output
+ int numBytesAccepted = 0;
+ while (numBytesAccepted < numBytesRequested) {
+
+ writeChar(*(s+numBytesAccepted));
+ numBytesAccepted++;
+ }
+
+ return numBytesAccepted;
+}