Skocz do zawartości

Konwersja byte na tablicę int (albo innej zmiennej liczbowej)


kamdz

Pomocna odpowiedź

Witam, mam taki problem: mam zmienną byte zawierającą stan portów ekspandera na przykład 00001111. I chciałbym ją przekonwertować na jakąkolwiek liczbową tablicę o długości 8 {0,0,0,0,1,1,1,1}. Nie zależy mi na objętości programu, mam arduino mega 😉

Wersja z tablicą zdecydowanie ułatwi mi dalszą obróbkę danych.

Ktoś wie jak to zrobić?

Z góry dzięki za wszelkie pomysły 🙂

Link do komentarza
Share on other sites

Proszę bardzo:

uint8_t n, d, t[8];
for (n=0; n<8; n++)
{
  t[n] = d & 1;
  d >>= 1;
}

gdzie "n" to licznik bitów, "d" to 8 bitów do przekonwertowania a "t" to tablica wyników w której kolejnych komórkach masz po kolei bity z "d" począwszy od LSB.

  • Pomogłeś! 1
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

Pomijając to, że otwierający nawias klamrowy pętli powinien być linię wyżej, to zadziała 🙂

Instrukcja if nie wymaga operatorów porównania. W jej nawiasie możesz umieścić dowolne wyrażenie a dla if-a ważne jest tylko to, czy ma ono wartość zero czy jakąkolwiek inną. I albo wykonuje się część po else (dla zera) albo ta zaraz po if (dla != 0). Operatory porównania "produkują" w wyniku swojego działania zero gdy nie są spełnione i (w AVR) 16 bitów samych jedynek gdy są. Z resztą zawsze można to sprawdzić pisząc:

Serial.println(a>7);

dla różnych wartości zmiennej a.

Co więcej, można też zrobić np. tak:

x = (b>0);

i to też daje sensowne (i czasem przydatne) rezultaty.

W omawianym przypadku sztywne porónywanie t[n] z jedynką jest niebezpieczne o tyle, że jeśli Twój program napotka w tablicy np. wartość 3 to do wyniku wstawi na tym bicie zero a przecież 3 ma na LSB jedynkę i ogólnie nie jest zerem. Już lepiej (i bardziej przewidywalnie) jest zrobić:

if (t[n] > 0)

lub nawet:

if (t[n])

bo wtedy każda niezerowa wartość t[n] ustawi bit wyniku. No ale w zadaniu było LSB więc chyba najlepiej będzie:

if (t[n] & 1)

A sprawdzając np. jakąś flagę zero-jedynkową nie trzeba pisać:

if (dane gotowe != 0)

lub też:

if (dane_gotowe > 0)

ale wystarczy:

if (dane_gotowe)

i część po if wykona sie gdy zmienna dane_gotowe będzie != 0.

Acha, ja bym uprościł wnętrze pętli wywalając cały if:

d <<= 1;

d |= t[n] & 1;

Całkiem nieźle Ci idzie 🙂

Link do komentarza
Share on other sites

Taak ten nawias miał być wyżej 🙂

Wiem, że nie trzeba dawać w ifie tego = 1( dokopałem się w czeluściach książki 😉), ale dla mnie jest to bardziej czytelne i wolę tak robić. Ato jest funkcja dedykowana pod porty więc wystarczy 1 i 0. Jakby było tak generalnie no to by trzeba dać albo > albo ten sposób bez niczego, no ale ja wole tak. Swoją drogą to cały temat ma fajną genezę: namuzyce pani kazała zrobić instrument muzyczny, to sie spytałem czy może być elektroniczny 😉

Będę robił pianinko z 8 klawiszami (dźwięk przez buzzer) a ekspandera używam, bo w przeciwieństwie do pinów arduino ma upożadkowany rejestr stanów pinów (do niego ta funkcja) i przerwanie. Potem zrobię tablicę wartości dla poszczególnych klawiszy. W planach jest jescze dorobienie 2 tonacji (niższej i wyższej, razem będą 3) i pewnie jakaś muzyczka grana automatycznie 🙂 mam dwa tygodnie, więc nke wiem, z

Czy z wszystkim się wyrobię ale właśnie dlatego zdecydowałem się użyć arduino 🙂

Link do komentarza
Share on other sites

W takich zabawkach najtrudniej zrobić mechanikę tak, by w ogóle dawało się grać. To co chcesz dorobić to kolejne oktawy a nie tonacje. Rozpiętość trzech oktaw to już coś, choć bardzo poważnie pomyśl o czarnych klawiszach półtonów. Bez tego to raczej "Wlazł kotek na płotek zostaje" i parę innych kawałków w czystym C-dur. O ile pamiętam, to wszystkie inne (właśnie) tonacje mają krzyżyki więc bez czarnych ani rusz. Warto coś z podstaw teorii muzyki poczytać. A w ogóle grasz na czymś?

Generację tonu najłatwiej zrobić na timerze, bo podczas piszczenia musisz jednocześnie sprawdzać czy klawisz jest wciąż wciśnięty by szybko wyłączyć dźwięk. Czasy reakcji muszą być krótkie by urządzenie nie dawało wrażenia, że klawisze się zacinają. Do timera 2 jest biblioteka generacji dźwięków. Ma on jedno wyjście sprzętowe (OC2) na którymś porcie i tam musiz podłączyć bipczak. To wciąż będzie urządzenie 1-głosowe, niestety.

Jak już wejdziesz w temat muzyki i Cię wciągnie, to można utonąć na długo. Moc AVRa oprogramowanego w asemblerze wystarcza do pociągnięcia namiastki analogowego syntezatora polifonicznego. Widziałem gdzieś takie konstrukcje a ścieżki dźwiękowe z tego softu były całkiem całkiem. Jak z 8-bitowej konsolki Nintendo lub ze starego Atari 🙂

Samemu też można zacząć kombinować z generatorami, prostymi filtrami i układami obwiedni (ADSR) i daje to zaskakująco fajne efekty. Robisz wtedy pradziwie "analogowe" wyjście PWM i podłączasz do aktywnych głośniczków z kompa. Niezła zabawa.

BTW: Czyli pianinko robisz, taaa. A ładna ta Pani od Muzyki?

BTW2: Klawisze muszą być tak duże by bez problemu mieściły się na nich palce. Może jakieś drewniane klocki na wspólnej osi a pod nimi ukryte microswitche zwane też tact-switchami? Mają mały skok, ale ich "klik" nie jest w instrumencie pożądany. Być może najprostszym rozwiązaniem będzie kilkanaście transoptorów szczelinowych do których klawisze będą wsuwać przesłony? Ciche i nie ma wyraźnych oporów mechanicznych. Albo jakaś gotowa chińszczyzna..

Link do komentarza
Share on other sites

A nie... To ma być takie proste, nikt nie będzie na nim grał, tylko zrobić, przynieść dostać 6 i rozłożyć 😉

Będę to robił na 8 tact switchach. To nie jest żaden ambitny projekt, dlatego robię w Arduino

Grałem tylko na flecie w 1 klasie 😃

Pani średnia ale okropnie wredna 😉

Link do komentarza
Share on other sites

No ale rzecz na której "nikt nie będzie grał" trudno nazwać instrumentem.

Dobra, pokaż to cudo jak już je złożysz i zacznie dźwięki produkować. Wybierz którąś niską oktawę żeby nie raniło uszu. Najlepiej albo raz- albo dwukreślną.

Dziwne, że nie podłączasz klawiszków wprost do Arduino. Programowa konwersja z wczytanego portu na numer tonu jest jednak prostsza niż podłączanie ekspandera na I2C i obsługa jego (wielokrotnych przy odbiciach styków) przerwań.

Link do komentarza
Share on other sites

Ppproszę 🙂 dlatego lubię arduino. Taki projekt w jeden wieczór 🙂 nie wiem co to oktawa dwukreślna, ale ja dałem 3 wybierane przyciskami. I oda do radości samograjka 🙂 proszę bez skojarzeń z polityką, wybrałem to bo ma proste nuty i miło brzmi 🙂

Link do komentarza
Share on other sites

Ojej, żeby tylko nie rozpadło się w drodze do szkoły.. 🙂

Naprawdę fajne Arduinowe cacko, choć rzeczywiście grać się na tym nie da. Może Pani coś spróbuje, na pewno zna coś w C-dur. Miałaby dużego plusa za odwagę i ciekawość.

Moim zdaniem najlepiej brzmi ta najniższa oktawa. Próbowałeś przesunąć wszystko jeszcze jedną niżej?

No to co dalej? Podstawa już jest, szóstka w drodze, trzeba iść za ciosem. Nie poczułeś jakiegoś dreszczu gdy usłyszałeś swój sprzęt? Nie siedziałeś do rana komponując na pohybel sąsiadom? Nie odkryłeś nowej pasji?

Latasz jeszcze tym Toto? To przecież kultowy już dzisiaj samolot na pfmrc. Wg mnie, przynajmniej na tych kilku filmikach jakie obejrzałem, Twój miał kłopoty z wyważeniem. Sprawdzałeś położenie środka ciężkości? Był za bardzo przesunięty do tyłu i to powodowało nerwowość w locie i histeryczne reakcje na ster wysokości. Udało się nim kiedykolwiek spokojnie szybować w poziomym locie ustalonym? Sprawdź gdzie wg planów powinien być CG i dodaj trochę ołowiu (kamień?) na przód.

Link do komentarza
Share on other sites

Czemu by się miało rozpaść? Jeszcze będzie fajna obudowa 🙂

I też chyba będzie się trochę łatwiej grało bo będą stabilniejsze klawisze. 🙂 spróbuję dać oktawę niżej po szkole

Poczułem dreszcz i puszczałem sobie do rana samograjke 🙂 ale nie grałem bo się klawisze telepią dzisiaj może obudowę zrobię to bendem groł 🙂 na pohybel wrednej sąsiadce z dołu 😃

A niecnoto ! 😃 sczaiłeś mojego tota? Toto rozp... Wysublimował na początku wakacji 🙂 latałem potem funbatem. Na nim nauczyłem się całkiem dobrze latać. Obglondnij filmiki z funbatem. Robie już korkociągi, beczki, a co najważniejsze poprawnie ląduję🙂 na 1/3 gazu piękne powolne majestatyczne loty. A na pełnym gazie fajne akrobacje. Bardzo mi się podoba ten samolocik, więc jeszcze jeden machnąłem 🙂

Ale to na wakacjach latałem na wsi, a teraz rok szkolny a ja w Krakowie mieszkam. Wiec nie mam za bardzo czasu ani nawet miejsca do latania. Ale mam jescze jednego funbata w stanie świeżym, nic jeszcze nie zamontowane, to może go wykończę w ferie i jeszcze polatam 🙂

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.