2024年4月24日水曜日

PIC16f1827 and aqm1602 success(both)

 /* from yosino san

 *  AQM1602 【16F1827】

 *   AQM1602/main.c   Created on 2024/04/20, 21:48

 */


// config1

#pragma config FOSC = INTOSC , WDTE = OFF , PWRTE = ON , MCLRE = ON , CP = OFF , CPD = OFF

#pragma config BOREN = OFF , CLKOUTEN = OFF , IESO = OFF , FCMEN = OFF

// config2

#pragma config WRT = OFF , PLLEN = OFF , STVREN = ON , LVP = OFF 


#include <xc.h>

#define _XTAL_FREQ 8000000


#define LCD_ADD 0x7C


char moji[] = "Hello,World!";

char moji2[] = "PIC16F1827";


void I2C_Master_Init(const unsigned long c){

    SSP1CON1 = 0b00101000;

    SSP1CON2 = 0;

    SSP1ADD = 19;                 // (_XTAL_FREQ / (4*c))-1;

    SSP1STAT = 0b00000000 ;    // 標準速度モードに設定する(100kHz)

}

void I2C_Master_Wait(){

    while ((SSP1STAT & 0x04) || (SSP1CON2 & 0x1F));

}

void I2C_Master_Start(){

    I2C_Master_Wait();

    SSP1CON2bits.SEN = 1;

}

void I2C_Master_Stop(){

    I2C_Master_Wait();

    SSP1CON2bits.PEN = 1;

}

void I2C_Master_Write(unsigned char d){

    I2C_Master_Wait();

    SSP1BUF = d;

}

void writeData(char t_data){

    I2C_Master_Start();

    I2C_Master_Write(LCD_ADD);

    I2C_Master_Write(0x40);

    I2C_Master_Write(t_data);

    I2C_Master_Stop();

    __delay_ms(10);

}

void writeCommand(char t_command){

    I2C_Master_Start();

    I2C_Master_Write(LCD_ADD);

    I2C_Master_Write(0x00);

    I2C_Master_Write(t_command);

    I2C_Master_Stop();

    __delay_ms(10);

}

void PICinit(){

    OSCCON=0x72;            // 8MHz

    ANSELA=0x00;

    ANSELB=0x00;

    TRISA=0x00;

    TRISB=0x12;             // 0b00010010

    PORTB=0x00;

}

void LCD_Init(){            //LCDの初期化

    I2C_Master_Init(100000);

    __delay_ms(400);

    writeCommand(0x38);

    __delay_ms(20);

    writeCommand(0x39);

    __delay_ms(20);

    writeCommand(0x14);

    __delay_ms(20);

    writeCommand(0x73);

    __delay_ms(20);

    writeCommand(0x52);

    __delay_ms(20);

    writeCommand(0x6C);

    __delay_ms(250);

    writeCommand(0x38);

    __delay_ms(20);

    writeCommand(0x01);

    __delay_ms(20);

    writeCommand(0x0C);

    __delay_ms(20);

}


void LCD_str(char *c) {      //LCDに配列の文字を表示

    unsigned char i,wk;

    for (i=0 ; ; i++) {

      wk = c[i];

      if  (wk == 0x00) {break;}

      writeData(wk);

    }

}


int main(void){

    PICinit();      //PICを初期化

    LCD_Init();

    writeCommand(0x01); //画面をクリア

    __delay_ms(20);

    writeCommand(0x02); //ホームへカーソル移動

    __delay_ms(2);                  // LCD側の処理待ち


    while(1){

        writeCommand(0x02);         //ホームへカーソル移動

        LCD_str(moji);

        writeCommand(0x40+0x80);    //2列目へ移動

        __delay_ms(200);

        LCD_str(moji2);

        __delay_ms(1000);

        writeCommand(0x01); //画面をクリア

        __delay_ms(200);

    }

    return 0;

}

--------------------------------------------------------------------

//コピペで超簡単!PICマイコンでI2C接続のLCD(AQM1602)を使う【PIC16F1938】 | Wak-tech

//  PIC16F1938 Configuration Bit Settings  を改変した

// 'C' source line config statements

// CONFIG1

    #pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)

    #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)

    #pragma config PWRTE = ON      // Power-up Timer Enable (PWRT disabled)

    #pragma config MCLRE = ON      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)

    #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)

    #pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)

    #pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)

    #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)

    #pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)

    #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)


    // CONFIG2

    #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)

     #pragma config PLLEN = OFF// PLL Enable (4x PLL disabled)

    #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)

    #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)

    #pragma config LVP = OFF        // Low-Voltage Programming Enable (Low-voltage programming enabled)


    // #pragma config statements should precede project file includes.

    // Use project enums instead of #define for ON and OFF.


    #include <xc.h>

  

    #define _XTAL_FREQ 8000000

    #define LCD_ADD 0x7C


    char moji[] = "Hello, PIC World!";

    char moji2[] = "Wak-tech";

    void I2C_Master_Init(const unsigned long c)

    {

      SSPCON1 = 0b00101000;

      SSPCON2 = 0;

      SSPADD = (_XTAL_FREQ/(4*c))-1;

      SSPSTAT = 0b00000000 ;    // ????????????(100kHz)

    }


    void I2C_Master_Wait()

    {

      while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));

    }


    void I2C_Master_Start()

    {

      I2C_Master_Wait();

      SSP1CON2bits.SEN = 1;

    }


    void I2C_Master_RepeatedStart()

    {

      I2C_Master_Wait();

      SSP1CON2bits.RSEN = 1;

    }


    void I2C_Master_Stop()

    {

      I2C_Master_Wait();

      SSP1CON2bits.PEN = 1;

    }


    void I2C_Master_Write(unsigned d)

    {

      I2C_Master_Wait();

      SSPBUF = d;

    }

    void writeData(char t_data){

        I2C_Master_Start();

        I2C_Master_Write(LCD_ADD);

        I2C_Master_Write(0x40);

        I2C_Master_Write(t_data);

        I2C_Master_Stop();

        __delay_ms(10);

    }

    void writeCommand(char t_command){

        I2C_Master_Start();

        I2C_Master_Write(LCD_ADD);

        I2C_Master_Write(0x00);

        I2C_Master_Write(t_command);

        I2C_Master_Stop();

        __delay_ms(10);

    }

    void PICinit(){

      OSCCON = 0b01110000;

      ANSELA = 0b00000000;

      ANSELB = 0b00000000;

      TRISA  = 0b00000000;

      TRISB  = 0b00010010; // RB1,RB4 as input

      PORTA  = 0b00000000;    //2????????

      PORTB  = 0x00;          //16????????

    }

    void LCD_Init(){            //LCD????

      I2C_Master_Init(100000);

      __delay_ms(400);

      writeCommand(0x38);

      __delay_ms(20);

      writeCommand(0x39);

      __delay_ms(20);

      writeCommand(0x14);

      __delay_ms(20);

      writeCommand(0x73);

      __delay_ms(20);

      writeCommand(0x52);

      __delay_ms(20);

      writeCommand(0x6C);

      __delay_ms(250);

      writeCommand(0x38);

      __delay_ms(20);

      writeCommand(0x01);

      __delay_ms(20);

      writeCommand(0x0C);

      __delay_ms(20);

    }


    void LCD_str(char *c) {     //LCD?????????

      unsigned char i,wk;

      for (i=0 ; ; i++) {

        wk = c[i];

        if  (wk == 0x00) {break;}

        writeData(wk);

      }

    }


    int main(void){

      PICinit();      //PIC????

      LCD_Init();

      writeCommand(0x01); //??????

      __delay_ms(20);

      writeCommand(0x02); //??????????

      __delay_ms(2); // LCD??????


      while(1){

          writeCommand(0x02);   //??????????

          LCD_str(moji);

          writeCommand(0x40+0x80); //2?????

          __delay_ms(200);

          LCD_str(moji2);

          __delay_ms(1000);

          writeCommand(0x01); //??????

          __delay_ms(200);

      }

      return 0;

    }

2024年4月20日土曜日

PIC weakpullup,I2C speed,US距離、

 P176の質問です 勝手にled点滅がおこります ウィークプルアップ不良?



こんばんは。テストしてみました。おっしゃる通りです。約5秒消灯、約5秒点滅を繰り返しています。
「8ピンPIC…」にも書いていましたが、内部抵抗は約40KΩ相当で流れる電流は25uAらしいです。
ノイズに弱いのでスイッチとの距離が長いとかノイズが多いときは抵抗の外付けを推奨していました。
テストでは電源に47uFと0.1uFのコンデンサを付け、スイッチもすぐ横につけましたがすぐに点滅し始めました。
1827のデータシートを見ると内部プルアップ時の電流は5Vで25~300uAとありました。ということは200Kから17KΩということですか。
AVRリファレンスではATmega44/88/168で20~50KΩとなっていました。
なんのノイズを拾うのでしょうかね。しかも一定周期で???

追伸です。失礼しました。以下の一行を WPUB4  = 1;       // RB4 weak pullupedの前に追加してください。

OPTION_REGbits.nWPUEN = 0;   // PORTB プルアップ有効
OPTION_REG 34,35ページ、それと45ページ1から3行あたりご参照ください。
初期値は「nWPUENは’1’、全WPU不可(MCLR除く)」になっています。よろしくお願いします。
--------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------

2024年4月15日月曜日

dht11 and lcd1602-i2c code / keypad

// http://7ujm.net/micro/i2clcd.html // nano and atmega328p-8mhz both success // arduino as isp(nano)10->atmega8 1pin,11->same 11,12->same 12,13->same 13 #include //アドレス0x27 16文字2行の液晶 LiquidCrystal_I2C lcd(0x27, 16, 2); #include // ライブラリのインクルード #define DHT_PIN 7 // DHT11のDATAピンをデジタルピン7に定義 1wire #define DHT_MODEL DHT11 // 接続するセンサの型番を定義する(DHT11やDHT22など) DHT dht(DHT_PIN, DHT_MODEL); // センサーの初期化 void setup() { dht.begin(); // センサーの動作開始 lcd.init(); // lcd initialize lcd.backlight(); } void loop() { delay(2000); // センサーの読み取りを2秒間隔に lcd.clear(); float Humidity = dht.readHumidity(); // 湿度の読み取り float Temperature = dht.readTemperature(); // 温度の読み取り(摂氏) if (isnan(Humidity) || isnan(Temperature)) { // 読み取りのcheck return; } lcd.setCursor(0, 0); lcd.print("humid "); lcd.print(Humidity,DEC); lcd.setCursor(0, 1); lcd.print("temp "); lcd.print(Temperature,DEC); } ------------------------------------------------------------------------ //https://novicengineering.com/arduino%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%83%86%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/ #include const byte ROWS = 4; //4行のキーパッドを使用 const byte COLS = 4; //4列のキーパッドを使用 char keys[ROWS][COLS] = { //配列を表す {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte rowPins[ROWS] = {9, 8, 7, 6}; //接続するピン番号 byte colPins[COLS] = {5, 4, 3, 2}; Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //キーパッドの初期化 void setup(){ Serial.begin(9600); } void loop(){ char customKey = customKeypad.getKey();//押されたキーを検出 if (customKey){ Serial.println(customKey); } }

2024年4月4日木曜日

7 segment pedia(CATHODE+TC4511,ANODE)


https://nobita-rx7.hatenablog.com/entry/2020/09/13/011558 

TC4511BPでBCD入力でカソードコモン7セグの操作 配線が詳しい


#define TC4511_LE 6

#define TC4511_BI 5

#define TC4511_LT 4

#define TC4511_D 7

#define TC4511_C 3

#define TC4511_B 2

#define TC4511_A 8


void setup() {

  Serial.begin(9600);

  pinMode(TC4511_LE, OUTPUT);

  pinMode(TC4511_BI, OUTPUT);

  pinMode(TC4511_LT, OUTPUT);

  pinMode(TC4511_D, OUTPUT);

  pinMode(TC4511_C, OUTPUT);

  pinMode(TC4511_B, OUTPUT);

  pinMode(TC4511_A, OUTPUT);

}


#define Array 19

bool Val[Array][7] ={

 /*LE,BI,LT, D, C, B, A*/

  { 0, 0, 0, 0, 0, 0, 0},  //0:8         ※優先順位1位(条件:                  LT=0)

  { 0, 0, 1, 0, 0, 0, 0},  //1:Blank     ※優先順位2位(条件:         BI=0 and LT=1)

  { 1, 1, 1, 0, 0, 0, 0},  //2:前回値保持 ※優先順位3位(条件:LE=1 and BI=1 and LT=1)

  { 0, 1, 1, 0, 0, 0, 0},  //3:0     ※以下優先順位4位(条件:LE=0 and BI=1 and LT=1)

  { 0, 1, 1, 0, 0, 0, 1},  //4:1

  { 0, 1, 1, 0, 0, 1, 0},  //5:2

  { 0, 1, 1, 0, 0, 1, 1},  //6:3

  { 0, 1, 1, 0, 1, 0, 0},  //7:4

  { 0, 1, 1, 0, 1, 0, 1},  //8:5

  { 0, 1, 1, 0, 1, 1, 0},  //9:6

  { 0, 1, 1, 0, 1, 1, 1},  //10:7

  { 0, 1, 1, 1, 0, 0, 0},  //11:8

  { 0, 1, 1, 1, 0, 0, 1},  //12:9

  { 0, 1, 1, 1, 0, 1, 0},  //Blank

  { 0, 1, 1, 1, 0, 1, 1},  //Blank

  { 0, 1, 1, 1, 1, 0, 0},  //Blank

  { 0, 1, 1, 1, 1, 0, 1},  //Blank

  { 0, 1, 1, 1, 1, 1, 0},  //Blank

  { 0, 1, 1, 1, 1, 1, 1},  //Blank

} ;


void loop() {

  for (int i = 3; i < 13; i++) { // 3=>0,13=>ARRAY ORIGINAL 

    Serial.println(i);

    digitalWrite(TC4511_LE, Val[i][0]);

    digitalWrite(TC4511_BI, Val[i][1]);

    digitalWrite(TC4511_LT, Val[i][2]);

    digitalWrite(TC4511_D, Val[i][3]);

    digitalWrite(TC4511_C, Val[i][4]);

    digitalWrite(TC4511_B, Val[i][5]);

    digitalWrite(TC4511_A, Val[i][6]);

    delay(1000);

  }

}

// https://nobita-rx7.hatenablog.com/entry/2020/09/13/011558

おはようございます。遅くまでやっていますね。

> AVマイコンプログラミング入門 258pで2sc1815を使う場合 スイッチする端子から
> 10kΩ経由で(15kΩの抵抗を分岐してGNDにつなぎつつ)ベースにつないでいます
> この理由がわかりません 電流がながれんときに確実にGNDにおちるように?
> (ちなみにモシニャガ先生本では55pで10kΩの抵抗のみベースにつないでいました)

Webより抜粋です。
『抵抗R3,4について
以下の理由で抵抗R3,4を入れた方が良いらしいです、抵抗値はR1,2と同じ値でOKですね。
・コレクタしゃ断電流(ICBO=0.6uA)の為にベースに漏れ電流が流れる、これにより(ICBO x hFE:0.6uA x 200)0.12mAの電流がコレクタに流れるのでその電流を逃がす必要が有る。
・ベースの入力に、トライステート出力やオープンコレクタ出力やスイッチなどを繋いだ場合にその信号がオープンになる可能性があり、オープンになるとICBOの漏れ電流の影響によりコレクタ電流が不安定になります、よって確実にトランジスタをON/OFFさせる必要が有ります。
・また、抵抗R1,2が断線した時や、R1,2の値が非常に大きい時において、外来ノイズによりトランジスタがON してしまう可能性が有るのでこれを防ぐ役目も有ります。』
それと2SC1815のベース・エミッタ間の最大電圧は5Vなので、抵抗R3,4を入れたほうが良いかもしれません。
よろしくお願いします。

-------ANODE COMMON---------------static点灯----------------------------

まずはUnoで試運転 led 抵抗は1kΩとした 

// https://burariweb.info/electronic-work/arduino-learning/arduino-7segment-led.html

// Arduino入門編㉔ 7セグメントLEDを制御する①

// https://burariweb.info

// 7セグメントLED配列

//         A(D2)

//        -------

//  F(D7)|       |B(D3)

//       | G(D8) |

//         -----

//       |       |

//  E(D6)|       |C(D4)

//        -------      .DP

//         D(D5) 

const int ASeg = 2;

const int BSeg = 3;

const int CSeg = 4;

const int DSeg = 5;

const int ESeg = 6;

const int FSeg = 7;

const int GSeg = 8;

 void setup() {

  pinMode(ASeg, OUTPUT);

  pinMode(BSeg, OUTPUT);

  pinMode(CSeg, OUTPUT);

  pinMode(DSeg, OUTPUT);

  pinMode(ESeg, OUTPUT);

  pinMode(FSeg, OUTPUT);

  pinMode(GSeg, OUTPUT);

}

void loop() {

  zero();

  delay(500);

  one();

  delay(500);

  two();

  delay(500);

  three(); 

  delay(500);

  four();

  delay(500);

  five(); 

  delay(500);

  six(); 

  delay(500);

  seven();

  delay(500);

  eight();

  delay(500);

  nine();

  delay(500);

}

// LED表示関数の定義

// 0を表示

void zero() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, LOW);

  digitalWrite(ESeg, LOW);

  digitalWrite(FSeg, LOW);

  digitalWrite(GSeg, HIGH);

}

// 1を表示

void one() { 

  digitalWrite(ASeg, HIGH);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, HIGH);

  digitalWrite(ESeg, HIGH);

  digitalWrite(FSeg, HIGH);

  digitalWrite(GSeg, HIGH);

}

// 2を表示

void two() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, HIGH);

  digitalWrite(DSeg, LOW);

  digitalWrite(ESeg, LOW);

  digitalWrite(FSeg, HIGH);

  digitalWrite(GSeg, LOW);

}

// 3を表示

void three() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, LOW);

  digitalWrite(ESeg, HIGH);

  digitalWrite(FSeg, HIGH);

  digitalWrite(GSeg, LOW);

}

// 4を表示

void four() {

  digitalWrite(ASeg, HIGH);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, HIGH);

  digitalWrite(ESeg, HIGH);

  digitalWrite(FSeg, LOW);

  digitalWrite(GSeg, LOW);

}

// 5を表示

void five() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, HIGH);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, LOW);

  digitalWrite(ESeg, HIGH);

  digitalWrite(FSeg, LOW);

  digitalWrite(GSeg, LOW);

}

// 6を表示

void six() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, HIGH);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, LOW);

  digitalWrite(ESeg, LOW);

  digitalWrite(FSeg, LOW);

  digitalWrite(GSeg, LOW);

}

// 7を表示

void seven() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, HIGH);

  digitalWrite(ESeg, HIGH);

  digitalWrite(FSeg, HIGH);

  digitalWrite(GSeg, HIGH);

// 8を表示

void eight() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, LOW);

  digitalWrite(ESeg, LOW);

  digitalWrite(FSeg, LOW);

  digitalWrite(GSeg, LOW);

}

// 9を表示

void nine() {

  digitalWrite(ASeg, LOW);

  digitalWrite(BSeg, LOW);

  digitalWrite(CSeg, LOW);

  digitalWrite(DSeg, LOW);

  digitalWrite(ESeg, HIGH);

  digitalWrite(FSeg, LOW);

  digitalWrite(GSeg, LOW);

}