Skocz do zawartości
RFM

Akcelerator dla wyświetlaczy graficznych

Pomocna odpowiedź

3 minuty temu, Sabre napisał:

Sam jestem od zawsze bascomowcem i nie czuję potrzeby przesiadania się na cokolwiek innego.

Bascom ogranicza się do AVR a AVR ma duże ograniczenia choćby sterowanie tak prostym wyświetlaczem jak 128x128 16-bit. Może nie używałeś takich wyświetlaczy i Bascom wystarcza, albo sięgałeś po drogi wyświetlacz z FT8xx albo NEXTION podrażając projekt. Ja robiłem projekty, których na AVR nie da się zrobić nawet jakby z nich zrobić klaster a nawet jeśli to byłoby to nieopłacalne ponadto wiem jak ciężko pisze się soft na kilka uC współpracujących ze sobą.

 

7 minut temu, Sabre napisał:

piszę sam albo szukam kodu w sieci bo a nóż już ktoś mnie ubiegł.

To znajdź lub napisz kod, który konwertuje DMX  z USB i RS485, steruje diodami WS2812 i wystawia DMX na wyjściu. Naturalnie program nie może gubić ramek DMX, max 1024 WS2812 odświeżanie ok 30Hz. Ważna jest cena, więc nie może to by kilka AVR, czy AVR + zewnętrzne UART, ma być jeden mikrokontroler.

 

11 minut temu, Sabre napisał:

Chodzi o to żeby się nie męczyć, a nie o to, żeby wszystko było optymalne do granic możliwości

Dlatego aby nie walczyć o każdy cykl maszynowy, robić wstawki ASM, biorę ARM z kilkudziesięcioma kB RAM, DMA odpalam RTOS i program choc nieoptymalny napiszę szybko bo mam zegar 64MHz, 168 czy jak trzeba 480 albo 600MHz a nie 20 czy 32.

Zwrócę uwagę, że aby wykorzystać szybki zegar trzeba na max używać peryferii, te często muszą być wspomagana przez DMA to zaś wymaga dużych buforów czyli RAM a do tego AVR nie bardzo się nadaje.

 

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, RFM napisał:

To znajdź lub napisz kod, który konwertuje DMX  z USB i RS485, steruje diodami WS2812 i wystawia DMX na wyjściu. Naturalnie program nie może gubić ramek DMX, max 1024 WS2812 odświeżanie ok 30Hz. Ważna jest cena, więc nie może to by kilka AVR, czy AVR + zewnętrzne UART, ma być jeden mikrokontroler.

Ale nie potrzebuję czegoś takiego więc nie muszę tego pisać w Bascomie ani w żadnym innym języku. @RFM chyba nie zrozumiałeś sensu mojego posta sądząc po tylu cytatach mojej wypowiedzi. Więc jeszcze raz, hobbysta zrobi wszystko najprościej dla niego jak się da, choć nie zawsze będzie to optymalne rozwiązanie czy najtańsze rozwiązanie. Ktoś, kto ma chleb z pisania softu na mikrokontrolery, nie siedzi na forach i raczej wie co robi i jest ponad to o czym jest mowa w tym temacie.

Udostępnij ten post


Link to post
Share on other sites
43 minuty temu, Sabre napisał:

Ale nie potrzebuję czegoś takiego więc nie muszę tego pisać w Bascomie ani w żadnym innym języku.

A gdybyś potrzebował? Jak byś podszedł do tematu?

 

44 minuty temu, Sabre napisał:

Więc jeszcze raz, hobbysta zrobi wszystko najprościej dla niego jak się da, choć nie zawsze będzie to optymalne rozwiązanie czy najtańsze rozwiązanie

Często projekt kończy w szufladzie, bo hobbysta przeliczył się. Nieoptymalne rozwiązania to błąd. Mam takich wiele, w koszu. Stwierdziłem, ze lepiej podejść do tematu inaczej, więc nowe PCB, nowy uC/CPLD/FPGA, ponowna nauka i próby.

 

Projekt uznaję za ukończony. Pewnie jeszcze jakieś zmiany zajdą ale pewnie kosmetyka. Czas generowania jednej klatki animacji

45ms. Później musi być pauza 31ms aby obraz został wysłany do LCD. Daje to ponad 13 klatek na sekundę. Wąskim gardłem jest AVRmega bo pomiędzy bajtami są przerwy długości ok jednego bajtu czasem dłuższe. Na to jedyne lekarstwo to DMA ale jak uC ma DMA to po co akcelerator?

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, RFM napisał:

A gdybyś potrzebował? Jak byś podszedł do tematu?

Nie wiem, gdyż nigdy nie potrzebowałem. Ale jeśli już to pewnie użyłbym dodatkowych scalaków na wejściu i pewnie na wyjściu, a resztą zajęłaby się poczciwa mega328P

Udostępnij ten post


Link to post
Share on other sites
15 minut temu, Sabre napisał:

Nie wiem, gdyż nigdy nie potrzebowałem. Ale jeśli już to pewnie użyłbym dodatkowych scalaków na wejściu i pewnie na wyjściu, a resztą zajęłaby się poczciwa mega328P

Też tak kiedyś zrobiłem

 

 

na ulubionej (z małych) Mega1284. Jak policzysz koszt M1284, FT221XS, SC16IS760IPW to za wydasz 3 razy więcej niż na ARM, który zrobi to lepiej a program pisze się szybciej.

Fakt, że przejście na ARM to ok roku intensywnej (10..16 godzin dziennie, przez 6..7 dni w tygodniu) pracy ale później pisanie programu to przyjemność.

Udostępnij ten post


Link to post
Share on other sites

A tak z ciekawości zapytam - czemu właściwie służy ten temat?

Udostępnij ten post


Link to post
Share on other sites
11 minut temu, Elvis napisał:

A tak z ciekawości zapytam - czemu właściwie służy ten temat?

A czemu służy temat "w budowie" ?

 

Udostępnij ten post


Link to post
Share on other sites
18 godzin temu, deshipu napisał:

Tylko przez moją przekorność jakoś nie mogę przestać się zastanawiać po co w tym wszystkim to UNO tam jeszcze jest — przecież STM32 z palcem w nosie sobie poradzi także z tym programem, który UNO miało wykonywać i całość się znacznie uprości, bo odpada komunikacja.

Jeszcze raz odniosę się do tego. Na forum pojawił się projekt  "mówiącej kostki"  

więcej na stronie autora http://www.ksiega-cesarska.pl/443651047 Po co ISD?To wszystko może zrealizować jeden mikrokontroler, z DAC do tego karta SD lub dataflash. Odtwarzanie MP3 przez ARM to nie problem.

Wracając do tematu akceleratora, kod programu efektu

wygląda tak:

#define __CS 10
#define __DC 9


#include "EdWgfx.h"


// Color definitions
#define  BLACK   0
#define BLUE    2
#define GREEN   4
#define CYAN    9
#define MAGENTA 10
#define RED     11
#define WHITE   14
#define YELLOW  15


EdWgfx tft = EdWgfx(__CS, __DC);




#define ___   0
#define _ww   WHITE
#define _bB   BLUE
#define _MM   MAGENTA
#define _GG   GREEN
#define _CC   YELLOW

#define duch_x  14
#define duch_y  16
const PROGMEM uint8_t duch_M[] = {
  ___, ___, ___, ___, _MM, _MM, _MM, _MM, _MM, _MM, ___, ___, ___, ___,
  ___, ___, ___, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, ___, ___, ___,
  ___, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, ___,
  ___, _MM, _MM, ___, ___, _MM, _MM, _MM, _MM, ___, ___, _MM, _MM, ___,
  _MM, _MM, _MM, ___, ___, _MM, _MM, _MM, _MM, ___, ___, _MM, _MM, _MM,
  _MM, _MM, ___, ___, ___, ___, _MM, _MM, ___, ___, ___, ___, _MM, _MM,
  _MM, _MM, ___, ___, ___, ___, _MM, _MM, ___, ___, ___, ___, _MM, _MM,
  _MM, _MM, ___, ___, ___, ___, _MM, _MM, ___, ___, ___, ___, _MM, _MM,
  _MM, _MM, _MM, ___, ___, _MM, _MM, _MM, _MM, ___, ___, _MM, _MM, _MM,
  _MM, _MM, _MM, ___, ___, _MM, _MM, _MM, _MM, ___, ___, _MM, _MM, _MM,
  _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM,
  _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM, _MM,
  _MM, _MM, ___, _MM, _MM, _MM, ___, ___, _MM, _MM, _MM, ___, _MM, _MM,
  _MM, _MM, ___, _MM, _MM, _MM, ___, ___, _MM, _MM, _MM, ___, _MM, _MM,
  _MM, ___, ___, ___, _MM, _MM, ___, ___, _MM, _MM, ___, ___, ___, _MM,
  _MM, ___, ___, ___, _MM, _MM, ___, ___, _MM, _MM, ___, ___, ___, _MM,
};

const PROGMEM uint8_t duch_G[] = {
  ___, ___, ___, ___, _GG, _GG, _GG, _GG, _GG, _GG, ___, ___, ___, ___,
  ___, ___, ___, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, ___, ___, ___,
  ___, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, ___,
  ___, _GG, _GG, _ww, _ww, _GG, _GG, _GG, _GG, _ww, _ww, _GG, _GG, ___,
  _GG, _GG, _GG, _ww, _ww, _GG, _GG, _GG, _GG, _ww, _ww, _GG, _GG, _GG,
  _GG, _GG, _ww, _ww, _ww, _ww, _GG, _GG, _ww, _ww, _ww, _ww, _GG, _GG,
  _GG, _GG, _bB, _bB, _ww, _ww, _GG, _GG, _bB, _bB, _ww, _ww, _GG, _GG,
  _GG, _GG, _bB, _bB, _ww, _ww, _GG, _GG, _bB, _bB, _ww, _ww, _GG, _GG,
  _GG, _GG, _bB, _bB, _ww, _GG, _GG, _GG, _bB, _bB, _ww, _GG, _GG, _GG,
  _GG, _GG, _GG, _ww, _ww, _GG, _GG, _GG, _GG, _ww, _ww, _GG, _GG, _GG,
  _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG,
  _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG, _GG,
  _GG, _GG, ___, _GG, _GG, _GG, ___, ___, _GG, _GG, _GG, ___, _GG, _GG,
  _GG, _GG, ___, _GG, _GG, _GG, ___, ___, _GG, _GG, _GG, ___, _GG, _GG,
  _GG, ___, ___, ___, _GG, _GG, ___, ___, _GG, _GG, ___, ___, ___, _GG,
  _GG, ___, ___, ___, _GG, _GG, ___, ___, _GG, _GG, ___, ___, ___, _GG,
};


const PROGMEM uint8_t duch_C[] = {
  ___, ___, ___, ___, _CC, _CC, _CC, _CC, _CC, _CC, ___, ___, ___, ___,
  ___, ___, ___, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, ___, ___, ___,
  ___, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, ___,
  ___, _CC, _CC, _ww, _ww, _CC, _CC, _CC, _CC, _ww, _ww, _CC, _CC, ___,
  _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC,
  _CC, _CC, _ww, _ww, _ww, _ww, _CC, _CC, _ww, _ww, _ww, _ww, _CC, _CC,
  _CC, _CC, _bB, _bB, _ww, _ww, _CC, _CC, _bB, _bB, _ww, _ww, _CC, _CC,
  _CC, _CC, _bB, _bB, _ww, _ww, _CC, _CC, _bB, _bB, _ww, _ww, _CC, _CC,
  _CC, _CC, _bB, _bB, _ww, _CC, _CC, _CC, _bB, _bB, _ww, _CC, _CC, _CC,
  _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC,
  _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC,
  _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC,
  _CC, _CC, ___, _CC, _CC, _CC, ___, ___, _CC, _CC, _CC, ___, _CC, _CC,
  _CC, _CC, ___, _CC, _CC, _CC, ___, ___, _CC, _CC, _CC, ___, _CC, _CC,
  _CC, ___, ___, ___, _CC, _CC, ___, ___, _CC, _CC, ___, ___, ___, _CC,
  _CC, ___, ___, ___, _CC, _CC, ___, ___, _CC, _CC, ___, ___, ___, _CC,
};


const PROGMEM uint8_t duch_Cb[] = {
  ___, ___, ___, ___, _CC, _CC, _CC, _CC, _CC, _CC, ___, ___, ___, ___,
  ___, ___, ___, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, ___, ___, ___,
  ___, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, ___,
  ___, _CC, _CC, _ww, _ww, _CC, _CC, _CC, _CC, _ww, _ww, _CC, _CC, ___,
  _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC,
  _CC, _CC, _ww, _ww, _ww, _ww, _CC, _CC, _ww, _ww, _ww, _ww, _CC, _CC,
  _CC, _CC, _ww, _ww, _bB, _bB, _CC, _CC, _ww, _ww, _bB, _bB, _CC, _CC,
  _CC, _CC, _ww, _ww, _bB, _bB, _CC, _CC, _ww, _ww, _bB, _bB, _CC, _CC,
  _CC, _CC, _CC, _ww, _bB, _bB, _CC, _CC, _CC, _ww, _bB, _bB, _CC, _CC,
  _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC, _CC, _ww, _ww, _CC, _CC, _CC,
  _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC,
  _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC, _CC,
  _CC, _CC, ___, _CC, _CC, _CC, ___, ___, _CC, _CC, _CC, ___, _CC, _CC,
  _CC, _CC, ___, _CC, _CC, _CC, ___, ___, _CC, _CC, _CC, ___, _CC, _CC,
  _CC, ___, ___, ___, _CC, _CC, ___, ___, _CC, _CC, ___, ___, ___, _CC,
  _CC, ___, ___, ___, _CC, _CC, ___, ___, _CC, _CC, ___, ___, ___, _CC,
};


//================================================================================================
const float sin_d[] = {
  0, 0.17, 0.34, 0.5, 0.64, 0.77, 0.87, 0.94, 0.98, 1, 0.98, 0.94,
  0.87, 0.77, 0.64, 0.5, 0.34, 0.17, 0, -0.17, -0.34, -0.5, -0.64,
  -0.77, -0.87, -0.94, -0.98, -1, -0.98, -0.94, -0.87, -0.77,
  -0.64, -0.5, -0.34, -0.17
};
const float cos_d[] = {
  1, 0.98, 0.94, 0.87, 0.77, 0.64, 0.5, 0.34, 0.17, 0, -0.17, -0.34,
  -0.5, -0.64, -0.77, -0.87, -0.94, -0.98, -1, -0.98, -0.94, -0.87,
  -0.77, -0.64, -0.5, -0.34, -0.17, 0, 0.17, 0.34, 0.5, 0.64, 0.77,
  0.87, 0.94, 0.98
};
const float d = 10;
float px[] = {
  -d,  d,  d, -d, -d,  d,  d, -d
};
float py[] = {
  -d, -d,  d,  d, -d, -d,  d,  d
};
float pz[] = {
  -d, -d, -d, -d,  d,  d,  d,  d
};

float p2x[] = {
  0, 0, 0, 0, 0, 0, 0, 0
};
float p2y[] = {
  0, 0, 0, 0, 0, 0, 0, 0
};

int r[] = {
  0, 0, 0
};


void setup() {
  tft.begin();

  Serial.begin(38400);
}


void loop() {
  const byte pen = BLACK;


  uint32_t czasPetliS = millis();


  const byte fastCont = true;
  tft.setContinue( fastCont ); // Rozkaz za rozkazem
  //----- CLS -----//
  {
    byte static linia, dir = 1;

    //tft.fillScreen(WHITE);
    tft.fillRect( 0, 0, 127, linia, WHITE);
    tft.fillRect( 0, linia, 127, 127, RED);

    if ( dir ) linia += 5; else linia -= 5;
    if ( linia >= 120) dir = 0;
    if ( linia < 6 ) dir = 1;
  }


  {
    uint8_t static dir = 1, y, spd;

    tft.setTextAtrybut( TFT_MODE_PROP ); //| TFT_MODE_TXT_BACK );
    tft.setCursor(0, y);
    tft.setTextColor(BLUE);
    tft.setTextBack(WHITE);
    tft.setTextSize(1);
    tft.printString("Sprites demo");


    if ( ++spd == 2 ) {
      spd = 0;
      if ( dir ) {
        y++; if ( y > 110 ) dir = 0;
      }
      else {
        y--; if ( y < 10 ) dir = 1;
      }
    }
  }


  tft.setContinue( fastCont ); // Rozkaz za rozkazem
  //----- Sescian
  r[0] = r[0] + 1;
  r[1] = r[1] + 1;
  if (r[0] == 36) r[0] = 0;
  if (r[1] == 36) r[1] = 0;
  if (r[2] == 36) r[2] = 0;
  for (int i = 0; i < 8; i++)
  {
    float px2 = px[i];
    float py2 = cos_d[r[0]] * py[i] - sin_d[r[0]] * pz[i];
    float pz2 = sin_d[r[0]] * py[i] + cos_d[r[0]] * pz[i];

    float px3 = cos_d[r[1]] * px2 + sin_d[r[1]] * pz2;
    float py3 = py2;
    float pz3 = -sin_d[r[1]] * px2 + cos_d[r[1]] * pz2;

    float ax = cos_d[r[2]] * px3 - sin_d[r[2]] * py3;
    float ay = sin_d[r[2]] * px3 + cos_d[r[2]] * py3;
    float az = pz3 - 190;

    p2x[i] = ((tft.width()) / 2) + ax * 500 / az;
    p2y[i] = ((tft.height()) / 2) + ay * 500 / az;
  }
  for (int i = 0; i < 3; i++) {
    tft.drawLine(p2x[i], p2y[i], p2x[i + 1], p2y[i + 1], pen);
    tft.drawLine(p2x[i + 4], p2y[i + 4], p2x[i + 5], p2y[i + 5], pen);
    tft.drawLine(p2x[i], p2y[i], p2x[i + 4], p2y[i + 4], pen);
  }
  tft.drawLine(p2x[3], p2y[3], p2x[0], p2y[0], pen);
  tft.drawLine(p2x[7], p2y[7], p2x[4], p2y[4], pen);
  tft.drawLine(p2x[3], p2y[3], p2x[7], p2y[7], pen);


  //----- Duszki -----//
  tft.ofs( 20, 20 );
  uint8_t static s0x = 10, s0y = 10;
  tft.drawSprite_P(s0x, s0y, s0x + duch_x - 1, s0y + duch_y - 1, duch_G, duch_x * duch_y ); // sx + szerokość - 1, sy + wysokosc - 1
  s0x++; if ( s0x > 140 ) s0x = 0;
  s0y++; if ( s0y > 140 ) s0y = 0;

  uint8_t static s1x = 100, s1y = 100;
  tft.drawSprite_P(s1x, s1y, s1x + duch_x - 1, s1y + duch_y - 1, duch_M, duch_x * duch_y ); // sx + szerokość - 1, sy + wysokosc - 1
  s1x--; if ( s1x < 1 ) s1x = 140;
  s1y--; if ( s1y < 1 ) s1y = 140;

  {
    uint8_t static kier;
    uint32_t static tm;
    if ( millis() > tm ) {
      tm = millis() + 2000;
      kier ^= 1;
    }
    uint8_t static s2x = 0, s2y = 100;
    if ( kier )tft.drawSprite_P(s2x, s2y, s2x + duch_x - 1, s2y + duch_y - 1, duch_C, duch_x * duch_y ); // sx + szerokość - 1, sy + wysokosc - 1
    else tft.drawSprite_P(s2x, s2y, s2x + duch_x - 1, s2y + duch_y - 1, duch_Cb, duch_x * duch_y ); // sx + szerokość - 1, sy + wysokosc - 1
    s2x++; if ( s2x > 140 ) s2x = 0;
    s2y--; if ( s2y < 1 ) s2y = 140;
    tft.ofs( 0, 0 );
  }


  //----- Wyswietlenie -----//
  tft.display();
  delay(31); // Następne operacje po skończeniu transferu DMA. AVR może w tym czasie robić co tylko zechce
}


Prawda, że banalnie prosty?

Udostępnij ten post


Link to post
Share on other sites
6 minut temu, RFM napisał:

Po co ISD?To wszystko może zrealizować jeden mikrokontroler

Odwołując się do PPF. Skoro wiesz jak ulepszyć projekt tego autora, to może zaproponuj mu lepszy sposób. Dla kogoś, kto nigdy nie miał styczności z tego typu elektroniką może być to wyzwanie, a skoro wiesz w tym temacie coś więcej, to zachęcam do wypowiedzenia się bardziej merytorycznie. 😀

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A jest niby związek tego "akceleratora" z mówiącą kostką? Użytkownik @jerzyz opracował projekt, opisał jak go zrobił - i bardzo dobrze, miło widzieć że osoby przygotowują swoje projekty, maja z tego dużo zabawy i potrafią się nią podzielić z innymi.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, Gieneq napisał:

Odwołując się do PPF. Skoro wiesz jak ulepszyć projekt tego autora, to może zaproponuj mu lepszy sposób

Odniosłem się do wypowiedzi   @deshipu aby wyjaśnić co robi UNO bo w kostce mamy podobną sytuację, UNO + dodatek, który jest zbędny. Odpowiedź w temacie kostki tez będzie o ile autor coś więcej napisze, bo na razie to znalazłem na jego forum fotografię płytki z ISD.

Udostępnij ten post


Link to post
Share on other sites

Dodatek w postaci modułu ISD nie jest zbędny, jest ważnym elementem projektu. Ten sam projekt można zrealizować na mnóstwo sposobów, jedne są lepsze, inne gorsze - ale które są jakie zależy od kryteriów oceniania. Czasem lepsze jest to co wymaga mniej elementów, ale innym razem to co jest np. bardziej bezawaryjne, albo łatwiejsze (szybsze) do implementacji. Nie można tak odgórnie zakładać, że coś jest złe bo mi się nie podoba, albo jest do niczego bo ja bym to inaczej zrobił. W sumie tak podchodząc do tematu można każdy projekt skrytykować, a chyba nie o to chodzi.

Projekt kostki nie będzie produkowany seryjnie, powstał aby zrealizować pewną funkcjonalność i z tego co pisze autor - spełnia oczekiwania.

Udostępnij ten post


Link to post
Share on other sites

@RFM to napiszę to specjalnie dla Ciebie po raz trzeci, dalej nie rozumiesz idei hobbystycznego podejścia do elektroniki. Każdy robi to co robi tak jak umie. Można wszystko zrobić na jednym ARMie tak jak to jest w smartfonach, tylko po co? Nikt nie poświęci pół roku nauki nowej architektury i nowego środowiska tylko po to żeby "pomigać sobie diodą" (aluzja).

Jeśli zrobienie mówiącej kostki, dla autora, było prostsze za pomocą ISD to tak zrobił. Dlaczego dociekasz, że to nie DAC i karta flash? Przecież to nie Twój projekt. Rozumiem, że Ty zrobiłbyś to inaczej, ale dalej to podkreślę, że każdy robi tak jak potrafi i tak jak dla niego jest najprościej. I o to w tym wszystkim chodzi a Ty chyba tego nie rozumiesz.

Udostępnij ten post


Link to post
Share on other sites
29 minut temu, Sabre napisał:

a Ty chyba tego nie rozumiesz.

Nie rozumie Arduino. Skoro zostało stworzone jako platforma edukacyjna, do testów to dlaczego buduje się na niej użyteczne urządzenia?

Mam kilkanaście płytek DISCOWERY i NUCLEO produkcji STM i KAMAMI ale nie używam ich do budowy użytecznych urządzeń. Robię na tych płytkach testy, poznaję nowe uC ale budując urządzenie projektuję dedykowaną płytkę. 30 lat temu byłem amatorem i też projektowałem i wykonywałem PCB. Teraz projektuję a wykonanie pozostawiam firmom specjalizującym się w tym. 20 lat temu zamówienie PCB to duży koszt ale teraz więcej kosztują papierosy które spala się przez miesiąc.

Udostępnij ten post


Link to post
Share on other sites
Gość
Ten temat został zamknięty.

×
×
  • Utwórz nowe...