ESP8266 (ARDUINO IDE) - problem z konwersją przy kompilacji.

Pozostałe układy mikrokontrolerów, układy peryferyjne i inne, nie mieszczące się w powyższych kategoriach.
jerrylu
Posty: 27
Rejestracja: wtorek 12 sty 2016, 17:33

ESP8266 (ARDUINO IDE) - problem z konwersją przy kompilacji.

Postautor: jerrylu » piątek 13 maja 2016, 15:15

Heloł,

jest to pierwsza moja prośba o pomoc.
Dotychczas udawało mi się rozwiązywać wszystkie moje mikrokontrolerowe problemy samodzielnie, bądź korzystając z dobrodziejstw Internetu :)
Ale rzeźbię projekcik na ESP8266 - wieczny zegar (NTP) na 7seg - na teraz moduł z dwoma rejestrami 595.
Natknałem się na taki problem, na którym ugrzązłem jak na razie.
Kompliuję taki oto fragment kodu:

Kod: Zaznacz cały

#define _A_ 0x01
#define _B_ 0x02
#define _C_ 0x04
#define _D_ 0x08
#define _E_ 0x10
#define _F_ 0x20
#define _G_ 0x40
#define _DP_ 0x80

const uint8_t LED_7SEG[] = {
  ~(_A_|_B_|_C_|_D_|_E_|_F_),    // 0
  ~(_B_|_C_),            // 1
  ~(_A_|_B_|_G_|_D_|_E_),      // 2
  ~(_A_|_B_|_C_|_D_|_G_),      // 3
  ~(_B_|_C_|_F_|_G_),        // 4
  ~(_A_|_C_|_D_|_F_|_G_),      // 5
  ~(_A_|_C_|_D_|_E_|_F_|_G_),    // 6
  ~(_A_|_B_|_C_),          // 7
  ~(_A_|_B_|_C_|_D_|_E_|_F_|_G_),  // 8
  ~(_A_|_B_|_C_|_D_|_F_|_G_),    // 9
  ~(_A_|_B_|_C_|_E_|_F_|_G_), // A
  ~(_C_|_D_|_E_|_F_|_G_), // b
  ~(_D_|_E_|_G_), // c
  ~(_B_|_C_|_D_|_E_|_G_), // d
  ~(_A_|_D_|_E_|_F_|_G_), //e
  ~(_A_|_E_|_F_|_G_), // f
  ~(_A_|_B_|_E_|_F_|_G_), // P [0x10]
  ~_G_, // - [0x11]
  ~_A_, ~_B_, ~_C_, ~_D_, ~_E_, ~_F_, // 0x12 - 0x17
  0 // 0x18
};


I dostaję multum ostrzeżeń o nieprawidłowej konwersji:
"warning: narrowing conversion of '-33' from 'int' to 'const uint8_t {aka const unsigned char}' inside { } [-Wnarrowing]"

Czyli z #define bierze sobie int (wychodzi mu ujemny) i próbuje go upchnąć w tablicy jako uint8_t.
Oczywiście po tej konwersji jest parę dziwnych znaków.

Poradziłem sobie na szybko tworząc tablicę konkretnych wartości i jest prawie dobrze, jeszcze tylko "dot" mi się świeci, ale to nie problem.
Chciałbym mieć możliwość "przyjaznego" projektowania znaków, a tutaj coś takiego...
Kod kompiluje się pod g++ w eclipse i daje poprawne wyniki.

Może ktoś ma pomysł na ten problem?

Pozdrawiam
Jurek
Ostatnio zmieniony piątek 13 maja 2016, 17:09 przez jerrylu, łącznie zmieniany 1 raz.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: Antystatyczny » piątek 13 maja 2016, 15:24

Ja ten problem rozwiązałem poprzez jawne rzutowanie każdego elementu tablicy na typ uint8_t
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

jerrylu
Posty: 27
Rejestracja: wtorek 12 sty 2016, 17:33

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: jerrylu » piątek 13 maja 2016, 15:29

Działa! :)

jerrylu
Posty: 27
Rejestracja: wtorek 12 sty 2016, 17:33

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: jerrylu » piątek 13 maja 2016, 15:30

Próbowałem rzutować, ale jestem dzisiaj po dyżurze nocnym i mi się pomerdało...
Zacząłem rzutować _A_, _B_, itd. :oops:
Dzięki!
Oczywiście pochwalę się na forum jak dokończę.
Na teraz podaję źródło, skąd czerpię pełnymi garściami jak na razie :)
http://www.buxtronix.net/2015/12/esp8266-based-ntp-clock.html

Panowie, przy okazji prośba - moglibyście wydzielić tę rodzinę mikrokontrolerów do osobnej zakładki.
Ich popularność cały czas rośnie.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: Antystatyczny » piątek 13 maja 2016, 15:50

Ten problem z rzutowaniem nie występowałby, gdybyś nie próbował zmienić zawartości najstarszego bitu w elementach tablicy (u Ciebie to jest chyba dot point). Kompilator rzuca się, że być może przekraczam pojemność zmiennej, że być może coś tam innego... Kiedyś o tym czytałem i nawet dokopałem się do wyjaśnienia, ale w głowie pozostała wiadomość, że jeśli tworzę taką tablicę, neguję zawartość elementów i przy tym jeszcze manipuluję najstarszym bitem, to muszę jawnie rzutować.

Pozdrawiam!

PS. U mnie wyglądało to tak:

Kod: Zaznacz cały

const uint8_t tab[10] PROGMEM =

{
    (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),         //0
    (uint8_t)~(SEG_B|SEG_C),                        //1
    (uint8_t)~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),            //2
    (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),            //3
    (uint8_t)~(SEG_B|SEG_C|SEG_F|SEG_G),               //4
    (uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),            //5
    (uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),         //6
    (uint8_t)~(SEG_A|SEG_B|SEG_C),                     //7
    (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),   //8
    (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G)         //9
};
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

jerrylu
Posty: 27
Rejestracja: wtorek 12 sty 2016, 17:33

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: jerrylu » piątek 13 maja 2016, 16:10

Zdefiniowałem ostatni element - _NIC_ 0xFF (taka wartość powinna być)
i... nic :) Błąd conwersji nie zniknął
Ale nic to, najwazniejsze, że jest rozwiązanie.
Jak napisałeś o rzutowaniu każdego elementu tablicy, od razu mi klapki odpadły i złapałem się za głowę, jak ja to robiłem :)
Dzięki jeszcze raz.
Mogło by być POMÓGŁ, ale chyba nie ma.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: Antystatyczny » piątek 13 maja 2016, 16:19

A ten element _NIC_ też rzutowałeś?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

jerrylu
Posty: 27
Rejestracja: wtorek 12 sty 2016, 17:33

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: jerrylu » piątek 13 maja 2016, 16:41

Zdjąłem (po dodaniu _NIC_ na końcu) wszystkie rzutowania i pojawił się ponownie warning.
Jak są rzutowania działa w każej opcji.
W tej chwili nie ma to dla mnie znaczenia.
Nie jestem "obrzydliwy" na rzutowania ;)

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: ESP8266 (ARDUINO IDE) - problem z konwersją przykompilacji.

Postautor: Antystatyczny » piątek 13 maja 2016, 16:44

One po to są, by się nimi czasem ratować :) oczywiście mógłbyś stworzyć tablice elementów uint16_t i wtedy nie musiałbyś rzutować na uint8_t każdego jej elementu, ale podczas wpisywania danej do rejestru mógłby znowu wyskoczyć problem, bo przecież usiłujesz wpisać uint16_t do rejestru 8 bitowego :). Przerzutuj i zapomnij...
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.


Wróć do „Inne mikroklocki, również peryferyjne”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości