Skocz do zawartości

[Solved] ESP32 - różne wersje boardu dla IDE, różne działanie programu


Pomocna odpowiedź

Napisano (edytowany)

Hej.

Mam taki durny problemik z ESP32. Na wersji 1.0.4 kompiluje się, działa. Na wersji 2.0 kompiluje się, i nie działa...

Taki minimalny kompletny kawałek kodu:

#include <driver/adc.h>
#include <WiFi.h>

int dataPin = 36;
int clockPin = 39;

#define ADC_TRESHOLD 800
#define BIT_READ_TIMEOUT 100UL
#define PACKET_READ_TIMEOUT 250UL
#define PACKET_BITS       24

int getBit() {
    int data;

    uint32_t readTimeout = millis(); 
    while (analogRead(clockPin) > ADC_TRESHOLD) {
      if (millis() - readTimeout > BIT_READ_TIMEOUT)
        return -1;
    }
    while (analogRead(clockPin) < ADC_TRESHOLD) {
      if (millis() - readTimeout > BIT_READ_TIMEOUT)
        return -1;
    }
    data = (analogRead(dataPin) > ADC_TRESHOLD)?1:0;
    return data;
}

// read one full packet
long getPacket() 
{
    uint32_t packet = 0;
    uint32_t readTimeout = millis();

    int bitIndex = 0;
    while (bitIndex < PACKET_BITS) {
      int bit = getBit();
      if (bit < 0 ) {
        if (millis() - readTimeout > PACKET_READ_TIMEOUT) {
          return -1;
        }
        bitIndex = 0;
        packet = 0;
        continue;
      }
      packet |= (bit & 1)<<bitIndex;      
      bitIndex++;
    }
    return packet;
}

void setup()
{
    Serial.begin(115200);
    WiFi.mode(WIFI_MODE_NULL);
    analogReadResolution(11);
    analogSetAttenuation(ADC_6db);
}

void loop()
{
    long packet;
    packet = getPacket();
    if (packet >= 0) {
        printf("%08x\n",(uint32_t)packet);
        delay(200);
    }
}

Program sczytuje dane z suwmiarki, jak widać proste to jak rogalik. Skompilowany na 1.0.4 daje prawidłowe wyniki. Skompilowany na 2.0 przekształca się w całkiem niezły generator losowy... a co ciekawe - najstarszy (23) bit jest zawsze czytany prawidłowo.

Ma ktoś pomysł co tu jest nie tak?

Wyniki pomiarów sprawdzałem, są 0 (dla zera) i ok. 1500 (dla jedynki).

Aha, dlaczego 2.0 a nie 2.0.2 - bo na 2.0.2 nie działa prawidłowo dźwięk...

Edytowano przez ethanak

No, zrobione. Bardzo ładnie działa.

int getBit() {
    int data;
    uint32_t readTimeout = millis();
    while (adc1_get_raw(ADC1_CHANNEL_3) > 200) {
      if (millis() - readTimeout > BIT_READ_TIMEOUT)
        return -1;
    }
    while (adc1_get_raw(ADC1_CHANNEL_3) < 200) {
      if (millis() - readTimeout > BIT_READ_TIMEOUT)
        return -1;
    }
    data =  (adc1_get_raw(ADC1_CHANNEL_0) > 200) ?1:0;
    return data;
}
void setup()
{
    Serial.begin(115200);
    WiFi.mode(WIFI_MODE_NULL);
    adc1_config_width(ADC_WIDTH_BIT_9);
    adc1_config_channel_atten(ADC1_CHANNEL_0,ADC_ATTEN_DB_6);
    adc1_config_channel_atten(ADC1_CHANNEL_3,ADC_ATTEN_DB_6);
    
}

Nie wiem co on tam wyczynia w analogRead, ale patrząc pobieżnie na kod w esp32-hal-adc.c to coś dużo za dużo 🙂

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...