Skocz do zawartości

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


ethanak

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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 🙂

 

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.