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.
Fork of cdms_rtos_v1_1_test by
Revision 0:4da7c8fdd429, committed 2015-11-07
- Comitter:
- sureshsusurla
- Date:
- Sat Nov 07 09:55:44 2015 +0000
- Child:
- 1:c0c5ac8eac80
- Commit message:
- cdms_rtos_v1_1_working_01_11_2015;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cdms_rtc.cpp Sat Nov 07 09:55:44 2015 +0000 @@ -0,0 +1,151 @@ +#include "mbed.h" + +SPI rtc_spi(PTE1, PTE3, PTE2); // MOSI,MISO, CLOCK microcontroller(in order) +DigitalOut rtc_cs(PTE29); //Slave Select pin + +void FCTN_CDMS_INIT_RTC() +{ + rtc_cs=1; + rtc_spi.format(8,0); + rtc_spi.frequency(1000000); + //clearing the halt bit + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x8C); + rtc_spi.write(0x00); + + //clearing the OF bit + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x8F); + rtc_spi.write(0x00); + + //century bits + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x80|0x03); + rtc_spi.write(0x00); + + //Kick starting the oscillator + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x81); //register address with write flag + rtc_spi.write(0x80);//enabling stop bit in the seconds register + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x81); + rtc_spi.write(0x00);//disabling the stop bit to restart the oscillator + + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x80); + rtc_spi.write(0x01); // set milliseconds value to 00 + rtc_cs=1; + + rtc_cs=0; + rtc_spi.write(0x81); + rtc_spi.write(0x01); //set seconds value to 00 + rtc_cs=1; + + rtc_cs=0; + rtc_spi.write(0x82); + rtc_spi.write(0x01);//set minutes value to 00 + rtc_cs=1; + + rtc_cs=0; + rtc_spi.write(0x83); + rtc_spi.write(0x23); //set the hours to 01 + rtc_cs=1; + + rtc_cs=0; + rtc_spi.write(0x84); + rtc_spi.write(0x01); //set day of the week to 01 + rtc_cs=1; + + rtc_cs=0; + rtc_spi.write(0x85); + rtc_spi.write(0x31); //set date of the month to 01 + rtc_cs=1; + + rtc_cs=0; + rtc_spi.write(0x86); + rtc_spi.write(0x12); //set month to 01 + rtc_cs=1; + + rtc_cs=0; + rtc_spi.write(0x87); + rtc_spi.write(0x01); //set year to 00(2000) + rtc_cs=1; + printf("\n\r rtc initalised \n"); +} + +void FCTN_CDMS_RD_RTC() +{ + uint8_t response; + printf("\n\r Entered rtc\n"); + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x00); //reading milliseconds register + response = rtc_spi.write(0x00); // read the value by sending dummy byte + uint8_t centiseconds = (uint8_t(response&0xF0)>>4)*10+uint8_t(response&0x0F)*1; + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x01); //reading seconds register + response =rtc_spi.write(0x01); + uint8_t seconds = ((response&0x70)>>4)*10+(response&0x0F)*1; + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x02); //reading minutes register + response =rtc_spi.write(0x01); + uint8_t minutes = ((response&0xF0)>>4)*10+(response&0x0F)*1; + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x03); //reading hours register + response=rtc_spi.write(0x01); + uint8_t hours = ((response&0x30)>>4)*10+(response&0x0F)*1; + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x04); //reading day's register + uint8_t day =rtc_spi.write(0x01); + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x05); //reading date register + response =rtc_spi.write(0x01); + uint8_t date = ((response&0x30)>>4)*10+(response&0x0F)*1; + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x06); //reading month registe + response =rtc_spi.write(0x01); + uint8_t month = ((response&0x10)>>4)*10+(response&0x0F)*1; + + rtc_cs=1; + rtc_cs=0; + rtc_spi.write(0x07); //reading year's registe + response =rtc_spi.write(0x01); + uint8_t year = ((response&0xF0)>>4)*10+(response&0x0F)*1; + rtc_cs=1; + //sprintf(Time_stamp,"%02d%02d%02d%02d%02d%02d%02d%02d",year, month, date, day, hours, minutes, seconds, milliseconds ); + uint8_t Time_stamp[8] = {year, month, date, day, hours, minutes, seconds, centiseconds}; + for(int i= 0; i<8;i++) + printf("%d\t",Time_stamp[i]); + printf("read\r\n"); + uint64_t time; + time = 0; + time = time|(uint64_t)(centiseconds&0xEF); + time = time|(uint64_t)(seconds&0xDF)<<7; + time = time|(uint64_t)(minutes&0xDF)<<13; + time = time|(uint64_t)(hours&0x1F)<<19; + time = time|(uint64_t)(day&0x1F)<<24; + time = time|(uint64_t)(month&0x0F)<<29; + time = time|(uint64_t)(year&0x03)<<33; + time = time&0x00000007FFFFFFFF; + // return time; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cdms_sd.cpp Sat Nov 07 09:55:44 2015 +0000 @@ -0,0 +1,370 @@ +#include "cdms_sd.h" + +SPI spi_sd(PTE1, PTE3, PTE2); // MOSI,MISO, CLOCK microcontroller(in order) +DigitalOut cs_sd(PTE22); + +Serial sd1(USBTX,USBRX); + +int cdv; +uint64_t sd_sectors(); +uint64_t sectors; + +int initialise_card() +{ + // Set to 100kHz for initialisation, and clock card with cs_sd = 1 + spi_sd.frequency(100000); + cs_sd = 1; + for (int i = 0; i < 16; i++) { + spi_sd.write(0xFF); + } + + // send CMD0, should return with all zeros except IDLE STATE set (bit 0) + if (cmd(0, 0) != R1_IDLE_STATE) { + debug("No disk, or could not put SD card in to spi_sd idle state\n"); + return SDCARD_FAIL; + } + +// send CMD8 to determine whther it is ver 2.x + int r = cmd8(); + if (r == R1_IDLE_STATE) { + printf("Entering v2 bro\n"); + return initialise_card_v2(); + + } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { + printf("Entering v1 bro\n"); + return initialise_card_v1(); + + } else { + debug("Not in idle state after sending CMD8 (not an SD card?)\n"); + return SDCARD_FAIL; + } +} + +int initialise_card_v1() +{ + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + cmd(55, 0); + if (cmd(41, 0) == 0) { + printf("Yuppie v1 successful\n"); + cdv = 512; + debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); + + return SDCARD_V1; + } + } + + debug("Timeout waiting for v1.x card\n"); + return SDCARD_FAIL; +} + + +int initialise_card_v2() +{ + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + wait_ms(50); + cmd58(); + cmd(55, 0); + if (cmd(41, 0x40000000) == 0) { + printf("Yuppie,v2 successful\n"); + cmd58(); + debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r"); + cdv = 1; + + return SDCARD_V2; + } + } + + debug("Timeout waiting for v2.x card\n"); + return SDCARD_FAIL; +} + +int cmd(int cmd, int arg) +{ + cs_sd = 0; + + // send a command + spi_sd.write(0x40 | cmd); + spi_sd.write(arg >> 24); + spi_sd.write(arg >> 16); + spi_sd.write(arg >> 8); + spi_sd.write(arg >> 0); + spi_sd.write(0x95); + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + int response = spi_sd.write(0xFF); + if (!(response & 0x80)) { + cs_sd = 1; + spi_sd.write(0xFF); + return response; + } + } + cs_sd = 1; + spi_sd.write(0xFF); + return -1; // timeout +} + + +int cmd58() +{ + cs_sd = 0; + int arg = 0; + + // send a command + spi_sd.write(0x40 | 58); + spi_sd.write(arg >> 24); + spi_sd.write(arg >> 16); + spi_sd.write(arg >> 8); + spi_sd.write(arg >> 0); + spi_sd.write(0x95); + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + int response = spi_sd.write(0xFF); + if (!(response & 0x80)) { + int ocr = spi_sd.write(0xFF) << 24; + ocr |= spi_sd.write(0xFF) << 16; + ocr |= spi_sd.write(0xFF) << 8; + ocr |= spi_sd.write(0xFF) << 0; + cs_sd = 1; + spi_sd.write(0xFF); + return response; + } + } + cs_sd = 1; + spi_sd.write(0xFF); + return -1; // timeout +} + + +int cmd8() +{ + cs_sd = 0; + + // send a command + spi_sd.write(0x40 | 8); // CMD8 + spi_sd.write(0x00); // reserved + spi_sd.write(0x00); // reserved + spi_sd.write(0x01); // 3.3v + spi_sd.write(0xAA); // check pattern + spi_sd.write(0x87); // crc + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) { + char response[5]; + response[0] = spi_sd.write(0xFF); + if (!(response[0] & 0x80)) { + for (int j = 1; j < 5; j++) { + response[i] = spi_sd.write(0xFF); + } + cs_sd = 1; + spi_sd.write(0xFF); + return response[0]; + } + } + cs_sd = 1; + spi_sd.write(0xFF); + return -1; // timeout +} + +uint64_t sd_sectors() +{ + uint32_t c_size, c_size_mult, read_bl_len; + uint32_t block_len, mult, blocknr, capacity; + uint32_t hc_c_size; + uint64_t blocks; + + // CMD9, Response R2 (R1 byte + 16-byte block read) + if (cmdx(9, 0) != 0) { + debug("Didn't get a response from the disk\n"); + return 0; + } + + uint8_t cs_sdd[16]; + if (read(cs_sdd, 16) != 0) { + debug("Couldn't read cs_sdd response from disk\n"); + return 0; + } + + // cs_sdd_structure : cs_sdd[127:126] + // c_size : cs_sdd[73:62] + // c_size_mult : cs_sdd[49:47] + // read_bl_len : cs_sdd[83:80] - the *maximum* read block length + + int cs_sdd_structure = ext_bits(cs_sdd, 127, 126); + + switch (cs_sdd_structure) { + case 0: + cdv = 512; + c_size = ext_bits(cs_sdd, 73, 62); + c_size_mult = ext_bits(cs_sdd, 49, 47); + read_bl_len = ext_bits(cs_sdd, 83, 80); + + block_len = 1 << read_bl_len; + mult = 1 << (c_size_mult + 2); + blocknr = (c_size + 1) * mult; + capacity = blocknr * block_len; + blocks = capacity / 512; + debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks); + break; + + case 1: + cdv = 1; + hc_c_size = ext_bits(cs_sdd, 63, 48); + blocks = (hc_c_size+1)*1024; + debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks*512, blocks); + break; + + default: + debug("cs_sdD struct unsupported\r\n"); + return 0; + }; + return blocks; +} + +int cmdx(int cmd, int arg) +{ + cs_sd = 0; + + // send a command + spi_sd.write(0x40 | cmd); + spi_sd.write(arg >> 24); + spi_sd.write(arg >> 16); + spi_sd.write(arg >> 8); + spi_sd.write(arg >> 0); + spi_sd.write(0x95); + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + int response = spi_sd.write(0xFF); + if (!(response & 0x80)) { + return response; + } + } + cs_sd = 1; + spi_sd.write(0xFF); + return -1; // timeout +} + +static uint32_t ext_bits(unsigned char *data, int msb, int lsb) +{ + uint32_t bits = 0; + uint32_t size = 1 + msb - lsb; + for (int i = 0; i < size; i++) { + uint32_t position = lsb + i; + uint32_t byte = 15 - (position >> 3); + uint32_t bit = position & 0x7; + uint32_t value = (data[byte] >> bit) & 1; + bits |= value << i; + } + return bits; +} + +int disk_initialize() +{ + int i = initialise_card(); + debug_if(SD_DBG, "init card = %d\n", i); + sectors = sd_sectors(); + + // Set block length to 512 (CMD16) + if (cmd(16, 512) != 0) { + debug("Set 512-byte block timed out\n"); + return 1; + } else { + printf("Hey,block init succesful\n"); + } + + spi_sd.frequency(1000000); // Set to 1MHz for data transfer + return 0; +} + +int disk_write(const uint8_t *buffer, uint64_t block_number) + +{ + // set write address for single block (CMD24) + if (cmd(24, block_number * cdv) != 0) { + return 1; + } + + // send the data block + write(buffer, 512); + //printf("Written Successfully bro \n"); + return 0; +} + +int write(const uint8_t*buffer, uint32_t length) +{ + cs_sd = 0; + + // indicate start of block + spi_sd.write(0xFE); + + // write the data + for (int i = 0; i < length; i++) { + spi_sd.write(buffer[i]); + } + + // write the checksum + spi_sd.write(0xFF); + spi_sd.write(0xFF); + + // check the response token + if ((spi_sd.write(0xFF) & 0x1F) != 0x05) { + cs_sd = 1; + spi_sd.write(0xFF); + return 1; + } + + // wait for write to finish + while (spi_sd.write(0xFF) == 0); + + cs_sd = 1; + spi_sd.write(0xFF); + return 0; +} + +int disk_read(uint8_t *buffer, uint64_t block_number) +{ + // set read address for single block (CMD17) + if (cmd(17, block_number * cdv) != 0) { + return 1; + } + + // receive the data + read(buffer, 512); + return 0; +} + +int read(uint8_t *buffer, uint32_t length) +{ + cs_sd = 0; + + // read until start byte (0xFF) + while (spi_sd.write(0xFF) != 0xFE); + + // read data + for (int i = 0; i < length; i++) { + buffer[i] = spi_sd.write(0xFF); + } + spi_sd.write(0xFF); // checksum + spi_sd.write(0xFF); + + cs_sd = 1; + spi_sd.write(0xFF); + return 0; +} + +int disk_erase(int startBlock, int totalBlocks) +{ + if(cmd(32, startBlock * cdv) != 0) { + return 1; + } + if (cmd(33, (startBlock+totalBlocks-1) * cdv) != 0) { + return 1; + } + if (cmd(38,0) != 0) { + return 1; + } + + return 0; //normal return +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cdms_sd.h Sat Nov 07 09:55:44 2015 +0000 @@ -0,0 +1,35 @@ +#include "mbed.h" +#include "mbed_debug.h" + +#define SD_COMMAND_TIMEOUT 5000 + +#define SD_DBG 0 + +#define R1_IDLE_STATE (1 << 0) +#define R1_ERASE_RESET (1 << 1) +#define R1_ILLEGAL_COMMAND (1 << 2) +#define R1_COM_CRC_ERROR (1 << 3) +#define R1_ERASE_SEQUENCE_ERROR (1 << 4) +#define R1_ADDRESS_ERROR (1 << 5) +#define R1_PARAMETER_ERROR (1 << 6) + +//int initialise_card(); +int initialise_card_v1(); +int initialise_card_v2(); +//int disk_initialize(); +//int disk_write(const uint8_t *, uint64_t); +//int disk_read(uint8_t *, uint64_t); +int disk_erase(int,int); + +int cmd(int, int); +int cmd58(); +int cmdx(int, int); +int cmd8(); +int read(uint8_t*, uint32_t ); +int write(const uint8_t*, uint32_t ); +static uint32_t ext_bits(unsigned char *, int , int ); + +#define SDCARD_FAIL 0 +#define SDCARD_V1 1 +#define SDCARD_V2 2 +#define SDCARD_V2HC 3 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Nov 07 09:55:44 2015 +0000 @@ -0,0 +1,130 @@ +#include "mbed.h" +#include "rtos.h" +#include "pinconfig.h" +#include "cdms_sd.h" + +Serial main1(USBTX,USBRX); + +Thread *ptr_t_sc_data; +Thread *ptr_t_tctm; + +InterruptIn pl_sc_data(PIN81); + +/* only for sd testing*/ +uint8_t write_to_sd[512]; +uint8_t read_from_sd[512]; +/* end*/ + +void BAE_HK(); +void CDMS_HK(); +void PL_MODE(); +void FCTN_PL_RCV_SC_DATA(); +void FCTN_COM_COMP_SC_DATA(); + +//extern void FCTN_CDMS_INIT_SD(); +//extern int FCTN_CDMS_WR_SD(const uint8_t *, uint64_t); +//extern int FCTN_CDMS_RD_SD(uint8_t *, uint64_t); + +//extern void FCTN_CDMS_INIT_SD(); +extern int disk_write(const uint8_t *, uint64_t); +extern int disk_read(uint8_t *, uint64_t); +extern int initialise_card(); +extern int disk_initialize(); + +extern void FCTN_CDMS_INIT_RTC(); +extern void FCTN_CDMS_RD_RTC(); + +void TSC_HK_BAE_CDMS_PL_MODE(void const *args) +{ + BAE_HK(); + CDMS_HK(); + PL_MODE(); +} + +void BAE_HK() +{ + main1.printf("\nBAE_HK Function Executed\r\n"); +} + +void CDMS_HK() +{ + main1.printf("\nCDMS_HK Function Executed\r\n"); + FCTN_CDMS_RD_RTC(); + disk_write(write_to_sd,4); + disk_read(read_from_sd,4); + for(int i=0;i<512;i++) + { + main1.printf("%d",read_from_sd[i]); + } +} + +void PL_MODE() +{ + main1.printf("\nPL_MODE Function Executed\r\n"); +} + +void T_CDMS_RLY_TCTM(void const *args) +{ + while(1) + { + Thread::signal_wait(0x3); + main1.printf("in T_CDMS_RLY_TM\r\n"); + //FUNC_CDMS_RLY_TM(); + } +} + +void T_PL_RCV_SC_DATA(void const *args) +{ + while(1) + { + Thread::signal_wait(0x1); + FCTN_PL_RCV_SC_DATA(); + FCTN_COM_COMP_SC_DATA(); + FCTN_CDMS_RD_RTC(); + disk_write(write_to_sd,2); + disk_read(read_from_sd,2); + for(int i=0;i<512;i++) + { + main1.printf("%d",read_from_sd[i]); + } + } +} + +void ISR_PL_RCV_SC_DATA() +{ + ptr_t_sc_data->signal_set(0x1); +} + +void FCTN_PL_RCV_SC_DATA() +{ + main1.printf("\nFCTN_PL_RCV_SC_DATA Function Executed\r\n"); +} + +void FCTN_COM_COMP_SC_DATA() +{ + main1.printf("\nFCTN_COM_COMP_SC_DATA Function Executed\r\n"); +} + +void FCTN_CDMS_WR_SD() +{ + main1.printf("\nFCTN_CDMS_WR_SD Function Executed\r\n"); +} + +int main() +{ + main1.printf("\n\r CDMS Activated \n"); + initialise_card(); + disk_initialize(); + FCTN_CDMS_INIT_RTC(); + for(int i=0;i<512;i++) + { + write_to_sd[i] = i; + } + RtosTimer TIMER_HK_ACQ(TSC_HK_BAE_CDMS_PL_MODE,osTimerPeriodic); + TIMER_HK_ACQ.start(10000); + ptr_t_tctm = new Thread (T_CDMS_RLY_TCTM); + ptr_t_sc_data = new Thread (T_PL_RCV_SC_DATA); + pl_sc_data.rise(&ISR_PL_RCV_SC_DATA); + + while(1); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Sat Nov 07 09:55:44 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#12552ef4e980
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Nov 07 09:55:44 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/9296ab0bfc11 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pinconfig.h Sat Nov 07 09:55:44 2015 +0000 @@ -0,0 +1,101 @@ +// 100 LQFP format pin assignment +#define PIN1 PTE0 +#define PIN2 PTE1 +#define PIN3 PTE2 +#define PIN4 PTE3 +#define PIN5 PTE4 +#define PIN6 PTE5 +#define PIN7 PTE6 +//#define 8 +//#define 9 +//#define 10 +//#define 11 +//#define 12 +//#define 13 +#define PIN14 PTE16 +#define PIN15 PTE17 +#define PIN16 PTE18 +#define PIN17 PTE19 +#define PIN18 PTE20 +#define PIN19 PTE21 +#define PIN20 PTE22 +#define PIN21 PTE23 +//#define 22 +//#define 23 +//#define 24 +//#define 25 +#define PIN26 PTE29 +#define PIN27 PTE30 +#define PIN28 PTE31 +//#define 29 +//#define 30 +#define PIN31 PTE24 +#define PIN32 PTE25 +#define PIN33 PTE26 +#define PIN34 PTA0 +#define PIN35 PTA1 +#define PIN36 PTA2 +#define PIN37 PTA3 +#define PIN38 PTA4 +#define PIN39 PTA5 +#define PIN40 PTA6 +#define PIN41 PTA7 +#define PIN42 PTA12 +#define PIN43 PTA13 +#define PIN44 PTA14 +#define PIN45 PTA15 +#define PIN46 PTA16 +#define PIN47 PTA17 +//#define 48 +//#define 49 +#define PIN50 PTA18 +#define PIN51 PTA19 +#define PIN52 PTA20 +#define PIN53 PTB0 +#define PIN54 PTB1 +#define PIN55 PTB2 +#define PIN56 PTB3 +#define PIN57 PTB7 +#define PIN58 PTB8 +#define PIN59 PTB9 +#define PIN60 PTB10 +#define PIN61 PTB11 +#define PIN62 PTB16 +#define PIN63 PTB17 +#define PIN64 PTB18 +#define PIN65 PTB19 +#define PIN66 PTB20 +#define PIN67 PTB21 +#define PIN68 PTB22 +#define PIN69 PTB23 +#define PIN70 PTC0 +#define PIN71 PTC1 +#define PIN72 PTC2 +#define PIN73 PTC3 +//#define 74 +//#define 75 +#define PIN76 PTC20 +#define PIN77 PTC21 +#define PIN78 PTC22 +#define PIN79 PTC23 +#define PIN80 PTC4 +#define PIN81 PTC5 +#define PIN82 PTC6 +#define PIN83 PTC7 +#define PIN84 PTC8 +#define PIN85 PTC9 +#define PIN86 PTC10 +#define PIN87 PTC11 +#define PIN88 PTC12 +#define PIN89 PTC13 +#define PIN90 PTC16 +#define PIN91 PTC17 +#define PIN92 PTC18 +#define PIN93 PTD0 +#define PIN94 PTD1 +#define PIN95 PTD2 +#define PIN96 PTD3 +#define PIN97 PTD4 +#define PIN98 PTD5 +#define PIN99 PTD6 +#define PIN100 PTD7 \ No newline at end of file