Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 24 sty 2025, o 09:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 24 mar 2013, o 18:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Żeby używać typu logicznego bool (prawda/fałsz) w C dla AVR, trzeba dołączyć bibliotekę stdbool.h i na każdego boola traci się dwa bajty, zgodnie z niebieską książką, str. 73

Doszedłem do tego, jak można sobie szybko, prosto i bardzo łatwo zrobić własnego boola:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


potem używa się tego standardowo:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nie wiem, jak z zajętością pamięci (ile bajtów zajmuje taki bool), ale nie wiem jak to sprawdzić. Podejrzewam, że taki bool zajmuje 1 bajt, ale mogę się mylić. Niemniej jednak wydaje mi się to ciekawe rozwiązanie, dlatego postanowiłem się nim podzielić.

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2013, o 21:32 
Offline
Użytkownik

Dołączył(a): 18 paź 2012
Posty: 244
Pomógł: 2

Zaraz zaraz, jak mogę zadeklarować typ bool?

Bo szczerze powiedziawszy nie wiedziałem że w C istnieje.

<avr/stdbool.h> ani <util/stdbool.h> nie zawierają w sobie zmiennej bool.

EDIT: OK już mam, #include <stdbool.h> i _Bool zmienna;

Mam rozumieć że ma ona tylko 2 bajty, a ile "waży" w kodzie sama stdbool.h? Bo szczerze to ja zawsze do flag używałem uint8_t.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2013, o 11:32 
Offline
Nowy

Dołączył(a): 14 wrz 2012
Posty: 23
Pomógł: 1

Ledes napisał(a):
Nie wiem, jak z zajętością pamięci (ile bajtów zajmuje taki bool), ale nie wiem jak to sprawdzić. Podejrzewam, że taki bool zajmuje 1 bajt, ale mogę się mylić. Niemniej jednak wydaje mi się to ciekawe rozwiązanie, dlatego postanowiłem się nim podzielić.


Kod:
#include <stdio.h>

typedef enum{ FALSE = 0, TRUE = !FALSE } bool;

int main(void)
{
   printf("typ zmiennej bool zajmuje %d bajtow. \n", sizeof(bool));
   
   return 0;
}


Przerób na uC, wyrzuć na LCD i będziesz wiedział ile zajmuje :) powinien tyle ile ma typ integer.

EDIT:
Zrobiłem test i własny typ bool oraz typ wbudowany na AVR ma tyle samo, 1 bajt, natomiast na PC własna definicja (z przykładu powyżej) zajmuje 4bajty, a wbudowany zajmuje 1 bajt.



Ostatnio edytowano 17 lip 2013, o 14:11 przez Lukas, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2013, o 11:47 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27351
Lokalizacja: Szczecin
Pomógł: 1042

Ledes napisał(a):
i na każdego boola traci się dwa bajty, zgodnie z niebieską książką, str. 73


Niestety książka ma swoją erratę, tutaj:

http://atnel.pl/errata.html

a w niej jest napisane, że ta informacja to niestety obrzydliwy babolek , który nie wiem jak wpadł :(

Cytuj:
Strona 73 - tabela:
Jest:
bool logiczny logiczny 2
Powinno być:
bool logiczny logiczny 1


bo oczywiście tyb bool to 1 bajt

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lip 2013, o 22:47 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Jest taki problem z polem bitowym, że jak dojdą przerwania, które używają tych flag to należy specjalnie obchodzić się taką zmienną używając ATOMIC_BLOCK, bo w trakcie zmiany jednej z flag może wystąpić przerwanie które zmieni inną i będzie klops taki jak przy zmiennych większych niż 8 bit. Nie polecam używania pól bitowych dla flag zmienianych w przerwaniu właśnie z tego względu.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 17:23 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

Witam
Jest ktoś w stanie powiedzieć dlaczego nawet po skopiowaniu pomysłu użytkownika Leadesa na stworzenie zmiennej bool w C , Eclipse wyświetla błąd :
"
Multiple markers at this line
- expected identifier before numeric
constant
- useless storage class specifier in empty
declaration
- two or more data types in declaration
specifiers
- Syntax error
- Syntax error
"

Dodam może że jestem początkującym programistą Atmegi 8 i dołączyłem bibliotekę #include <stdbool.h> wiec jeśli przyczyna jest banalna proszę o wyrozumiałość :P
Będę wdzięczny za każdą pomoc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 17:34 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Albo korzystasz z stdbool.h albo tak jak Ledes definiujesz typedef enum {} bool. Tylko jeden z tych sposobów!

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 20:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27351
Lokalizacja: Szczecin
Pomógł: 1042

Kurdę nie miała baba kłopotów to sobie wymyśliła typ BOOL w C ... no i jest "impreza" czytaj - kołomyja .... temat ciągnie się jak mortadela ..... a tymczasem już dawno można było stosować zwykły typ uint8_t i posługiwać się ludzką wartością JEDEN albo ZERO .... co i tak w C jest bardziej naturalne .... W porównaniu do BOOL nie różni się zajętością RAM ...

więc można cudować, booooolować, tworzyć pola bitowe i cuda na kiju ... a i tak - IDĘ O ZAKŁAD ;) bo każdy tak ma ;) po jakimś czasie i tak będzie uint8_t czyli zero i jeden .... zamiast zabawy w kotka i myszkę z boooolem :lol:

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 12:32 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

A faktycznie zapomniałem o takiej zmiennej jak uint8_t - dziękuje bardzo Panie Mirku za pomoc , oraz koledze wyżej, gdyż nie wiedziałem że używanie biblioteki uniemożliwia stosowania tego sposobu :)
Jeszcze raz dziękuje :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 12:45 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Niemożliwe jest zdefiniowanie dwóch typów pod tą samą nazwą. Zmień sobie nazwę a będziesz miał tych typów ile dusza zapragnie ;-)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 14:44 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

Nie wiem czy ten temat jest odpowiedni do zadania tego pytania, ale nie znalazłem lepszego , a mianowicie :

Zastanawiam się już z pół dnia nawiązując do postu wyżej czy istnieje możliwość napisania programu dzięki któremu będzie można zmieniać stan wspomnianej wyżej zmiennej (tylko jednej zmiennej ) uint8_t ze stanu "0" na "1" za pomocą tylko jednego switcha ??
Czyli najprościej obrazując - wpisujemy początkowa wartość zmiennej Np: uint8_t LED = 1 (zgaszenie diody) , po czym wciskamy switch i następuje zmiana zmiennej na uint8_t LED = 0 (świecenie diody) ?? i na tej podstawie odpowiednio realizować algorytm programu za pomocą pętli i warunków tam zawartych ?


Pytam ponieważ takie programowanie jest dla mnie bardziej intuicyjne i do tej pory z takie programowaniem (oczywiście maksymalnie podstawowe) np w bascomie miałem okazje troszeczkę widzieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 15:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Nie wiem czy o to chodziło, ale:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie są to oczywiście równoważne formy, ale dla zmiany 0/1 będą działać doskonale. Oczywiście trigger'em (wyzwalaczem) jest warunek naciśnięcia klawisza...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 15:15 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

albo
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 15:31 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

Tak ogólnie o to, czyli zmianę stanu na przeciwny, tylko mnie chodziło bardziej o to w jaki sposób już rzeczywisty (sprzętowy) , czyli w jaki sposób podłączyć switch do zmiennej typu uint8_t LED i za pomocą tego switcha zmieniać stan z 1 na 0 . Myślę że wyrażeniem kluczem tutaj będzie - jak podłączyć zmienna uin8_t LED do switcha ?
Ponieważ w książce oraz wszędzie widzę takie rozwiązanie tworząc kolejno jakby dwa stany zmiennej "swiatło" (w poniższym książkowym przykładzie ) zaprezentowanym poniżej :


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


co powoduje odpowiednio "swiatlo_on" włączenie diody , natomiast " swiatło_off " wyłączenie diody. Natomiast mnie chodzi o to aby była tylko jedna zmienna " uint8_t LED " i jej stan "0" powodował zaświecenie diody, a stan "1" zgaszenie. Chyba że te moje "marzenia" są nie możliwe do zrealizowania w C ... ? Tak jak pisałem jestem niestety początkujący :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 15:59 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

xardes napisał(a):
Tak ogólnie o to, czyli zmianę stanu na przeciwny, tylko mnie chodziło bardziej o to w jaki sposób już rzeczywisty (sprzętowy) , czyli w jaki sposób podłączyć switch do zmiennej typu uint8_t LED i za pomocą tego switcha zmieniać stan z 1 na 0 . Myślę że wyrażeniem kluczem tutaj będzie - jak podłączyć zmienna uin8_t LED do switcha ?
Ponieważ w książce oraz wszędzie widzę takie rozwiązanie tworząc kolejno jakby dwa stany zmiennej "swiatło" (w poniższym książkowym przykładzie ) zaprezentowanym poniżej :


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


co powoduje odpowiednio "swiatlo_on" włączenie diody , natomiast " swiatło_off " wyłączenie diody. Natomiast mnie chodzi o to aby była tylko jedna zmienna " uint8_t LED " i jej stan "0" powodował zaświecenie diody, a stan "1" zgaszenie. Chyba że te moje "marzenia" są nie możliwe do zrealizowania w C ... ? Tak jak pisałem jestem niestety początkujący :/

To co pokazałeś to nie zmienne, a definicje preprocesora. To oznacza, że w każdym miejscu
w którym te definicje zostaną użyte zostaną rozwinięte do tego co znajduje się po spacji aż do końca linii
czyli np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zostanie zamienione na
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 16:14 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

Zdaję sobie sprawę z tego że to nie są to zmienne ale nie wiedziałem jak to ładnie nazwać - dzięki za wytłumaczenie przyjacielu MikroT :) ale nadal nie wiem czy jest to możliwe oraz ewentualnie w jaki sposób, podłączyć switacha do takiej zmiennej jak uint8_t LED ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 16:24 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

xardes napisał(a):
Zdaję sobie sprawę z tego że to nie są to zmienne ale nie wiedziałem jak to ładnie nazwać - dzięki za wytłumaczenie przyjacielu MikroT :) ale nadal nie wiem czy jest to możliwe oraz ewentualnie w jaki sposób, podłączyć switacha do takiej zmiennej jak uint8_t LED ?

No przecież koledzy xor i atmel kilka postów wyżej Ci to napisali ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2014, o 09:35 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

Jeszcze nie do końca wszystko mi to mówi , ale postaram się doczytać bo coś zaczynam kojarzyć :) W każdym razie dzięki za pomoc i mam nadzieje że nie nadużyłem waszej cierpliwości :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2014, o 11:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1967
Lokalizacja: Lipsko
Pomógł: 125

A ja jakiś czas temu stwierdziłem, że nie będę rozbijał bajtu na drobne. Robiłem testy zarówno w bascomie jaki i w C wnioski są takie, że dla wyłuskanych bitów zysk jest niewspółmierny do korzyści - kod się niebezpiecznie wydłuża prze co wolniej działa.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO