WTC6508BSI

Skleptik

✩✩✩✩✩✩✩
4 Апр 2020
5
0
Приветствую!

Ребята помогите пожалуйста!
Ремонтирую устройство (меняю проц) ,
но там сенсорные кнопки реализованы c помощью микросхемы WTC6508BSI.
вот даташит.

Там есть пример для 8051.

Но моих знаний откровеннно не достаточно...
Вот что я сделал,
но не работают кнопки..

C++:
// ======================== ВЫБОР ПИНОВ ============
//======= OUTPUT RELAY =======
#define FAN_1 4 //pd4  почему то не работает...
#define FAN_2 19 //pd3
#define FAN_3 2 //pd2
#define LIGHT 3  //pc5

//======= OUTPUT LED_KEY =======
#define LED_POWER 6  //pd6, led6
#define LED_1 5     //pd5, led5
#define LED_2 11    //pd4, led4
#define LED_3 9     //pd3, led3
#define LED_MAX 8   //pd2, led2
#define LED_LIGHT 7 //pd1, led1

#define BUZZER 10   //pb2, buzzer

//======= INPUT =======
#define BUZZER_INPUT 13 //pb5, input_buzzer
#define SDA 16  //pc2, sda input
#define SCLK 15 //pc1, sclk input

#include "pitches.h"
//#include <avr/power.h>

#define prescal 1

bool power = false;
bool light = false;
bool maxFan = false;

byte speedFan = 0;
byte KeyState, oldKeyState;


void setup() {
  Serial.begin(9600);

  pinMode(FAN_1, OUTPUT);
  pinMode(FAN_2, OUTPUT);
  pinMode(FAN_3, OUTPUT);
  pinMode(LIGHT, OUTPUT);

  pinMode(LED_POWER, OUTPUT);
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(LED_MAX, OUTPUT);
  pinMode(LED_LIGHT, OUTPUT);
  pinMode(BUZZER, OUTPUT);

  pinMode(BUZZER_INPUT, INPUT);
  pinMode(SDA, INPUT);
  pinMode(SCLK, INPUT);

  ledState(false);
  startup();
  ledState(false);
}

void loop() {

  KeyState = read_key_data(); //Read the key information of the touch key
  Serial.println(read_key_data());

  delay(100);
}

byte read_key_data(void) {
  byte KeyValue,  i = 0;
  //  TR1 = 0;

  //------ Start bit setting ------
  digitalWrite(SDA, HIGH);
  digitalWrite(SCLK, LOW);

  //  SDA = 1; //The SDA is set to the input state, and the upper pulling resistor sets the SDA up to 1, which
  //  //indicates that the key information of the touch key is read from the touch chip
  //  SCLK = 0; //Generate downward delay signal of the serial clock

  delayMicroseconds(24);
  if (digitalRead(SDA) == 0) {

    //After transmitting the start bit, detect whether the touch chip has transmitted the confirmation signal
    //The touch chip does not set SDA to "0", which indicates that the touch chip is not ready to transmit
    digitalWrite(SCLK, HIGH);//    SCLK = 1; //SCLK resets to high level

    return (0); //The function returns 0 directly, which indicate that no valid key value is read
  }
  digitalWrite(SCLK, HIGH); //SCLK = 1; //Generate the upward delay signal of the serial clock
  delayMicroseconds(24);


  //------ Read the switch information of touch key (8 bit) ------
  do
  {
    KeyValue >>= 1;
    digitalWrite(SCLK, LOW);  //SCLK = 0; //Generate the downward signal of the serial clock
    delayMicroseconds(24);
    if (digitalRead(SDA) == 1) //Read the data on the SDA
    {
      KeyValue |= 0x80;
    }
    else
    {
      KeyValue &= 0x7F;
    }
    digitalWrite(SCLK, HIGH);  //SCLK = 1; //Generate the upward delay signal of the serial clock
    delayMicroseconds(24);
    i++;
  }
  while (i < 8); //Read the 8 bit data


  //------ Transmit the end bit (bus recovery) ------
  digitalWrite(SCLK, LOW);  //SCLK = 0; //Generate the downward delay signal of the serial clock
  delayMicroseconds(24);
  digitalWrite(SCLK, HIGH);  // SCLK = 1; //Generate the upward delay signal of the serial clock
  delayMicroseconds(24);
  //  TR1 = 1;
  return (KeyValue); // Return to read the touch key information
}

void startup() {

  digitalWrite(LED_POWER, 0);
  delay(100);
  digitalWrite(LED_1, 0);
  delay(100);
  digitalWrite(LED_2, 0);
  delay(100);
  digitalWrite(LED_3, 0);
  delay(100);
  digitalWrite(LED_MAX, 0);
  delay(100);
  digitalWrite(LED_LIGHT, 0);
  delay(100);
  digitalWrite(LED_POWER, 1);
  delay(100);
  digitalWrite(LED_1, 1);
  delay(100);
  digitalWrite(LED_2, 1);
  delay(100);
  digitalWrite(LED_3, 1);
  delay(100);
  digitalWrite(LED_MAX, 1);
  delay(100);
  digitalWrite(LED_LIGHT, 1);
  delay(100);
  ledState(false);
}

void ledState(bool state) {
  if (!state) {
    digitalWrite(LED_POWER, 1);
    digitalWrite(LED_1, 1);
    digitalWrite(LED_2, 1);
    digitalWrite(LED_3, 1);
    digitalWrite(LED_MAX, 1);
    digitalWrite(LED_LIGHT, 1);
  } else {
    digitalWrite(LED_POWER, 0);
    digitalWrite(LED_1, 0);
    digitalWrite(LED_2, 0);
    digitalWrite(LED_3, 0);
    digitalWrite(LED_MAX, 0);
    digitalWrite(LED_LIGHT, 0);
  }

}
 

Skleptik

✩✩✩✩✩✩✩
4 Апр 2020
5
0
Народ! ну что совсем никто не разбирается что ли ?
поверить не могу.

Я уже сам разбираться начну таким темпом...

Короче, вроде наладил опрос микросхемы, но почему то мусор летит, или ложные срабатывания...
Помогите пожалуйста.

byte read_key_data(void) ; //функция опроса микросхемы
согласно даташиту, на SCL подается 10 импульсов низкого уровня, где первый стартовый 8 данные и последний стоповый.
ну и после каждого импульса читается состояние на SDA, и пишется в переменную....


C++:
// ======================== ВЫБОР ПИНОВ ============
//======= OUTPUT RELAY =======
#define FAN_1 4 //pd4  почему то не работает...
#define FAN_2 19 //pd3
#define FAN_3 2 //pd2
#define LIGHT 3  //pc5

//======= OUTPUT LED =======
//-======это индикация====
#define LED_POWER 6  //pd6, led6
#define LED_1 5     //pd5, led5
#define LED_2 11    //pd4, led4
#define LED_3 9     //pd3, led3
#define LED_MAX 8   //pd2, led2
#define LED_LIGHT 7 //pd1, led1

#define BUZZER 10   //pb2, buzzer

//======= INPUT =======
#define BUZZER_INPUT 13 //pb5, input_buzzer
#define SDA 16  //pc2, sda input
#define SCLK 15 //pc1, sclk

#include "pitches.h"
#define prescal 1
#define mcs 12
#define SENS 8

//------виртуальные кнопки----
bool powerKey = false;
bool key_1 = false;
bool key_2 = false;
bool key_3 = false;
bool maxFan_Key = false;
bool light_Key = false;

bool power = false;
bool light = false;
bool maxFan = false;

byte speedFan = 0, sens = SENS;
byte KeyState, oldKeyState;

void setup() {
  Serial.begin(9600);

  pinMode(FAN_1, OUTPUT);
  pinMode(FAN_2, OUTPUT);
  pinMode(FAN_3, OUTPUT);
  pinMode(LIGHT, OUTPUT);

  pinMode(LED_POWER, OUTPUT);
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(LED_MAX, OUTPUT);
  pinMode(LED_LIGHT, OUTPUT);
  pinMode(BUZZER, OUTPUT);

  pinMode(BUZZER_INPUT, INPUT);

  pinMode(SDA, OUTPUT);
  pinMode(SCLK, OUTPUT);

  digitalWrite(LED_POWER, HIGH);
  digitalWrite(LED_1, HIGH);
  digitalWrite(LED_2, HIGH);
  digitalWrite(LED_3, HIGH);
  digitalWrite(LED_MAX, HIGH);
  digitalWrite(LED_LIGHT, HIGH);
  digitalWrite(SCLK, HIGH);

  startup();
  ledState(false);

  setSensiv(sens);

  pinMode(SDA, INPUT);
}

bool flag = false;
uint32_t btnTimer = 0;

void loop() {

  oldKeyState = KeyState;
  Serial.println(KeyState);

  ledState(power);
  KeyState = read_key_data(); //Read the key information of the touch key

//  powerKey = bitRead(KeyState, 2);
//  key_1 = bitRead(KeyState, 1);
//  key_2 = bitRead(KeyState, 0);
//  key_3 = bitRead(KeyState, 5);
//  maxFan_Key = bitRead(KeyState, 4);
//  light_Key = bitRead(KeyState, 3);
//
//  if (powerKey && !flag && millis() - btnTimer > 100) {
//    flag = true;
//    btnTimer = millis();
//    Serial.println("press");
//    //    power = true;
//  }
//  if (!powerKey && flag && millis() - btnTimer > 100) {
//    flag = false;
//    btnTimer = millis();
//    Serial.println("release");
//  }

  delay(500);
}

byte read_key_data(void) {

  byte KeyValue = 0;
  bool inikey = false;
  //  ------ Start bit setting ------
  digitalWrite(SCLK, LOW);
  delayMicroseconds(mcs);

  if (digitalRead(SDA == LOW)) {
    digitalWrite(SCLK, HIGH);
    delayMicroseconds(mcs);
    if (digitalRead(SDA == LOW)) {
      inikey = true;
    }
  }
  //  -----------Read 8 bit touch key information bit-----------
  if (inikey) {
    for ( int i = 0; i < 8; i++) {
      digitalWrite(SCLK, LOW);
      delayMicroseconds(mcs);
      Serial.print(digitalRead(SDA));
      digitalWrite(SCLK, HIGH);
      bitWrite(KeyValue, i, digitalRead(SDA));
      Serial.print(digitalRead(SDA));
      delayMicroseconds(mcs);
    }
  }
  digitalWrite(SCLK, LOW);
  delayMicroseconds(mcs);
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(mcs);

  if (digitalRead(SDA == HIGH)) {
    return KeyValue;
  } else {
    return 0;
  }
  inikey = false;
}

void setSensiv(byte sens) {

  //  ------ Start bit setting ------
  digitalWrite(SDA, LOW);
  delayMicroseconds(mcs);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(mcs);
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(mcs);

  //  -----------Set 8 bit sensivity-----------

  for ( int i = 0; i < 8; i++) {
    digitalWrite(SDA, bitRead(sens, i));
    digitalWrite(SCLK, LOW);
    delayMicroseconds(mcs);
    digitalWrite(SCLK, HIGH);
    delayMicroseconds(mcs);
  }

  digitalWrite(SDA, HIGH);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(mcs);
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(mcs);
  delay(100);
}

void startup() {

  digitalWrite(LED_POWER, 0);
  delay(100);
  digitalWrite(LED_1, 0);
  delay(100);
  digitalWrite(LED_2, 0);
  delay(100);
  digitalWrite(LED_3, 0);
  delay(100);
  digitalWrite(LED_MAX, 0);
  delay(100);
  digitalWrite(LED_LIGHT, 0);
  delay(100);
  digitalWrite(LED_POWER, 1);
  delay(100);
  digitalWrite(LED_1, 1);
  delay(100);
  digitalWrite(LED_2, 1);
  delay(100);
  digitalWrite(LED_3, 1);
  delay(100);
  digitalWrite(LED_MAX, 1);
  delay(100);
  digitalWrite(LED_LIGHT, 1);
  delay(100);
  ledState(false);
}

void ledState(bool state) {
  if (!state) {
    digitalWrite(LED_POWER, 1);
    digitalWrite(LED_1, 1);
    digitalWrite(LED_2, 1);
    digitalWrite(LED_3, 1);
    digitalWrite(LED_MAX, 1);
    digitalWrite(LED_LIGHT, 1);
  } else {
    digitalWrite(LED_POWER, 0);
    digitalWrite(LED_1, 0);
    digitalWrite(LED_2, 0);
    digitalWrite(LED_3, 0);
    digitalWrite(LED_MAX, 0);
    digitalWrite(LED_LIGHT, 0);
  }

}