Skocz do zawartości
szczepulek

Arduino Mega2560 + Ethernet + DS18B20 + 7-seg. moduł LED TM1637 - Pomiar temperatury i wysyłanie do bazy SQL

Pomocna odpowiedź

@szczepulek nie chodziło mi o obrażanie się, ani kogokolwiek innego. Po prostu pojawiła się negatywna opinia nie o samej bibliotece, ale osobie - czyli autorze tej biblioteki mówiąc dokładniej. Moim zdaniem powinniśmy takich opinii unikać. Można skomentować czyjś kod, ale pisanie o kimś że jest kiepski w tym co robi jest co najmniej nieeleganckie. Co więcej wyrażając takie opinie o innych powinniśmy być świadomi, że to może sprowokować kogoś do oceny nas - i to niekoniecznie zgodnej z własną samooceną.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Niestety mam problem jak ugryźć MENU, ale na 4 cyfrowym wyświetlaczu LCD. Nie znalazłem w internetach czegoś takiego, na LCD tego mnóstwo.

exit , dn, up , ok   --klawisze podlaczone na jakichs tam pinach..

domyslnie wyswietlana temperatura

[20*5]

klik 'ok' >>

- [AL:30]

klik 'up'  do drugiej opcji

- [L 07]

klik 'up'/ 'dn' przenosi ponownie do [AL:30]   // 30 wartość pobrana z eeprom(alarmHigh,0)

Będąc na [L 07]  // 07 pobrane z eeprom(liniaNr,1)

klik ok >> edycja numeru linii 'up' +1,' dn' -1

podczas wejscia do menu, po 5 sek nieaktywnosci powrot do wyswietlania temperatury.

klik 'ok' >> zapis do eeprom (liniaNr,1)

tak samo na pozycji AL edycja +/- 1. I zapis.

po kliknieciu 'exit'

 

PS.: tak tak, wiem.. wykorzystam już millis() a delay w odstawkę. Przynajmniej te w moim kodzie nie bibliotekach.

Edytowano przez szczepulek

Udostępnij ten post


Link to post
Share on other sites
3 godziny temu, szczepulek napisał:

za każdym razem jak spoglądam na kod, widzę nieścisłości.. i rzeczy które można lepiej sprawniej zrobić,

Za każdym razem gdy zajrzysz do kodu widzisz, ze można coś poprawić, nawet jak to miganie led, bo np można dodać obsługę watchodoga. Innym razem obsługę wyjątków (w AVR to chyba tylko przerwanie od watchdoga). Później zauważysz, ze parę bajtów zaoszczędzisz jak zadeklarujesz void main() a nie int main(). Tak można poprawiać i udoskonalać w nieskończoność. Niestety, poprawki mają swoje konsekwencje jak ponowne testy produktu a testowanie ma swoją, najczęściej wysoka (mówimy o dobrym testowaniu) cenę. Z tego powodu, wiele projektów nie jest zmieniane na ARM tylko nadal robią to AVR, bo produkt jest pewny a konsekwencje błędu mogą być bardzo dotkliwe. Na ile dotkliwe, to wystarczy zapoznać się z protokołem SAS i uświadomić do czego jest używany.

Udostępnij ten post


Link to post
Share on other sites

Menu dla 7 segmentowego wyświetlacza.. a no właśnie, nie wiem skąd wcześniej brało mi się 8 segmentowy 😅😅

może ze względu na kropkę występującą DP, ale mniejsza z tym, i tak wiemy o co chodzi..

 

W poszukiwaniu jakiegoś przykładu na tych wyświetlaczach, no ne znalazłem takowego.. (przykładu)

  Podjąłem się próby przekształcenia bardzo uproszczonego Menu dla LCD pod moje potrzeby..

i tak oto to wygląda:

#include <TM1637Display.h>

/* ! ! ! ! ! ! ! ! ! !  ! !!  !! ! ! ! !  !
 * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit
 * 
 *  ! ! ! !  ! !! ! !  ! !  ! ! !!  ! 
 * 
*  kod oryginalny https://github.com/FritzenLab/LCD-Screen-Menu-System/tree/master/LCD-Screen-Menu
 * 
 * Made by Clovis Fritzen in 05/06/2017
 * http://www.FritzenMaker.com
 * http://www.FritzenLab.com.br
*/

#define CLK1 5 //wyswietlacz nr1 8segm.4-cz 
#define DIO1 6 //wyswietlacz nr1 8segm.4-cz


int WhichScreen =1;   // This variable stores the current Screen number
boolean hasChanged = true;
const int buttonPin = 37;    // the number of the pushbutton pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637

uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 };  //Dla LEDDispl4digit

//wyswietlenie segmentow dla AL
const uint8_t disp_alarm[] = {
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,           // A
  SEG_D | SEG_E | SEG_F   // L
};

//wyswietlenie segmentow dla L
const uint8_t disp_linia[] = {
  SEG_D | SEG_E | SEG_F ,// L
   0  // O
};  


void setup()
{
 // lcd.init();// initialize the lcd 0x20 lub 0x38??
//  lcd.backlight();
  pinMode(buttonPin, INPUT_PULLUP);
  display_1.setBrightness(0x0a); //LED7Seg 
   Serial.begin(9600);
   WhichScreen = 0;  //aby przy starcie zaczynało na pierwszej opcji menu
}
void loop()
{

  if (hasChanged == true) {
    
  switch(WhichScreen) {
    case 1:
    {
      firstScreen();
    }
      break;
    
    case 2:
      {
        secondScreen();
      }
      break;
    
    case 3:
      {
        thirdScreen();
      }
      break;
    
   /* Dla wiekszej ilosci wyswietlania pozycji menu
    *  
    case 4:
      {
        fourthScreen();
      }
      break;
    
    case 5:
      {
        fifthScreen();
      }
      break;
    
    case 6:
      {
        sixthScreen();
      }
      break; 
      */
  
    case 0:  //konczacy zapis menu
      {
        
      }
      break;
    }
    
}

    //-------------------------------
    // BEGIN of the switch debouncing code
    int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        hasChanged = true;
        WhichScreen++;
        
        
      }
    } else {
      hasChanged = false;
    }
  }
  lastButtonState = reading;
  // END of the switch Debouncing code
  // --------------------------------------
  if (WhichScreen > 3){
    WhichScreen = 1;
  }
}

void firstScreen()
  {
    display_1.clear();
   Serial.println("glowny ekran");  // test w serial
   display_1.showNumberDec(99, false, 2, 2);
  }
  
void secondScreen()
  {
  display_1.clear();  //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu
 int alarmHigh = 30;
 display_1.setSegments(disp_alarm, 2, 0);
 display_1.showNumberDec(alarmHigh, false, 2, 2);
  Serial.print("alarm:");  // test w serial
  Serial.println(alarmHigh);
  }
  
void thirdScreen()
  {
   display_1.clear(); 
  int liniaNr = 7;
  display_1.showNumberDecEx(liniaNr,0, true);
  display_1.setSegments(disp_linia, 2, 0);
  
   Serial.print("linia nr:");  // test w serial
   Serial.println(liniaNr);
  }
/*

dla większej ilosci przejsc miedzy wyswietlanymi informacjami, ponizej rozpiska dla wyswietlacza LCD !!!
  
 void fourthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("This is screen 4");
    lcd.setCursor(0,1);
    lcd.print("Just press btn");
  }
void fifthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("   Fifth screen");
    lcd.setCursor(0,1);
    lcd.print("i2C LCD screen");
  }
void sixthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("THE last screen");
    lcd.setCursor(0,1);
    lcd.print("  Sixth and last");
  }
  */

Nie próbowałem jeszcze z integracją do mojego projektu.

Button podpięty z: Pinem 37 - GND

Udostępnij ten post


Link to post
Share on other sites

Aktualizacja powyższego kodu, menu inicjowane osobnym klawiszem, i na nim przełączanie pomiędzy ustawieniami a wyświetlaniem na bieżąco jakichs tam parametrów, w tym wypadku do testu wartość na wejściu analogowym.

#include <TM1637Display.h>

/* ! ! ! ! ! ! ! ! ! !  ! !!  !! ! ! ! !  !
 * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit
 * 
 *  ! ! ! !  ! !! ! !  ! !  ! ! !!  ! 
 * 
 * This code create a MENU structure on a 16x2 LCD screen.
 * Six (6) different screens are implemented, and you can travel
 * thru them by pressing a button on Arduino PIN 4. Each press
 * of the button advances one (1) screen. 
 * 
 * Made by Clovis Fritzen in 05/06/2017
 * http://www.FritzenMaker.com
 * http://www.FritzenLab.com.br
*/

#define CLK1 5 //wyswietlacz nr1 8segm.4-cz 
#define DIO1 6 //wyswietlacz nr1 8segm.4-cz


int WhichScreen =1;   // This variable stores the current Screen number
boolean hasChanged = true;
boolean pokazMenu = 0;
const int buttonPin = 37;    // the number of the pushbutton pin
const int buttonMenu = 33; // wywolanie menu
int buttonState; // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 45;    // the debounce time; increase if the output flickers


int value; //testowe

TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637

uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 };  //Dla LEDDispl4digit

//wyswietlenie segmentow dla AL
const uint8_t disp_alarm[] = {
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,           // A
  SEG_D | SEG_E | SEG_F   // L
};

//wyswietlenie segmentow dla L
const uint8_t disp_linia[] = {
  SEG_D | SEG_E | SEG_F ,// L
   0  // O
};  

const uint8_t disp_set[] = {
  SEG_A | SEG_C | SEG_D | SEG_F | SEG_G ,// S
  SEG_A | SEG_C | SEG_E | SEG_F | SEG_G , // E
  SEG_D | SEG_E | SEG_F | SEG_G
};  

int test[2];

void setup()
{
 // lcd.init();// initialize the lcd 0x20 lub 0x38??
//  lcd.backlight();
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(buttonMenu, INPUT_PULLUP);
  display_1.setBrightness(0x0a); //LED7Seg 
   Serial.begin(9600);
   WhichScreen = 0;  //aby przy starcie zaczynało na pierwszej opcji menu
}
void loop()
{
  
    int value = analogRead(2);  // pomiar na analogowym wejsciu losowej
  Serial.print(F("Wejscie analogowe 2 ma wartosc: ")); // to na nic tu nie potrzebne
  Serial.println(value);
    test[1] = value; //zapis do tablicy potrzebny aby w CASE mozna bylo odczytac wartosc, po wrzuceniu do warunku na poczatku funkcji loop nie porzebne.
Serial.println(test[1]);

if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to ..
{
  delay(250);
  pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1
}

  
if (pokazMenu == 0) // jesli (domyslnie na starcie) mamy 0 to wykonaj program, wlasciwy..czy tez ten ktory ma sie glownie wykonywac
{  
  display_1.showNumberDec(test[1]); //info domslna strona  a raczej wyswietlacz, z w tym przypadku do testow wartoscia napiecia na analogowym pinie 
  
  hasChanged = true; // ustawiam na true, aby po wlaczeniu na menu pojawila sie na wyswietlaczu strona ustawien, bez tego zostaje zamrozony wynik ostatniego pomiaru z wejscia analogowego
  
}

else // jesli zmienna pokazMenu ma wartosc inna niz zero.. w tym wypadku tylko moze byc to 1 wykonaj.. wyswietlenie menu

{
 
 if (hasChanged == true) 
 {   
  switch(WhichScreen) {
    case 1:
    {
      firstScreen();
    }
      break;
    
    case 2:
      {
        secondScreen();
      }
      break;
    
    case 3:
      {
        thirdScreen();
      }
      break;
    
   /* Dla wiekszej ilosci wyswietlania pozycji menu
    *  
    case 4:
      {
        fourthScreen();
      }
      break;
    
    case 5:
      {
        fifthScreen();
      }
      break;
    
    case 6:
      {
        sixthScreen();
      }
      break; 
      */
  
    case 0:  //konczacy zapis menu
      {
        
      }
      break;
    }
    
}

    //-------------------------------
    // BEGIN of the switch debouncing code
    int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        hasChanged = true;
        WhichScreen++;
        
        
      }
    } else {
      hasChanged = false;
    }
  }
  lastButtonState = reading;
  // END of the switch Debouncing code
  // --------------------------------------
  if (WhichScreen > 3){
    WhichScreen = 1;
  }
}

}

void firstScreen()  // pierwsza strona opcji
  {

    display_1.clear();
   Serial.println("glowny ekran");  // test w serial
   display_1.showNumberDec(1246);
   delete []test;
   
  
  }
  
void secondScreen() // druga str opcji itd itp
  {
  display_1.clear();  //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu
 int alarmHigh = 30;
 display_1.setSegments(disp_alarm, 2, 0);
 display_1.showNumberDec(alarmHigh, false, 2, 2);
  Serial.print("alarm:");  // test w serial
  Serial.println(alarmHigh);
  }
  
void thirdScreen()
  {
   display_1.clear(); 
  int liniaNr = 7;
  display_1.showNumberDecEx(liniaNr,0, true);
  display_1.setSegments(disp_linia, 2, 0);
  
   Serial.print("linia nr:");  // test w serial
   Serial.println(liniaNr);
  }
/*

dla większej ilosci przejsc miedzy wyswietlanymi informacjami, ponizej rozpiska dla wyswietlacza LCD !!!
  
 void fourthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("This is screen 4");
    lcd.setCursor(0,1);
    lcd.print("Just press btn");
  }
void fifthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("   Fifth screen");
    lcd.setCursor(0,1);
    lcd.print("i2C LCD screen");
  }
void sixthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("THE last screen");
    lcd.setCursor(0,1);
    lcd.print("  Sixth and last");
  }
  */

 

Udostępnij ten post


Link to post
Share on other sites

od ostatniego czasu udzielania sie w tym temacie spoooro sie zmieniło w kodzie i działaniu programu, na plus oczywiście,

@RFM przyjacielu, mówiłeś że te 43 ms na wyświetlacze to bardzo dużo, masz rację, zauważyłem to kiedy dodałem kilka warunków do programu, i menu przedewszystkim, to jak reagowały klawisze.. a raczej nie reagowały 🙂

Świetnie było widać  lagi kiedy w tle są wysyłane na serialu dane, a główna strona czy raczej pętla odpowiedzialna za wyświetlanie 2 temperatur była w użyciu (pokazMenu=0);

Serial monitor wyrzucał nieregularnie linijki , zauważalne skokowe wyświetlanie podglądu danych.

Do myślenia dało mi dlaczego po wyświetleniu menu nie ma tego efektu a dane w serial monitorze szaleją 😄

jedyny wniosek, wyświetlanie menu jest odświeżane przy zmianie naciśnięciu jakiegoś klawisza.

    Kilka postów wstecz wspomniałeś o użyciu millis() i co jakiś czas odpytywać temperaturę, zaświtało mi w głowie, a co jak by tak co jakiś czas wyrzucać komendę Display..

Wrzuciłem to w warunek z millis() i BOMBA 💥

Wszystko odżyło, klawisze lepiej reagują, i serial.write/ serial.print działają płynnie.

Przykładowa wstawka

      wysw2LED[0] = display_2.encodeDigit(airoutCalkow/1000%10); //wyswietla cyfre dziesiatek z pomiaru cz.1 na wyswietlaczu pierwszym
      wysw2LED[1] = display_2.encodeDigit(airoutCalkow/100%10); //wyswietla cyfre jednosci z pomiaru cz.1 na wyswietlaczu pierwszym
      wysw2LED[2] = (SEG_A | SEG_B | SEG_F | SEG_G); // znak stopni zamiast kropki ktore brak w wyswietlaczu ktory posiadam
      wysw2LED[3] = display_2.encodeDigit(airoutCalkow/10%10); //pierwsza cyfra czesci dziesietnych

//      display_2.setSegments(wysw2LED); // wyswietlenie  temperatury na pierwszym wyswietlaczu  TO WŁAŚNIE LAGUJE TA LINIA

/* po wrzuceniu tej linii kodu jak ponizej ,cały program pędzi jak Passaciak TDI na 4000obr/min z dwiema turbinami */

      if (millis() - time4 >=100)
    {
      display_2.setSegments(wysw2LED); // wyswietlenie  temperatury na pierwszym wyswietlaczu
      time4 = millis();
    }
    

 

Udostępnij ten post


Link to post
Share on other sites

Wyciskaj ze staruszka AVR ile możesz. Ma ograniczenia, czasem można je akceptować, czasem nie. Najczęściej nie można akceptować Arduinowych "bibliotek". Nie jestem jakimś tam supermenem w pisaniu kodu, ale jak widzę te Arduinowe twory (potwory) t myślę, że Halloween jest codziennie.

Nie to, ze jestem przeciwnikiem AVR. Mają swoją niszę (kiedyś były super, bo ARM były zarezerwowane dla nielicznych) teraz, cóż, przeważnie taniej kupisz 100 razy lepszy ARMN za 2 razy mniejszą kasę (Mega2560).

AVR jest dobry na start (jak kiedyś z uC 8051, z CPU to Z-80), ale czasy się zmieniają. Do CV AVR to chyba sobie nie wpiszesz ? Jak myślisz, AVR to "atut" gdy szukasz pracy?

Udostępnij ten post


Link to post
Share on other sites

Na obecna chwilę poprzez odczyt millis na poczatku i na końcu loop obliczyłem średnią 28ms. Powiem tak, dla mnie to spory sukces przeskoczyć z tych 1568 ms na 118 a teraz do tych 30 ms. 

Wiem że da się to jeszcze przyspieszyć ale jak na bibliotekach standardowych myślę całkiem nieźle. Wyświetlacze odwiedzane co 125ms. 

Pewnie jeszcze pogrzebie i zejdę tych kilka ms niżej.

Co do programu na obecną chwilę:

  • Przyspieszenie interfejsu 
  • Wyświetlanie 2 wartości temperatur 
  • Dwa termometry ds18b20 obsługiwane bez potrzeby wpisywania ręcznie adresów
  • Menu wyświetlane na LED 4 digits 7 segm. Tm1637
  • Menu obsługiwane 4 przyciskami, Menu(next), Up/dodaj, Down/ujmij, OK/Zapisz.
  • Podczas edycji miga kontrolka(LED) o konieczności zapisania parametru nowego (porównanie do zawartości EEPROM.
  • Przy braku aktywności w Menu po 20 sek powrót do wyświetlania temperatur, jeśli parametru zmieniono a nie zapisano -powrót do ustawień odczytanych z eeprom.
  • Jeśli nie zapiszemy parametrów i przeskoczymy całe Menu ..to jak wyżej.
  • Sprawdzenie na bierząco czy nie przekroczono max temp w przypadku przekroczenia - sygnał na przekaźnik.
  • Możliwość wybrania Alarmu dla jednego z czujników z poziomu Menu.
  • Wybranie linii /ID dla tego zestawu monitorującego.
  • Obsługa pamięci eeprom (opcje update dla oszczędzania ilości zapisów,  porósnania wyświetlanych informacji z zawartością pamięci. W przypadku wgrania na nową płytkę programu przy pierwszym uruchomieniu nadanie wartości domyślnych w pamięci.
  • Wysyłanie przez Serial1 (znaki kontrolne początek i koniec przesyłanych danych. Na 11 znakach wysłane temp1 i temp2. Stan ALarmu. Nr Linii/id)
  • Wysyłanie co około 28-30ms.
  •  

Udostępnij ten post


Link to post
Share on other sites
17 minut temu, szczepulek napisał:

Powiem tak, dla mnie to spory sukces przeskoczyć z tych 1568 ms na 118 a teraz do tych 30 ms. 

Sukces ogromny. Uczysz się, poznajesz słabe punkty AVR, niedługo zaczniesz pisać soft na ARM. Paradoksalnie, na ARM łatwiej i szybciej pisze się soft niż na AVR a przy okazji są przeważnie tańsze niż AVR, czy tego chce @niveasoft tudzież (fajne, dosyć egzotyczne w dzisiejszych czasach słowo) Mirek K. (M36 - te 36 to chyba nr ulicy, nie wiek), czy nie.

Jak chcesz zajść poniżej tych 30 ms, co pewnie jest już bardziej sztuka dla sztuki, chyba, że odbierasz dane po UART z prędkością 921600 ale nawet 115200 może być problemem. Jeden bajt przy 115200 jest przesyłany w ok 87us. Arduino ma bufor 64 bajty (ESP 128). Łatwo policzyć, że w 30ms może być przysłane prawie 350 bajtów! Można zwiększyć bufor ale...już to kiedyś pisałem. Coś za  za coś.

 

Na koniec mojej wypowiedzi chciałbym zachęcić Cię do ARM. Dlaczego?

Używam ARM bo:

- ARM przeważnie są tańsze niż AVR o podobnym wyposażeniu oferując zdecydowanie większe możliwości (DMA) i prędkość działania.
- ARM, przy tym samym zegarze jest ok 7 razy szybszy od AVR, a maksymalne częstotliwości taktowania zaczynają się od 24MHz a kończą na 650 (w przypadku rodziny STM32.
- W przeważającej większości mają więcej pamięci RAM i można robić duże bufory nadawcze dla UART, I2c, SPI, USB.
- Maja bogatsze wyposażenie (liczba USART/UART, I2C, SPI, timerów) i większe możliwości tychże peryferii. 12 UART w STM32 nie jest problemem, AVR max 4. Można dołożyć np SC16IS7xx ale 1 UART to ok 10zł, 2 ok 19zł).
- Mają DMA (AVR ATmega/tiny nigdy o czymś takim nie słyszały).
- Wiele ARM ma USB, w AVR to rzadkość a USB jest teraz pewnym standardem.

- Sprzętowe sterowanie przepływem i kierunkiem transmisji (RS485) ale nie w każdym STM32.
- Wersje z Ethernetem, AVR nie ma z ETH.
- Wszystkie timery 16-bit (można łączyć w 32-bit) a wiele wersji posiada 32-bit.
- ADC 12..16-bit, CA 12-bit.
- ADC do 80MS/s (LPC), 18MS/s (STM32).
- Mają wielopoziomowy system przerwań (15 poziomów, Xmega tylko 3, Mega/Tiny 0 ale najnowsze wersje maja już 3 poziomy).
- Zdecydowanie większe pojemności pamięci FLASH (do 2MB) i RAM (do 1MB) o czym nawet AVR Xmega mogą tylko pomarzyć.
- Sprzętowe interfejsy CAN, LCD równoległe, matryce LCD kolor 18-bit.
- Stany wyjątkowe: Bład magistrali i podobne jak w MC68k (dawne MAC, Amiga).
- Kilkadziesiąt razy tańsze narzędzia (debuger STM32 - 13zł).

- CubeMX do konfigurowania i generowania kodu (najnowszy także IDE i kompilator).
- Podczas debugowania na bieżąco widzę stan zmiennych w AVR po zatrzymaniu uC.
- Nie muszę się zastanawiać czy dana jest w ram czy flasch aby użyć stosownej funkcji (z sufiksem _P).
- Argument w sprintf, scanf itp nie jest ograniczony do 16-bit int lecz do 32-bit.
- Przesuwane bitu (w lewo) nie jest ograniczone do 16 bitów.
- W AVR nie ma typu double, ma taki sam zakres jak float. I tak dobrze, że od którejś tam wersji, typ long long ma 64-bity a nie jak wcześniej 32-bit tak samo jak long.
- Odkładanie na stos w przerwaniu rejestrów, które czasem nie są używane (R0, R1, RAMPZ, rejestr statusu) co wymusza czasem używanie wstawek ASM.

 

Z własnych doświadczeń (to nie tylko moja opinia) mogę napisać, że RPi itp często trzeba wspomagać jakimś uC. Kiedyś robiłem to na AVR, teraz na STM32 (dawno, dawno temu na CPLD Altery z serii MAX7, MAX3). Piszę o tym abyś nie był rozczarowany. Unikaj bibliotek Adafruit. Chyba najgorsze jakie widziałem zarówno na Arduino jak i RPi. W sumie to można by książkę napisać na ten temat.

 

Życzę powodzenia w walce z AVR i mam nadzieję, że szybko dołączysz do grona ARMowców 🙂 Bardzo żałuję, że przez pewien splot wydarzeń a raczej pazerność firmy, w które pracowałem, nie kontynuowałem pracy z AVR od ok 2006 roku lecz dopiero, gdy odszedłem indywidualnie zainwestowałem w ARM czego nie żałuję. To inna liga i wcale nie trudniejsza niz AVR, zwłaszcza gdy bierzemy pod uwagę Xmega.

 

Udostępnij ten post


Link to post
Share on other sites
12 godzin temu, RFM napisał:

Mirek K. (M36 - te 36 to chyba nr ulicy, nie wiek), czy nie.

Czyli to stąd taka święta wojna przeciwko AVR... Panie Sławomir S. może lepiej zabrać się do roboty zamiast zazdrościć innym?

  • Nie zgadzam się! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

W moim wypadku ardu tylko do wysyłania. A esp do odbioru.. nasłuchiwania po serialu. Dalej śle po wifi co 5 min wyłapane dane z pomiarami i poprzez stronę php do bazy danych. Dla moich potrzeb te czasy są wystarczające do komfortowej pracy z monitorem temperatur.

Z całym szacunkiem do wszystkich. Prosił bym aby nie toczyć tutaj wojen słownych. Tylko skupmy się na projekcie 🙂 powtarzam ..z całym szacunkiem 🤗

Edytowano przez szczepulek

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...