Menu

Connect a MCU6050 the the scamp

2025-09-15
2025-09-15
  • Jan Kromhout

    Jan Kromhout - 2025-09-15

    Using the code below, I'm trying to connect an MCU6050 to the Scamp3.
    At first, the code seems to work. The I2C clock speed is reduced.
    But after reading the sensor a few times, the program hangs, or the I2C is broken.
    With the test program, I call the MCU, delete the result, and print a dot.
    But after calling the program about 15 times, the program stops.

    I've also written test code for the Arduino Uno, and it runs perfectly, without
    the system hanging.

    Include also the basic procedure arduino to read the MCU6050.

    My question is, am I doing something wrong?

    --MCU6050
    marker --MCU6050
    
    $68 constant MCU6050 
    
    150 $2de ! \ Verlaag de kloksnelheid I2C
    
    
    : read8 ( reg -- value )
        start                   \ start I2C transmissie
        MCU6050 write drop      \ stuur schrijf commando 
        send drop               \ stuur register adres 
        repstart                \ herstart voor lees operatie
        MCU6050 read drop       \ stuur lees commando 
        receive                 \ ontvang byte van slave
        nack                    \ stuur NACK (laatste byte)
        stop                    \ stop I2C transmissie
    ;
    
    : read16 ( reg -- value )
        start                   \ start I2C transmissie
        MCU6050 write drop      \ schrijf 
        send drop               \ schrijf reg
        repstart
        MCU6050 read drop       \ lees
        receive ack             \ eerste byte (hoge byte)
        receive nack            \ tweede byte (lage byte)
        stop
        swap                    \ get hige byte
        8 lshift +              \ (hoge_byte << 8) + lage_byte
    ;
    
    : write8 ( reg value -- )
        start                   \ start I2C transmissie
        MCU6050 write drop      \ schrijf naar MPU adres (leaves ACK)
        swap                    \ breng reg naar top ( value reg )
        send drop               \ stuur register adres
        send drop               \ verstuur hoge byte van value
        stop
    ;
    
    : init6050 ( -- )
        150 $2de !      \ change clk speed I2C
        $6b 0 write8    \ schrijf 0 naar power management register
        $19 7 write8    \ sample rate = 1kHz/(1+7) = 125Hz 
        $1b 0 write8    \ ±2g range 
        $0b 0 write8    \ ±250°/s range
    ;
    
    : readAll ( reg -- val0 val1 val2 )
        start                   \ start I2C transmissie
        MCU6050 write drop      \ schrijf naar MPU adres (leaves ACK)
        send drop               \ schrijf reg
        repstart
        MCU6050 read drop
        receive ack             \ eerste byte (hoge byte)
        receive ack             \ tweede byte (lage byte)
        swap                    \ get high byte
        8 lshift +              \ (high_byte << 8) + low-byte
        receive ack             \ eerste byte (hoge byte)
        receive ack             \ tweede byte (lage byte)
        swap                    \ get high byte
        8 lshift +              \ (high_byte << 8) + low-byte
        receive ack             \ eerste byte (hoge byte)
        receive nack            \ tweede byte (lage byte)
        swap                    \ get high byte
        8 lshift +              \ (high_byte << 8) + low-byte
        stop
    ;
    
    : .6050
        cr
        $3b readAll  5 u.r 5 u.r 5 u.r  cr 
        $43 readAll  5 u.r 5 u.r 5 u.r  cr  
    ;
    
    
    : CLS
        27 emit ." [2J" \ Clear entire screen
    ;
    
    : HOME ( -- )  
        27 emit ." [H"  \ Move cursor to home (1,1)
    ;
    
    : CLR ( -- )
        CLS HOME        \ Clear screen and go home
    ;
    
    
    : test6050
        init6050
        200 ms
        begin
            \ CLR
            $3b readAll drop drop drop ." . "
            500 ms
        key? until
    ;
    

    Arduino:

    void getRawData(){
      Wire.beginTransmission(MPU);
      Wire.write(0x3b); // Start with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(true);
      Wire.requestFrom(MPU, 6, true);
      AccX = (Wire.read() << 8 | Wire.read()); // X-axis value
      AccY = (Wire.read() << 8 | Wire.read()); // Y-axis value
      AccZ = (Wire.read() << 8 | Wire.read()); // Z-axis value
      Wire.endTransmission(true);
    
      Wire.beginTransmission(MPU);
      Wire.write(0x43);
      Wire.endTransmission(true);
      Wire.requestFrom(MPU, 6, true);
      GyroX = Wire.read() << 8 | Wire.read();
      GyroY = Wire.read() << 8 | Wire.read();
      GyroZ = Wire.read() << 8 | Wire.read();
      Wire.endTransmission(true);
    }
    
     
  • Mikael Nordman

    Mikael Nordman - 2025-09-15

    Is your data stack balanced? Does it grow or shrink?

     
  • Jan Kromhout

    Jan Kromhout - 2025-09-15

    I have checked every word en the stack behavior is as it should. In my test program the stack is in balance!

     
  • Jan Kromhout

    Jan Kromhout - 2025-09-15

    I have checked every word en the stack behavior is as it should. In my test program the stack is in balance!

     

Log in to post a comment.