you may want to look at a free C compiler. HI-TECH PICC Lite Compiler www.htsoft.com/products/piclite/piclite.html PICFUN wrote: > I have the folowing code in C and i dont have any program to compile it! > Please, if anyone can compile for me... > > #INCLUDE <16F84.H> > > #FUSES XT, WDT, PROTECT, NOPUT // CCS Compiles PUT wrong - this means PUT > > #ID 0x0000 > > #USE DELAY(CLOCK=4000000, RESTART_WDT) > > #USE FAST_IO(A) > #USE FAST_IO(B) > > #ZERO_RAM > > #BIT mlan = 0x05.0 > #BIT LEDG = 0x05.1 > #BIT LEDR = 0x05.2 > #BIT pulse = 0x05.3 // Low is 1 Sec, High is 10 secs > #BIT config = 0x05.4 > #BYTE id_out = 0x06 > > #DEFINE MLAN_IN 0b11111001 > #DEFINE MLAN_OUT 0b11111000 > #DEFINE STORED_IDS_ADDR 0x3F > > // Map out the IDs stored in the EEPROM > byte CONST ee_table[7] = {0,6,12,18,24,30,36}; > > // Globals > int id_in[6]; > > // Subroutines > > // Flash RED > // This routine flashes the RED LED for secs/4 seconds > > void flash_red(int secs) { > > int i; > > LEDG = 0; delay_cycles(1); LEDR = 1; > > for (i = 0; i < secs; i++) { > delay_ms(250); > LEDR = !LEDR; > } > } > > // Gen CRC > // This routine takes the old CRC value and a new byte and returns a new CRC > value > > int gen_crc(int crc_in, int newdata) { > > int i; > > for(i = 0; i < 8; i++) { > shift_right(&crc_in, 1, (bit_test(crc_in, 0) ^ shift_right(&newdata, 1, > 0))); > // Check for the extra XOR > if (bit_test(crc_in, 7)) { > // We need an extra XOR > crc_in ^= 0x0C; > } > } > > return crc_in; > } > > // READ Byte > // This routine reads in a byte from a microLAN device after a READ command > has been sent > > int read_byte() { > > int byte_in, i, bit_cnt; > > for(i = 0; i < 8; i++) { > // Clear bit counter > bit_cnt = 0; > > // Pulse microLAN low to clock bit > set_tris_a(MLAN_OUT); > mlan = 0; > delay_us(3); > set_tris_a(MLAN_IN); > delay_us(3); // Allow some pullup recovery time > > // We now have ~7us left to sample a few times > if (!mlan) { bit_cnt++; } > if (!mlan) { bit_cnt++; } > if (!mlan) { bit_cnt++; } > > // Lets shoot for 2 out of 3! Use a quickie bit test for efficiency > > shift_right(&byte_in, 1, !bit_test(bit_cnt, 1)); > > // Lets allow for the microLan device to release (45us MAX) and LAN to > recover (15) > delay_us(45); > } > > return byte_in; > } > > // READ iButton > // This routine is called to read an iButtons' unique serial ID. The > following steps are taken: > // 1. Issue Read ROM command on MicroLAN (0x33) > // 2. Read in 8 byte ID > // 3. Check family code and CRC > // 4. Store 6 byte serial in id_in if valid and return TRUE OR > // Return false for Bad CRC or family code > > boolean read_ibutton() { > > int i, tmp, family, crc_in; > > // Lets write out the Read ROM command > tmp = 0x33; > for(i = 0; i < 8; i++) { > // Bring micro LAN low for 7us > set_tris_a(MLAN_OUT); > mlan = 0; > delay_us(7); > > // Output the bit > if (shift_right(&tmp, 1, 0)) { > // Output a 1 via the pullup > set_tris_a(MLAN_IN); > } else { > set_tris_a(MLAN_OUT); > mlan = 0; > } > > delay_us(50); // Allow iButton to read the data and complete slot > > // Now we go to tristate > set_tris_a(MLAN_IN); > > // No need for 1us delay since loop takes care of it > } > > // Now the iButton will start dumping data back to us synced to our pulses > family = read_byte(); > > // If the family code is bad - quit > if (family != 0x01) { > return FALSE; > } > > crc_in = gen_crc(0x00, family); > > for(i = 0; i < 6; i++) { > > // id_in[i] = read_byte(); > // crc_in = gen_crc(crc_in, id_in[i]); > > // The code below is more compact (15us vs 20us) > tmp = read_byte(); > id_in[i] = tmp; > crc_in = gen_crc(crc_in, tmp); > } > > if (crc_in == read_byte()) { > // The CRC is okay! > return TRUE; > } else { > return FALSE; > } > } > > // Check LAN > // This routine issues an INIT pulse on the micro LAN (480 - 960 us) and > looks for a presence > // pulse from an ibutton. If it sees one, it returns true indicating an > active device is on the LAN > > boolean check_lan() { > > int i, low_hit; > > low_hit = 0; > > // Bring MLAN low for at least 480us - we'll use 520 us > set_tris_a(MLAN_OUT); > mlan = 0; > delay_us(520); > > // Put bus back in tristate > set_tris_a(MLAN_IN); > > // Lets see if a pulse comes back in the proper window > // The pulse will start 15-60 us after going high > // The pulse will be 60us - 240us > > // The presence pulse period must be a minimum of 480us > // So lets check for a low every 10us and if we get 4 (since pulse has to > be 60us min), take it > for (i = 0; i < 48; i++) { > if (!mlan) { low_hit++; } // Catch a presence pulse > delay_us(2); // For loop takes 9us @ 4MHz > } > > if (low_hit > 3) { > return TRUE; > } else { > return FALSE; > } > } > > // Check ID > // This routine takes the passed ID in id_in and compares it to those IDs in > EEPROM > // If it finds a match, it returns the ID number, otherwise it returns 0x00 > > int check_id(int num_ids) { > > int ee_addr, button_idx, cnt; > boolean match; > > button_idx = 0; > > while(++button_idx <= num_ids) { > // Check all stored button IDs > cnt = 0; restart_wdt(); > ee_addr = ee_table[button_idx-1]; > match = TRUE; > while (cnt != 6) { > > if (read_eeprom(ee_addr) != id_in[cnt]) { > match = FALSE; // Doesn't match - check next button > break; > } > > ee_addr++; > cnt++; > } > > if (match) { > // We matched everything! > return button_idx; > } > } > > // No matches! > return 0; > } > > void main() { > > int stored_ids, id_matched, temp_out, i, eeprom_addr; > > // Setup IO port directions and initialize ports > set_tris_a(MLAN_IN); > set_tris_b(0b00000000); > id_out = 0x00; > > // Lets give some indication that we are alive > LEDR = 0; LEDG = 1; > delay_ms(1000); > LEDG = 0; LEDR = 1; > delay_ms(1000); > LEDR = 0; LEDG = 0; > delay_ms(1000); > > // Check config bitm - LOW means config > if (!config) { > // Configuration mode > eeprom_addr = 0x00; > stored_ids = 0; > > // We can store 7 buttons > for(i = 0; i < 7; i++) { > LEDG = 0; delay_cycles(1); LEDR = 1; // Red > > // Lets wait for a button > LAN_WAIT1: > while(!check_lan()) { restart_wdt(); } > > // Lets read the iButton - if we get a CRC error, lets try again (and > again :) ) > while(!read_ibutton()) { > // We didn't get a good read, lets keep trying > restart_wdt(); > delay_ms(1); // Give the bus a chance to stabilize > if (!check_lan()) { > // Bail - we can't see a device! > goto LAN_WAIT1; > } > } > > // Lets make sure this ID hasn't already been stored in EEPROM > if (check_id(stored_ids) != 0) { > i--; // Lets take a step back for another try > flash_red(20); > continue; > } > > // We have a valid ID in id_in. Lets store it - all six bytes > for(temp_out = 0; temp_out < 6; temp_out++) { > write_eeprom(eeprom_addr, id_in[temp_out]); > restart_wdt(); > eeprom_addr++; > } > > // Update number of IDs - this ensures that we don't check random > // data bytes if they use < 7 buttons > stored_ids++; > write_eeprom(STORED_IDS_ADDR, stored_ids); > > // Green LED for 5 seconds > LEDR = 0; delay_cycles(1); LEDG = 1; > delay_ms(5000); > > } > > // Okay, we've maxed out or storage - let user know > // Blink Green until reset > LEDR = 0; delay_cycles(1); LEDG = 1; > while(TRUE) { > delay_ms(250); > LEDG = !LEDG; > } > > } else { > // Normal operation > stored_ids = read_eeprom(STORED_IDS_ADDR); > > while(TRUE) { > > LEDG = 0; delay_cycles(1); LEDR = 0; // Off > > // Check for presence pulse and read ID if button is online > LAN_WAIT2: > while(!check_lan()) { restart_wdt(); } > > // Something is on the micro LAN - lets read the ID > while(!read_ibutton()) { > // We didn't get a good read, lets keep trying > restart_wdt(); > delay_ms(1); // Give the bus a chance to stabilize > if (!check_lan()) { > // Bail - we can't see a device! > goto LAN_WAIT2;; > } > } > > // Valid ID was received - lets check it > > id_matched = check_id(stored_ids); > > if (id_matched == 0) { > // ID does not match > LEDG = 0; delay_cycles(1); LEDR = 1; // RED > delay_ms(10000); > } else { > // Valid ID match - trigger outputs > temp_out = 1; > for(i = 0; i < id_matched; i++) { > temp_out <<= 1; > } > temp_out |= 0x01; > > // Output the bits > id_out = temp_out; > > LEDR = 0; delay_cycles(1); LEDG = 1; // Green > > // Low on Pulse means 1 sec, high means 10 secs > if (pulse) { > delay_ms(10000); > } else { > delay_ms(1000); > } > > id_out = 0x00; > } > } // while(TRUE) > } // if (config) > } // End MAIN > > -- > http://www.freemail.gr - dyqe\m upgqes_a gkejtqomijo} tawudqole_ou. > > -- > http://www.piclist.com#nomail Going offline? Don't AutoReply us! > email listserv@mitvma.mit.edu with SET PICList DIGEST in the body -- http://www.piclist.com#nomail Going offline? Don't AutoReply us! email listserv@mitvma.mit.edu with SET PICList DIGEST in the body