CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Mitutoyo problem

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
pekka1234



Joined: 28 May 2017
Posts: 83

View user's profile Send private message

Mitutoyo problem
PostPosted: Tue Nov 26, 2024 7:27 am     Reply with quote

Hey, I have tried to read Mititutoyo micrometer with PIC18F2550, with 20MHz crystal with USB connection.
I know that it is not an easy case, although I did it 1988 to Finnish paper factory. I need only 8555 card and a normal PC. It was an easy cake.

I have tried four different devices, but nothing happens.
Only in Request pin rises to 1.5V. When RD pin should go to low I should Request also low and in Data and clock should give 13 data.
I have tried to rise data, clock and RD pins with 22kohm to 5V.
Trey rise to 5V, but nothing happens.

Maybe some of you have heard this device and maybe help me.

Here are the pictures of my Mitutoyo devices
https://probyte.fi/Picture.jpg

and here is the schematic
http://probyte.fi/MITsch.jpg

Here is how the signal should work
http://probyte.fi/Mitu.jpg

And here my code
Code:
/* Mitsutoyo micrometer  reading to  PC:lla by USB
  Pekka Ritamäki
  date: 19.11.2024
  file Mitu1.c
  it has PIC18F255 USB device with 20MHz Crystal
  It has 5 wires to mirodata device.
  USB signals work, but data from Mitutoyo does't 
  These are Mitotoyo wires
  Pin 1 = gnd
  Pin 2 = RD
  Pin 3 = Clock
  Pin 4 = Data
  Pin 5 = Request this is only output  pin, but only low
          it is normally 1.5V, but when you saw PIN 2(RD) to go 0V,
          you give 100-200 us Low pulse to REQUEST  and then 13 bits data to  come out with the clock
*/
#include <18F2550.h>
#fuses HSPLL, PLL5, CPUDIV1, USBDIV, NOWDT, NOLVP, NODEBUG, NOCPB
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <string.h>
#include <ex_usb_common.h>// this iss CCS given USB converter
#include <usb_cdc.h>
 
#define CLOCK_PIN PIN_B2
#define DATA_PIN  PIN_B3

// Data  length 13 bits Mitutoyo-mikrometer)
#define DATA_BITS 13
//===
#define RD1 PIN_B1
#define REQ1 PIN_B0
#define Data1 PIN_B3
#define CLOCK1 PIN_B2
#define LED1 PIN_A4
 
#define MAXDATA 5
 #define RD3 PIN_A2
#define REQ3 PIN_A3
#define Data3 PIN_A0
#define CLOCK3 PIN_A1
#define LED3 PIN_C0
#define NEGATIVE 0b1000

int8 xdata1[5]={"-23456"};
int8    neg1;
 
 // this function is got from outside, but it doesn't work '
 
int16 read_micrometer_data() {
    int16 data = 0;
  output_toggle(LED1 );
  delay_ms(199);
    output_toggle(LED1 );
     
    //wait  (CLOCK -> 0 and ->1  )
    while (input(CLOCK_PIN) == 1); //CLOCK -> 0
        output_low(REQ1) ;
          delay_us(150);
          output_float(REQ1);
    while (input(CLOCK_PIN) == 0); //Wait CLCOK -> 1 

    // read 13 bits with  CLOCK sync
    for (int i = 0; i < DATA_BITS; i++) {
        while (input(CLOCK_PIN) == 1); // //CLOCK ->
        data <<= 1; // move lower bits  left
        if (input(DATA_PIN)) {
            data |= 1; // add a 1 bit, if the DATA is HIGH
        }
        output_toggle(LED1 );
        while (input(CLOCK_PIN) == 0);  //Wait CLCOK -> 1
    }
   printf(usb_cdc_putc, "OK %ld\r",data);
    return data;
}
 

// read1   data, clock, first wait  RD-> 0 and give low ->request puls  and  read
void read1 () 
{
int8 i,j;
output_high (LED1);   // put  led1 off
While ( RD1); // wait ->0V
output_low(LED1);   //put  led1 on 
output_low (REQ1) ;  // keep REQ1 bit low
delay_us(400);  // 100us puls ito Mitutoyo
  output_float(pin_B0);       //set  REQ   pin   floating
 
for (i=0; i<4; i++) // read four  bitsä fot  -  marking
{
  While (!input(CLOCK1)) ;  // wait -> 1
  neg1 += input(DATA1)<<i ; // raad data
  While (input(CLOCK1)) ;   //  wait -> 0
  printf(usb_cdc_putc,"1 neg %x\r", neg1); 
for (i=0; i<MAXDATA; i++)  // Reaf 5 *4 bIts

for(j=0;i<4;j++) { // read  4 bits 
  While (!input(CLOCK1)) ; // wait till  goes -> 1)
  xdata1[i] += input(DATA1)<<j ; // read 0.  bit  to lower 
  ouTput_toggle(LED1);
  While (input(CLOCK1) ); // wait ->0
   
  }
   printf(usb_cdc_putc,"%d neg %x\r", i ,xdata1[i]);
output_low (LED1);   // led1  off
}
}
}
 //#include <usb_cdc.h>
void usb_debug_task(void)
{
   static int8 last_connected;
   static int8 last_enumerated;
   int8 new_connected;
   int8 new_enumerated;

   new_connected=usb_attached();
   new_enumerated=usb_enumerated();
   if (new_connected && !last_connected)
   {
      uart_printf(uart_putc, "\r\n\nUSB connected, waiting for enumaration...");
   }
   if (!new_connected && last_connected)
   {
      uart_printf(uart_putc, "\r\n\nUSB disconnected, waiting for connection...");
   }
   if (new_enumerated && !last_enumerated)
   {
      uart_printf(uart_putc, "\r\n\nUSB enumerated by PC/HOST");
   }
   if (!new_enumerated && last_enumerated)
   {
      uart_printf(uart_putc, "\r\n\nUSB un-enumerated by PC/HOST, waiting for enumeration...");
   }

   last_connected=new_connected;
   last_enumerated=new_enumerated;
}
//
void main ()
{
int8 i;
usb_init () ;
 for(i=0;I< 10;i++)
 {
   printf(usb_cdc_putc, "Mitutoyo %d \r" ,i );  // some testing
   delay_ms(1000);
   output_toggle(PIN_A4) ;
 }
  set_tris_B(0xFF-1 ); // All high, but no PIN B0
  set_tris_C(0xFF-9); // Put C4 to LED
   while(1 )
  { 
      usb_task();
      usb_debug_task();
        printf(usb_cdc_putc, "Now start Req ->low \r"  );
            while(1)
              read1();

}
}


Can you show any code for Mitutouo?
Pekka
temtronic



Joined: 01 Jul 2010
Posts: 9243
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Nov 26, 2024 9:11 am     Reply with quote

1st important question
Which 'micrometer' model ?? !!

Decades ago,' prePIC', I had to use 'logic level interface' as Mitty unit was battery powered.
Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Tue Nov 26, 2024 9:52 am     Reply with quote

Yes. I too have used them. Most are 1.5v devices. You need logic level
translation between 5v and 1.5v logic. The signal going to 1.5v, says
your device is the same.
pekka1234



Joined: 28 May 2017
Posts: 83

View user's profile Send private message

Mitutoyo
PostPosted: Tue Nov 26, 2024 10:20 am     Reply with quote

I have four different micrometer
One is round 543-601B original Mitutoyo. It 5mm length
One is about 40 years old Mitutoyo Absolute Digimatic the model has already removed, Oy is normal 150mm length.

Then I have quite new Powerfix (it is a similar to Mitutoyo) model 2285F . It is 150 mm length.

Then I have 1 meter Mitutoyo, but I it now out of my house
All they have 6 mm width , 5 pin connection.

The right pin is in all GND and the left pin is Request, 1.5V , it should go to ground. when RD (pin 2) goes low. Then there are CLK 3 and Data 4.
Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Thu Nov 28, 2024 8:45 am     Reply with quote

Yes, but these output signals need level translation. The REQ pin should
be pulled down by a FET.
Your connections should be:

N channel FET. One with a gate volt of only perhaps 3v.
PIC to gate of FET. FET source to GND. FET drain to REQ.

Then CLK and DATA each with a pull-up resistor to 1.55v, connected
to inputs of CMOS buffer gates.

Mitotoyo used to do a page in one of their data sheets, showing this
wiring.

You pulse REQ (turn your PIC output high to turn the FET on). The
unit should reply with data and the clock. The data bit should appear
within about 95uSec (memory here).
You can sample the data on either clock edge. The sequence is data
appears, then the clock drops/rises, then another data bit. The data
is sent just over 2000bps.

The data packet is 13 nibbles. 4 are just 1111, then 0000 or 0001 for +/-,
followed by 6 BCD digits, then a binary code 0100, 1100, 0010, or 1010
for 2,3,4 or 5 decimal places. finally 0000 or 0001 for mm/inch

The circuit you show is the wrong way round. REQ is an input to the
micrometer and needs to be pulled down. The outputs need the CMOS
gates you show. You really need to be using a FET, not a bipolar transistor
for the pull-down. This has to go below 0.4v and the diode drop in a
transistor won't give this.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group