Skocz do zawartości
Treker

Kurs programowania uC AVR w C (WinAVR, Kurs AVR-GCC)

Pomocna odpowiedź

Właśnie mam problem z ustawieniem odpowiednio rejestrów tak żeby wszystko działało. Ogólnie wiem jak PWM działa, ale nie wiem jak ustawić każdy z rejestrów, który rejestr ustawić i wogóle

Udostępnij ten post


Link to post
Share on other sites

Dokumentację techniczną procesora widziałeś? Tam jest wszystko opisane, łącznie z rejestrami, co do PWMu to masz tabelę z trybami pracy Timerów, znajdziesz tam potrzebne Ci ustawienia rejestrów. Pytanie brzmi w jakim stopniu opanowałeś już C?

Udostępnij ten post


Link to post
Share on other sites

Słuchajcie, czy zamiast zapisów typu i++ mogę stosować zapis zrozumiały dla mnie czyli i=i+1 i=i+5 itp? Cz w C mogę stosować zapisy podobne do języka Bascom? Mam tu na myśli na przykład warunki. Ja bym chciał warunek zapisywać jak w Bascom czyli:

If i = coś tam bądź if i > coś tam then coś tam

Co ze sformułowaniem typu then? Jak się pisze w C? Czy w ponizszym kawałku kodu:

if(wrong_card>4)
  { int_licz1=0;
   wrong_card=0;
   BUZZ=0;
   PRZ=0;

po wyrażeniu if(wrong_card>4) jest jakby wyrażenie then ? Czy dobrze rozumiem że jeśli spełniony jest warunek w linii if(wrong_card>4) to:

- zmienna int_licz przyjmuje wartość 0

- zmienna wrong_card też 0

- BUZZ również 0

- PRZ też 0 ?

Udostępnij ten post


Link to post
Share on other sites

W C nie ma czegoś takiego jak then. Poprostu pierwsza komenda lub blok komend ujętych w nawiasach {} jest wykonywany dla spełnionego warunku.

Pamietaj, że w C znak równości to ==. Pojedynczy znak = to znak przypisania. Jest to częsty błąd. Szczególnie uciążliwy z tego względu, że w C znak przypisania zwraca wartość jaka została przypisana do zmiennej. Dla przykładu:

int c = 0;
if (c==12) {
tutaj jest to co sie ma wykonać
}

Tutaj program nie wejdzie do bloku komend po ifie z tego względu że 0 nie równa sie 12

int c = 0;
if (c=12) {
tutaj jest to co sie ma wykonać
}

W tym wypadku natomiast już wejdzie ponieważ komedna przypisania zwróci wartość przypisywaną (tutaj 12) natomiast if traktuje jako false tylko i wyłącznie zero. Każda inna wartość jest traktowana jako logiczna jedynka. Wynika to z faktu, że w samy C nie ma zmiennych logicznych czy binarny

Możesz tworzyć zapisy typu i=i+1 nic nie stoi na przeszkodzie tylko ze i++ jest poprostu szybsze. Jeśli chcesz zmieniać o wartość inna niż jeden możesz używać zapisu a+=4 jest on równoznaczny z a=a+4

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Dla mnie to wszystko jest niezrozumieałem bo inne niż to czego nauczyłem się do tej pory. Dla mnie równe to znak = więc taki zapis

int c = 0; 
if (c==12)

traktuję jako sprawdzenie czy zmienna c przyjęła wartość 12 ?

Natomiast tego zapisu

int c = 0; 
if (c=12)

zupełnie nie czaję. Co to jest? Sprawdzenie warunku i od razy wpisanie do zmiennej c wartości 12 ?

Udostępnij ten post


Link to post
Share on other sites

W c jest osobny operator wpisania i sprawdzenia równości. Wpisanie odbywa się poprzez operator =, a sprawdzenie równości poprzez ==. Jeżeli w nawiasach gdzie powinien być warunek dasz operacje do wykonania, to po wykonaniu jej będzie sprawdzony warunek, czyli czy różne od 0 czy 0. ten drugi program można zapisać także jako:

int c = 0;
c = 12;
if (c)
{
jakieś tam instrukcje;
}

Taki program sprawdza wartość c i jak będzie 0 to nie robi instrukcji w pętlach, a jak coś innego to wykonuje te instrukcje.

Udostępnij ten post


Link to post
Share on other sites

traktuję jako sprawdzenie czy zmienna c przyjęła wartość 12 ?

Dobrze to traktujesz.

zupełnie nie czaję. Co to jest? Sprawdzenie warunku i od razy wpisanie do zmiennej c wartości 12 ?

Przypisanie wartości 12 do zmiennej c i ta wartość jest od razu umieszczana w warunku if'a

Zwracam na to uwagę ponieważ sam często się na tym łapałem ze zapominałem dać == i dawałem samo =. Program się kompiluje jakoś działa, ale działa źle. Ciężko potem taki błąd odszukać jeśli się nie jest na to wyczulonym. Niekiedy taki zapis jest pożądany, może się wydawać że to nie ma sensu ale popatrzmy na to z trochę innej strony:

while((g=getchar())!='p'){
putchar((g+12)%256);
}

Wyżej napisany kod pobiera znak z domyślnego wejścia i wypisuje znak przesunięty o 12 oczek w tabeli ascii. Program wyjdzie z pętli jeśli znak jaki wciśniemy to będzie p. Jest to program bardziej na komputer, aczkolwiek taki szablon na pewno znajdzie zastosowanie w programowaniu mikrokontrolerów.

Od razu napisze, że to wcale nie musi tak wyglądać. Jest to jednak zapis który skraca kod a nadal jest czytelny.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites
Przypisanie wartości 12 do zmiennej c i ta wartość jest od razu umieszczana w warunku if'a

Więc dla mnie to jest bez sensu ponieważ wtedy nie trzeba pisać warunku tylko od razu instrukcję do wykonania. To tak jakby chciał sprawdzać czy już woda na kawę zagotowana skoro już zalałem kawę.

Udostępnij ten post


Link to post
Share on other sites
Zwracam na to uwagę ponieważ sam często się na tym łapałem ze zapominałem dać == i dawałem samo =. Program się kompiluje jakoś działa, ale działa źle. Ciężko potem taki błąd odszukać jeśli się nie jest na to wyczulonym. Niekiedy taki zapis jest pożądany, może się wydawać że to nie ma sensu ale popatrzmy na to z trochę innej strony:

Nie mówie, że samo if(c=12) ma sens, tylko że przez niedopatrzenie czasem taki kwiatek sie znajdzie i przy pisaniu programu, a szczególnie przy debugowaniu, trzeba na to uważać. Tak jak napisałem wcześniej są też przypadki gdzie taki mechanizm jezyka C jest użyteczny.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Ale przecież to jest taka dodatkowa opcja, nic nie stoi na przeszkodzie, żebyś rozbijał kod na dodatkowe linie. Możesz używać nawiasu w ifie do samego zapisania warunku, a możesz też skrócić kod przypisując jednocześnie nowe wartości zmiennym. Np w tym kodzie gohandiego z getchar masz przypisanie zmiennej g nowej wartości a następnie porównanie jej z zadaną stałą. Gdybyś chciał to robić oddzielnie, musisz się zastanowić w którym miejscu nadawać zmiennej wartość bo jeśli dasz g = xxx przed pętlą to wykona się tylko raz, a jeżeli dasz na końcu pętli to nie wykona się za pierwszym razem. Po prostu jeżeli już się oswoisz z tym zapisem to jest on bardzo przydatny i na pewno będziesz go sobie chwalił.

Natomiast jeśli chodzi o samą przesiadkę z bascoma na C to rzeczywiście możesz mieć problemy. Ja co prawda patrzę na problem z przeciwnej strony - umiem pisać w C, nigdy nic nie robiłem w bascomie, tylko czytałem czasem cudzy kod i znam mniej więcej składnię. W każdym razie mi się wydaje, że bascom jest kompletnie nielogiczny więc wiem co teraz czujesz 😃 Dlatego najlepszą metodą będzie dla ciebie zapomnienie na chwilę o bascomie i nie szukanie jakiś analogii w składni bo się tylko niepotrzebnie pogubisz. I nie oceniaj na razie czy coś jest sensowne czy nie tylko spróbuj najpierw samemu napisać jakieś proste programy, może nawet lepiej jeżeli będą na konsolę a nie avry (do tego możesz wykorzystać np program Dev-C++). Wtedy się przekonasz że tak naprawdę wszystko jest logiczne tylko po prostu inne.

Inna sprawa, że nie powinieneś się zrażać, bo C wyrobi w tobie dobre nawyki, które są standardem w większości współczesnych języków programowania. Dzięki temu będziesz mógł potem łatwo w visualu napisać aplikację windowsową sterującą robotem przez port szeregowy czy w javie aplet do sterowania przez przeglądarkę albo aplikację na komórkę.

Udostępnij ten post


Link to post
Share on other sites

A na przykład tu:

if(!check_card() && bin!=0 && bin!=65535 && licz_kart<20)

Jaki jest sens podwójnego stosowania operatorów logicznych i po co w ogóle są te operatory? Do tej pory (w bascom) używałem funkcji porównywania sprawdzania czy zmienna jest większa czy mniejsza i takie tam a tu po co to wszystko?

Co do pisania w C na konsolę to już mam za sobą jakiś przelicznik prędkości do modelu zdalnie sterowanego w skali 1:10 i pisałem to właśnie w devC++, ale to było dawno i było to raczej proste.

Wyglądało to tak:

-> PLIK DO POBRANIA <-

Natomiast co do szukania analogii to ja ich nie szukam tylko próbuję sobie całość ułatwić znajdując jakieś podobieństwa. Chodzi o to by mi się to jakoś kojarzyło.

Udostępnij ten post


Link to post
Share on other sites

tutaj zapisujesz złożony warunek w jednym ifie:

if(111 && !(222) && 333)

Znak && to AND natomiast warunki są zamieniane na wartości 1 lub 0 i analizowane przez ifa. Jeśli jednocześnie jest spełniony 111 i negacja 222 i 333 to wykonaj ifa. Znowu bez tego byś musiał pisać trzy ify zagnieżdżone i kod staje się mniej czytelny, możesz się pogubić w zamykaniu nawiasów itp

Tak samo możesz używać ora || albo łączyć oba znaki. Wtedy są czytane od lewej do prawej.

A z tym pisaniem programów na konsoli to najlepiej właśnie zrób proste programiki które wywalają jakiś tekst na ekran i używają właśnie za każdym razem jeden z tych trudnych dla ciebie zapisów. Dzięki temu zobaczysz w praktyce jak działają i potem możesz próbować łączyć ze sobą po kilka w bardziej skomplikowane twory i patrzeć czy działają tak jak myślałeś.

Udostępnij ten post


Link to post
Share on other sites

Jeśli chodzi operatory sumy i iloczynu to trzeba je podzielić na 2 grupy

Logiczne i Bitowe

Logiczne są to operatory && oraz ||

Bitowe są to operatory & oraz |

Różnica jest znaczna. Przy operatorach logicznych bierzesz sumaryczną wartość danego rejestru natomiast przy operatorach bitowych porównywane są poszczególne bity rejestru

a = 3; //0b00000011

b = 4; //0b00000100

a&&b daje 1 //jest to wartosc prawdy

a&b daje 0 // jest to operacja iloczynu na każdej parze bitow

Jak widać jest znacząca różnica.

Zastanów się dla czego jeśli a=9 i b =13 to a&b daje 5.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites
Jeśli chodzi operatory sumy i iloczynu to trzeba je podzielić na 2 grupy

Logiczne i Bitowe

Logiczne są to operatory && oraz ||

Bitowe są to operatory & oraz |

Różnica jest znaczna. Przy operatorach logicznych bierzesz sumaryczną wartość danego rejestru natomiast przy operatorach bitowych porównywane są poszczególne bity rejestru

a = 3; //0b00000011

b = 4; //0b00000100

a&&b daje 1 //jest to wartosc prawdy

a&b daje 0 // jest to operacja iloczynu na każdej parze bitow

Jak widać jest znacząca różnica.

Zastanów się dla czego jeśli a=9 i b =13 to a&b daje 5.

Pozdrawiam

Myślałem że jestem dość inteligentny facet ale widzę że to (język C) chyba nie dla mnie. Kompletnie nic nie rozumiem z powyższego cytatu. Nic.

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