Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 10 months ago.
Compiler totally messed up?
Hello mbed-team! I have an LPC1768 and a KL25Z and constantly get errors when trying to compile code for the KL25Z. The same code compiles fine if I set LPC1768 as target. Is there any serious problems with the KL25Z target today/these days? The compiler errors don't make sens for a lot of cases or complain about missing files like "#error directive: "CMSIS Target not recognised"" in file "lib/mbed/cmsis.h" and yes, I've updated to the latest libraries.
Is there any timeframe for an offline-compiler option fot the KL25Z (GCC ARM embedded)? That would be very helpfull!
Regards, Flo
Question relating to:
2 Answers
10 years, 10 months ago.
You probably need to select the "compile all" button rather than "compile" when you switch from one target to another. There may also be a problem with some names that were defined for KL25Z in mbed.h. Check the mbed source files for KL25Z and/or try renaming some of the declarations that seem to cause problems (eg ROM into MYROM).
10 years, 10 months ago.
Hi Martin, thanks for the quick reply. The offline compilation option with GCC ARM via your makefile sounds very interesting. I'll try that.
As for the online compiler: An example is below. I took it from the mbed site and modified it a bit. If I compile it for LPC1768 it works fine (if changing the pin name). This one gives funny errors with the KL25Z target: "Expected a ")"" in file "/main.cpp", Line: 22, Col: 1 "Expected a type specifier" in file "/main.cpp", Line: 22, Col: 1 "Function returning array is not allowed" in file "/main.cpp", Line: 22, Col: 1 ""ROM_Type" has already been declared in the current scope" in file "/main.cpp", Line: 22, Col: 1
line 22 reads unsigned char ROM[8];
So this seems very odd to me ...
The code is
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Lots_of_DS18B20
// Demo on how to identify and read multiple DS18B20 connected to the same bus.
// Parasitic power is not used in this example.
// This program is based on the sample code from Maxim/Dallas application
// note 162 (http://www.maxim-ic.com/app-notes/index.mvp/id/162).
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#include <mbed.h>
Serial pc(USBTX, USBRX);
#define FALSE 0
#define TRUE 1
#define MaxROMs 20 // Defines how many devices space is allocated for.
//DigitalInOut DQ(p21);
DigitalInOut DQ(PTA1);
unsigned char SPad[9]; // Scratchpad storage
unsigned char ROM[8];
unsigned char lastDiscrep = 0; // last discrepancy
unsigned char doneFlag = 0; // Done flag
unsigned char FoundROM[MaxROMs][8]; // table of found ROM codes
unsigned char numROMs; // Number of found devices.
unsigned char dowcrc;
unsigned char dscrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
//////////////////////////////////////////////////////////////////////////////
// OW_RESET - performs a reset on the 1-wire bus and returns the presence detect.
unsigned char ow_reset(void) {
unsigned char presence;
DQ.output();
DQ = 0; //pull DQ line low
wait_us(480); // leave it low for 480us
DQ.input(); // allow line to return high
wait_us(70); // wait for presence
presence = DQ; // get presence signal
wait_us(410); // wait for end of timeslot
return(presence); // presence signal returned, 0=presence, 1 = no part
}
//////////////////////////////////////////////////////////////////////////////
// READ_BIT - reads a bit from the one-wire bus.
unsigned char read_bit(void) {
unsigned char retval;
wait_us(1); // Recovery time
DQ.output();
DQ = 0; // pull DQ low to start timeslot
wait_us(2);
DQ.input(); // Tristate line
wait_us(10); // delay 10 us from start of timeslot
retval=DQ;
wait_us(48); // minimum Read time slot: 60 us.
return(retval); // return value of DQ line
}
//////////////////////////////////////////////////////////////////////////////
// WRITE_BIT - writes a bit to the one-wire bus, passed in bitval.
void write_bit(unsigned char bitval) {
wait_us(1); // Recovery time
DQ.output();
DQ = 0; // pull DQ low to start timeslot
wait_us(10);
if(bitval==1) DQ =1; // return DQ high if write 1
wait_us(50); // hold value for remainder of timeslot
DQ.input(); // Release line
}
//////////////////////////////////////////////////////////////////////////////
// READ_BYTE - reads a byte from the one-wire bus.
unsigned char read_byte(void) {
unsigned char i, value=0;
for (i=0;i<8;i++) {
if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then shifts it left
}
return(value);
}
//////////////////////////////////////////////////////////////////////////////
// WRITE_BYTE - writes a byte to the one-wire bus.
void write_byte(char val) {
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) {// writes byte, one bit at a time
temp = val>>i; // shifts val right 'i' spaces
temp &= 0x01; // copy that bit to temp
write_bit(temp); // write bit in temp into
}
}
//////////////////////////////////////////////////////////////////////////////
// ONE WIRE CRC
unsigned char ow_crc( unsigned char x) {
dowcrc = dscrc_table[dowcrc^x];
return dowcrc;
}
//////////////////////////////////////////////////////////////////////////////
// NEXT
// The Next function searches for the next device on the 1-Wire bus. If
// there are no more devices on the 1-Wire then false is returned.
unsigned char Next(void) {
unsigned char m = 1; // ROM Bit index
unsigned char n = 0; // ROM Byte index
unsigned char k = 1; // bit mask
unsigned char x = 0;
unsigned char discrepMarker = 0; // discrepancy marker
unsigned char g; // Output bit
unsigned char nxt; // return value
int flag;
nxt = FALSE; // set the next flag to false
dowcrc = 0; // reset the dowcrc
flag = ow_reset(); // reset the 1-Wire
if(flag||doneFlag) { // no parts -> return false
lastDiscrep = 0; // reset the search
return FALSE;
}
write_byte(0xF0); // send SearchROM command
do { // for all eight bytes
x = 0;
if(read_bit()==1) x = 2;
wait_us(120);
if(read_bit()==1) x |= 1; // and its complement
if(x ==3) // there are no devices on the 1-Wire
break;
else {
if(x>0) // all devices coupled have 0 or 1
g = x>>1; // bit write value for search
else {
// if this discrepancy is before the last discrepancy on a previous Next then pick the same as last time
if(m<lastDiscrep)
g = ((ROM[n]&k)>0);
else // if equal to last pick 1
g = (m==lastDiscrep); // if not then pick 0
// if 0 was picked then record position with mask k
if (g==0) discrepMarker = m;
}
if(g==1) // isolate bit in ROM[n] with mask k
ROM[n] |= k;
else
ROM[n] &= ~k;
write_bit(g); // ROM search write
m++; // increment bit counter m
k = k<<1; // and shift the bit mask k
if(k==0) { // if the mask is 0 then go to new ROM // byte n and reset mask
ow_crc(ROM[n]); // accumulate the CRC
n++; k++;
}
}
}
while(n<8); //loop until through all ROM bytes 0-7
if(m<65||dowcrc) // if search was unsuccessful then
lastDiscrep=0; // reset the last discrepancy to 0
else { // search was successful, so set lastDiscrep, lastOne, nxt
lastDiscrep = discrepMarker;
doneFlag = (lastDiscrep==0);
nxt = TRUE; // indicates search is not complete yet, more parts remain
}
return nxt;
}
//////////////////////////////////////////////////////////////////////////////
// FIRST
// The First function resets the current state of a ROM search and calls
// Next to find the first device on the 1-Wire bus.
unsigned char First(void) {
lastDiscrep = 0; // reset the rom search last discrepancy global
doneFlag = FALSE;
return Next(); // call Next and return its return value
}
//////////////////////////////////////////////////////////////////////////////
// FIND DEVICES
void FindDevices(void) {
unsigned char m;
if(!ow_reset()) { //Begins when a presence is detected
if(First()) { //Begins when at least one part is found
numROMs=0;
do {
numROMs++;
for(m=0;m<8;m++) {
FoundROM[numROMs][m]=ROM[m]; //Identifies ROM
}
pc.printf("ROM CODE =%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X %d\r\n",
FoundROM[numROMs][7],FoundROM[numROMs][6],FoundROM[numROMs][5],FoundROM[numROMs][4],
FoundROM[numROMs][3],FoundROM[numROMs][2],FoundROM[numROMs][1],FoundROM[numROMs][0],numROMs);
}
while (Next()&&(numROMs<MaxROMs)); //Continues until no additional devices are found
}
}
pc.printf("\n%d devices found.\r\n\n",numROMs);
}
//////////////////////////////////////////////////////////////////////////////
void Read_ScratchPad(unsigned char n) { // Read the n first scratchpad bytes. Old data not wiped.
n=n % 10;
write_byte(0xBE);
for (int j=1;j<=n;j++){SPad[j-1]=read_byte();}
// CRC ********reserved******* Config Tl Th T MSB T LSB
pc.printf("\n ScratchPAD: %X%X%X%X%X%X%X%X%X\n",SPad[8],SPad[7],SPad[6],SPad[5],SPad[4],SPad[3],SPad[2],SPad[1],SPad[0]);
}
//////////////////////////////////////////////////////////////////////////////
// Perform Match ROM
unsigned char Send_MatchRom(unsigned char DeviceNo) {
unsigned char i;
if(ow_reset()) return false;
write_byte(0x55); // match ROM
for(i=0;i<8;i++) {
write_byte(FoundROM[DeviceNo][i]); //send ROM code
}
return true;
}
//////////////////////////////////////////////////////////////////////////////
void ConvT() { // Make all devices on the bus start a temperature conversion.
ow_reset();
write_byte( 0xcc); // Skip ROM command.
write_byte( 0x44); // Convert T command.
}
//////////////////////////////////////////////////////////////////////////////
unsigned int ReadRawTemp(unsigned char device) {
int HighByte, LowByte;
Send_MatchRom(device); // Select device.
write_byte( 0xbe); // Read Scratchpad command.
LowByte=read_byte();
HighByte=read_byte();
return (HighByte << 8) + LowByte;
}
//////////////////////////////////////////////////////////////////////////////
float Get_Temp(unsigned char device) {
int Raw = ReadRawTemp(device);
if((Raw>>8) & 0x80) { // Check if temperature is negative.
Raw = (Raw ^ 0xFFFF) + 1;
Raw *= -1;
}
float temperature = (float)Raw / 16.0;
return temperature;
}
//////////////////////////////////////////////////////////////////////////////
int main() {
float temperature;
DQ.output();
DQ = 0;
DQ.input();
pc.baud(9600);
pc.printf("\n\n*** Test with multiple DS18B20 ***\r\n\n");
pc.printf("Memory allocated for %d devices.\r\n",MaxROMs);
pc.printf("Scanning for devices...\r\n");
ow_reset();
FindDevices();
pc.printf("Scanning completed.\r\n");
while (1) {
ConvT(); // Issue Convert T command.
wait_ms(750); // Minimum 12-bit conversion time.
for(int i=1;i<=numROMs;i++) { // Cycle through found devices.
temperature = Get_Temp(i);
pc.printf("Temp: %08.4f Device: %02X%02X%02X%02X%02X%02X %03d\r\n",temperature,FoundROM[i][6],FoundROM[i][5],FoundROM[i][4],FoundROM[i][3],FoundROM[i][2],FoundROM[i][1],i);
}
pc.printf("\r\n");
wait(5); // Doing conversions more often will make devices self heat and produce a higher temperature reading.
}
}
Hello Flo rian,
I haven't got any problem today with my examples. What example are you trying to compile with KL25Z? I can test it.
The offline option is not in online compiler enabled yet, but if you are able to compile offline mbed libraries with GCC ARM. I described it in my notepad ;)
Regards,
posted by Martin Kojtal 08 Sep 20130xc0170