2024年6月29日土曜日

spi-ram/mccでeuartにstdio.hを/c-mcc(CCPcaptureでUS)


spi-ramの配線は上記を参考にした 

https://ameblo.jp/pi-poh/entry-12667969903.html のプルアップ不要だった

cs,miso,mosi,sck::10,12,11,13のままholdとncをvccにつなぐのがキモだった!

#include <SPI.h>

void setup()
{
  Serial.begin(115200);
  pinMode (SS, OUTPUT);
  digitalWrite(SS,HIGH);

  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE0);
}

void loop()
{
  byte write_data = 0;
  byte read_data = 0;
  word ram_address = 0x0000;

  while(1)    //1=無限ループ
  {
    ram_wr( ram_address , write_data);
    read_data = ram_rd( ram_address );

    Serial.print("ram_address =");
    Serial.print(ram_address);
    Serial.print(" : write_data =");
    Serial.print(write_data);
    Serial.print(" : read_data =");
    Serial.println(read_data);

    ram_address++;
    write_data++;
    delay(500);

  }//while
}

//ライトシーケンス
void ram_wr(word add , byte data)
{
  byte add_H;
  byte add_L;
 
  add_H = highByte(add);  // 上位4ビット(アドレス)
  add_L = lowByte(add);       //  下位4ビット
 
  digitalWrite(SS,LOW);
  SPI.transfer(0x02);          //0x02=書き込みモード
  SPI.transfer(add_H);
  SPI.transfer(add_L);
  SPI.transfer(data);
  digitalWrite(SS,HIGH);
}

//リードシーケンス
int ram_rd( word add )
{
  byte add_H;
  byte add_L;
  byte r_data;
 
  add_H = highByte(add);
  add_L = lowByte(add);
 
  digitalWrite(SS,LOW);
  SPI.transfer(0x03);           //0x03=読み込みモード
  SPI.transfer(add_H);
  SPI.transfer(add_L);


  r_data = SPI.transfer(0);  // この0は多分ダミーデータだろう

  

digitalWrite(SS,HIGH);

 
  return r_data;
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

c-mcc book p298 :: pic16f18857でeuratするには

redirect to にチェックをいれるのとc90に変更するのが両方必要だった!

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

c-mcc book p360 :: pic16f18857 以下に成功

/*****************************************

 *  CCP キャプチャモード例題

 *  超音波距離系のパルス幅測定

 ****************************************/

#include "mcc_generated_files/mcc.h"

#include "lcd8x2_lib.h"

// 変数定義

uint16_t RiseEdge, FallEdge, Line2[10];

double Distance;

/******* メイン関数 *********************/

void main(void){

    SYSTEM_Initialize();

    lcd_init();

    lcd_str("Distance");

    /****** メインループ ***********/

    while (1)

    {


        TMR1_WriteTimer(0);                 // タイマ0リセット

        // トリガ出力

        Trig_SetHigh();

        __delay_us(10);

        Trig_SetLow();

        // 計測実行 1usec単位

        while(!CCP1_IsCapturedDataReady()); // 立ち上がり

// echoピンがhighになると上記のwhileから脱出

            RiseEdge = CCP1_CaptureRead();

        __delay_ms(100);

        while(!CCP1_IsCapturedDataReady()); // 立下り

//  every edgeの設定にて上記同様にechoピンがlowになるとwhileから脱出 多分!

            FallEdge = CCP1_CaptureRead(); 

        // 距離に変換しLCD表示  音速=343m/s 20℃

        Distance = (double)(FallEdge - RiseEdge)*343/20000;

        sprintf(Line2, "%3.1f cm  ", Distance);

        lcd_cmd(0xC0);

        lcd_str(Line2);

        __delay_ms(2000);

    }

}    


0 件のコメント:

コメントを投稿