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.
Revision 8:45a0205a298f, committed 2018-12-06
- Comitter:
- andrewboyson
- Date:
- Thu Dec 06 11:40:19 2018 +0000
- Parent:
- 7:024ace6d943c
- Commit message:
- Backing up
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/1-wirenew.h Thu Dec 06 11:40:19 2018 +0000
@@ -0,0 +1,53 @@
+#include "mbed.h"
+#include "io.h"
+
+static void timer0_IRQHandler(void)
+{
+ //Handle match channel 0
+ if (LPC_TIM0->IR & 1)
+ {
+ LPC_TIM0->IR = 1; //Writing a logic one to the corresponding IR bit will reset the interrupt. Writing a zero has no effect. See 21.6.1.
+ }
+ //Handle match channel 1
+ if (LPC_TIM0->IR & 2)
+ {
+ LPC_TIM0->IR = 2;
+ }
+ //Handle match channel 2
+ if (LPC_TIM0->IR & 4)
+ {
+ LPC_TIM0->IR = 4;
+ }
+ //Handle match channel 3
+ if (LPC_TIM0->IR & 8)
+ {
+ LPC_TIM0->IR = 8;
+ }
+ Led1 = !Led1
+}
+
+void OneWireNewSetup(int us0, int us1, int us2, int us3)
+{
+ LPC_TIM0->MR0 = us0; // 21.6.7 Match Register 0 - Match count
+ LPC_TIM0->MR1 = us1; // 21.6.7 Match Register 1 - Match count
+ LPC_TIM0->MR2 = us2; // 21.6.7 Match Register 2 - Match count
+ LPC_TIM0->MR3 = us3; // 21.6.7 Match Register 3 - Match count
+ LPC_TIM0->TCR = 1; // 21.6.2 Timer Control Register - Enable TC and PC
+}
+
+int OneWireNewInit()
+{
+ NVIC_SetVector (TIMER0_IRQn,(uint32_t)&timer0_IRQHandler);
+ NVIC_SetPriority(TIMER0_IRQn, 1);
+ LPC_SC->PCONP |= 2; // 4.8.9 Power Control for Peripherals register - Timer0 Power On
+ LPC_TIM0->TCR = 2; // 21.6.2 Timer Control Register - Reset TC and PC
+ LPC_TIM0->CTCR = 0; // 21.6.3 Count Control Register - Timer mode
+ LPC_TIM0->PR = 95; // 21.6.5 Prescale register - Prescale 96MHz clock to 1Mhz. When PC is equal to this value, the next clock increments the TC and clears the PC
+ LPC_TIM0->MCR = 07111; // 21.6.8 Match Control Register - Interrupt on match 2, 1, and 0; stop, reset and interrupt on match 3
+ NVIC_EnableIRQ(TIMER0_IRQn);
+ return 0;
+}
+int OneWireNewMain()
+{
+ return 0;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extrtc.cpp Thu Dec 06 11:40:19 2018 +0000
@@ -0,0 +1,81 @@
+#include "mbed.h"
+
+static SPI device(p5, p6, p7); // mosi, miso, sclk
+static DigitalOut cs(p8, 1); // ssel
+
+/*
+| BIT 7 | BIT 6 | BIT 5 | BIT 4 | BIT 3 | BIT 2 | BIT 1 | BIT 0 |
++-------+-------+-------+-------+-------+-------+-------+-------+
+| - | 10 Seconds | Seconds | 00–59
++-------+-------+-------+-------+-------+-------+-------+-------+
+| - | 10 Minutes | Minutes | 00–59
++-------+-------+-------+-------+-------+-------+-------+-------+
+| - | - | 10 Hours | Hours | 00-23
++-------+-------+-------+-------+-------+-------+-------+-------+
+| - | - | - | - | - | Weekday | 1-7
++-------+-------+-------+-------+-------+-------+-------+-------+
+| - | - | 10 Days | Days | 01-31
++-------+-------+-------+-------+-------+-------+-------+-------+
+|Century| - | - | 10 Mo | Months | 01-12
++-------+-------+-------+-------+-------+-------+-------+-------+
+| 10 Years | Years | 00-99
++-------+-------+-------+-------+-------+-------+-------+-------+
+*/
+static char bcdToInt(char bcd)
+{
+ return 0;
+}
+static char intToBcd(char i)
+{
+ return 0;
+}
+void ExtRtcSet(struct tm *ptm)
+{
+ char bcd;
+ cs = 0;
+ device.write(0x80); //Send address 00h
+ bcd = intToBcd(ptm->tm_sec ); device.write(bcd);
+ bcd = intToBcd(ptm->tm_min ); device.write(bcd);
+ bcd = intToBcd(ptm->tm_hour); device.write(bcd);
+ bcd = ptm->tm_wday; device.write(bcd);
+ bcd = intToBcd(ptm->tm_mday); device.write(bcd);
+ int year = ptm->tm_year;
+ bcd = intToBcd(ptm->tm_mon);
+ if (year > 99) bcd |= 0x80;
+ device.write(bcd);
+ if (year > 99) year -=100;
+ bcd = intToBcd(year);
+ device.write(bcd);
+ cs = 1;
+}
+void ExtRtcGet(struct tm *ptm)
+{
+ char bcd;
+ cs = 0;
+ device.write(0x00); //Send address 00h
+ bcd = device.write(0xFF); ptm->tm_sec = bcdToInt(bcd);
+ bcd = device.write(0xFF); ptm->tm_min = bcdToInt(bcd);
+ bcd = device.write(0xFF); ptm->tm_hour = bcdToInt(bcd);
+ bcd = device.write(0xFF); ptm->tm_wday = bcd;
+ bcd = device.write(0xFF); ptm->tm_mday = bcdToInt(bcd);
+ bcd = device.write(0xFF);
+ int century = bcd & 0x80;
+ bcd &= 0x7F;
+ ptm->tm_mon = bcdToInt(bcd);
+ bcd = device.write(0xFF);
+ ptm->tm_year = bcdToInt(bcd);
+ if (century) ptm->tm_year += 100;
+ cs = 1;
+}
+
+int ExtRtcMain()
+{
+ return 0;
+}
+int ExtRtcInit()
+{
+ cs = 1;
+ device.format(8, 1);
+ device.frequency(1000000);
+ return 0;
+}
\ No newline at end of file
--- a/mbed.bld Thu Jun 02 09:26:28 2016 +0000 +++ b/mbed.bld Thu Dec 06 11:40:19 2018 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/7c328cabac7e \ No newline at end of file +https://mbed.org/users/mbed_official/code/mbed/builds/794e51388b66 \ No newline at end of file
--- a/server.cpp Thu Jun 02 09:26:28 2016 +0000
+++ b/server.cpp Thu Dec 06 11:40:19 2018 +0000
@@ -164,13 +164,7 @@
len = 0;
struct tm tm;
TimeGetTm(&tm);
- len = addChunkF(len, "Time (UTC): %d-%02d-%02d %02d:%02d:%02d ",
- tm.tm_year + 1900,
- tm.tm_mon + 1,
- tm.tm_mday,
- tm.tm_hour,
- tm.tm_min,
- tm.tm_sec);
+ len = addChunkF(len, "Time: %d-%02d-%02d ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
switch(tm.tm_wday)
{
case 0: len = addChunk(len, "Sun"); break;
@@ -182,6 +176,7 @@
case 6: len = addChunk(len, "Sat"); break;
default: len = addChunk(len, "???"); break;
}
+ len = addChunkF(len, " %02d:%02d:%02d UTC", tm.tm_hour, tm.tm_min, tm.tm_sec);
len = addChunk (len, "<br/><br/>\r\n");
len = addChunkF(len, "Scan µs: %d<br/><br/>\r\n", TimeScanUs);
lineToSendToId[id] += 1;
--- a/time.cpp Thu Jun 02 09:26:28 2016 +0000
+++ b/time.cpp Thu Dec 06 11:40:19 2018 +0000
@@ -33,18 +33,14 @@
//Add a year at a time while there is more than a year of days left
int year = 1970; //Unix epoch is 1970
int dayOfWeek = 4; //1 Jan 1970 is a Thursday
- int dayOfYear;
int leapYear;
while(1)
{
//See if it is a leap year
- int year4 = !(year % 4);
- int year100 = !(year % 100);
- int year400 = !(year % 400);
- leapYear = false;
- if (year4) leapYear = true;
- if (year100) leapYear = false;
- if (year400) leapYear = true;
+ leapYear = false;
+ if (year % 4 == 0) leapYear = true;
+ if (year % 100 == 0) leapYear = false;
+ if (year % 400 == 0) leapYear = true;
//Find the number of days in this year
int daysInYear = leapYear ? 366 : 365;
@@ -61,30 +57,18 @@
year++;
}
- dayOfYear = daysLeft;
+ //Days left contains the days left from the start (1 Jan) of the current year
+ int dayOfYear = daysLeft + 1;
dayOfWeek += daysLeft;
dayOfWeek %= 7;
//Add a month at a time while there is more than a month of days left
- int month = 0;
+ static char monthlengths[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ int month = 1;
while(1)
{
- int daysInMonth;
- switch (month + 1)
- {
- case 1: daysInMonth = 31; break;
- case 2: daysInMonth = leapYear ? 29 : 28; break;
- case 3: daysInMonth = 31; break;
- case 4: daysInMonth = 30; break;
- case 5: daysInMonth = 31; break;
- case 6: daysInMonth = 30; break;
- case 7: daysInMonth = 31; break;
- case 8: daysInMonth = 31; break;
- case 9: daysInMonth = 30; break;
- case 10: daysInMonth = 31; break;
- case 11: daysInMonth = 30; break;
- case 12: daysInMonth = 31; break;
- }
+ int daysInMonth = monthlengths[month-1];
+ if (month == 2 && leapYear) daysInMonth++;
//Stop if this is the last month
if (daysLeft < daysInMonth) break;
@@ -93,15 +77,49 @@
daysLeft -= daysInMonth;
month++;
}
-
- ptm->tm_sec = seconds;
- ptm->tm_min = minutes;
- ptm->tm_hour = hours;
- ptm->tm_mday = daysLeft + 1;
- ptm->tm_mon = month;
- ptm->tm_year = year - 1900;
- ptm->tm_wday = dayOfWeek;
- ptm->tm_yday = dayOfYear;
+
+ //Days left contains the days left from the start (1st) of the current month
+ int dayOfMonth = daysLeft + 1;
+
+ //Find the last Sunday in the month
+ int lastSunday = monthlengths[month-1];
+ while (lastSunday > 0)
+ {
+ int weekday = (dayOfWeek + lastSunday - dayOfMonth) % 7;
+ if (weekday == 0) break; //Stop when weekday is Sunday
+ lastSunday--;
+ }
+
+ //Work out if Daylight Saving Time applies
+ int dst;
+ if (month <= 2) dst = false; //Jan, Feb
+ if (month == 3) //Mar - DST true after 1am UTC on the last Sunday in March
+ {
+ if (dayOfMonth < lastSunday) dst = false;
+ if (dayOfMonth == lastSunday) dst = hours >= 1;
+ if (dayOfMonth > lastSunday) dst = true;
+ }
+ if (month >= 4 && month <= 9) dst = true; //Apr, May, Jun, Jul, Aug, Sep
+ if (month == 10) //Oct - DST false after 1am UTC on the last Sunday in October
+ {
+ if (dayOfMonth < lastSunday) dst = true;
+ if (dayOfMonth == lastSunday) dst = hours < 1;
+ if (dayOfMonth > lastSunday) dst = false;
+ }
+ if (month >= 11) dst = false; //Nov, Dec
+
+
+ //Set up the broken time TM structure
+ ptm->tm_sec = seconds; // 00 --> 59
+ ptm->tm_min = minutes; // 00 --> 59
+ ptm->tm_hour = hours; // 00 --> 23
+ ptm->tm_mday = dayOfMonth; // 01 --> 31
+ ptm->tm_mon = month - 1; // 00 --> 11
+ ptm->tm_year = year - 1900; // Years since 1900
+ ptm->tm_wday = dayOfWeek; // 0 --> 6 where 0 == Sunday
+ ptm->tm_yday = dayOfYear - 1; // 0 --> 365
+ ptm->tm_isdst = dst; // +ve if DST, 0 if not DSTime, -ve if the information is not available. Note that 'true' evaluates to +1.
+
}
void TimeGetTm(struct tm* ptm)
{