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



Teraz jest 20 kwi 2024, o 08:37


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 5 sie 2020, o 16:55 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

WItam wszystkich.
Jako, że to mój pierwszy post toteż się przedstawię.
Nazywam się Grzesiek i zaczynam "przygodę z programowaniem w C", dodam tylko, że wcześniej nie miałem w ogóle styczności z programowaniem.
Obecnie jestem na etapie studiowania blubooka...

Teraz do rzeczy:

Napisałem (na razie niechlujnie :) ) 3 proste programiki i uzyskałem zamierzony efekt.
Teraz chciałby te wszystkie 3 umieścić w 1 w którym za pomocą zworek będę włączał interesujący mnie "podprogram" czy jak to nazwać.
Do tego celu zostawiłem 3 piny portu B (PB0-PB2) i za ich pomocą chciałbym mieć możliwość wybrania 1 z trzech programów.
Pin PB będzie wówczas zwarty do masy (tylko 1, reszta podciągnięta do VCC programowo)
I tak PB0 zwarty do GND = rusza programik 1 (analogicznie z PB1 i PB2)
Jak się do tego zabrać?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2020, o 17:03 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Witaj na forum.

Możesz skorzystać z "if" lub "switch" w while, albo 3 x "while" również z odpowiednim warunkiem w nawiasach ( ) dla każdego pinu osobno.

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2020, o 17:11 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

A mógł bym prosić i fragment kodu ?
załóżmy dla jednego pinu... opcja 3x "while"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2020, o 17:20 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Warunek dla pinu while (! (PINB & 1<<PB0)) i dalej instrukcja

Zagladnij tu https://mirekk36.blogspot.com/2012/10/drgania-stykow-to-bajki-wiec-jak-to.html?m=1

Tylko to trochę na odwrót działa bo musi być 2 zworki na pine PB1 i PB2 wtedy masz 0 (zero) według twoich założeń.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2020, o 17:28 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Dzięki zabieram się za ćwiczenie :)

Moje założenie jest takie:
PB0 - zwarta do masy - rusza program 1, wówczas PB1 i PB2 są podciągnięte do VCC
PB1 - zwarta do masy - rusza program 2, wówczas PB0 i PB2 są podciągnięte do VCC
PB2 - zwarta do masy - rusza program 2, wówczas PB0 i PB1 są podciągnięte do VCC

Działa jak należy ale dopiero po fizycznym podciągnięciu do VCC...
Jak mam programowo to lusowo odpala programy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2020, o 16:57 
Offline
Użytkownik

Dołączył(a): 17 mar 2020
Posty: 70
Pomógł: 5

Strzelam, że błąd jest w linijce numer 42.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2020, o 22:05 
Offline
Moderator
Avatar użytkownika

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

landrynek napisał(a):
Strzelam, że błąd jest w linijce numer 42.

o żesz! ;) a ja obstawiałem linijkę nr 13,5 :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: 8 sie 2020, o 12:02 
Offline
Użytkownik

Dołączył(a): 17 mar 2020
Posty: 70
Pomógł: 5

faktycznie ta 13,5 jakaś podejrzana - ale to chyba pomylił nazwy zmiennych

niestety nie mogę potwierdzić działania, bo u mnie jakoś się nie kompiluje :/ chyba jakiegoś kodu brakuje :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2020, o 13:51 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Tiaaaa faktycznie się walnąłem i nie ustawiłem odpowiednio bitów portu (jako wejście) a jedynie wszystko podciągłęm do vcc.....


while (! (PINC & 1<<PC4) | (PINC & 1<<PC5) { instrukcja}....



Panowie 42 linijka kodu nie działa :)
A teraz na poważnie czy to prawidłowy zapis jeśli chciałbym aby sprawdzony został warunek dla wejścia PC4 i PC5 (czy oba wejścia mają stan niski)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2020, o 20:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

Gietek napisał(a):
czy to prawidłowy zapis jeśli chciałbym aby sprawdzony został warunek dla wejścia PC4 i PC5 (czy oba wejścia mają stan niski)

Sprawdź to pod kątem priorytetu operatorów: https://en.cppreference.com/w/c/languag ... precedence

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2020, o 08:33 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Kod poniżej,

Dla pierwszego i drugiego "while" działa jak zamierzyłem, natomiast nie uruchamia się trzeci "while" dla warunku z pinem PB1...
Rzucicie okiem fachowca?
Tylko nie piszcie że ochyda ten kod bo wiem o tym ale jak pisałem w 1 poście....

pinu PB1 używam do testów a docelowo chciałbym użyć pinów PC4 i PC5 i dla nich stworzyć warunek dla 3 efektu.


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: 9 sie 2020, o 10:27 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

No zobacz. Wywaliłem wszystko i zostawiłem same pętle
Popatrz co wyszło:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Popatrz gdzie jest pętla 3


Autor postu otrzymał pochwałę

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2020, o 10:40 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

Witaj Gietek

Wstaw kramelkę } w lini 108

i wywal z lini 344


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2020, o 13:12 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Dzięki po 100 kroć...
Już zgłupiałem i kombinowałem z przerzucaniem na inne piny mojej zworki.

To już wiemy gdzie był błąd a teraz jakbyście mogli mi wytłumaczyć jak napisać warunek dla pętli 3, taki który będzie sprawdzał PC4 i PC5 i jeśli oba zwarte do masy to wykona się pętla 3


chyba że to jest poprawne...

while (! (PINC & 1<<PC4) | (PINC & 1<<PC5) { instrukcja}....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2020, o 13:19 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Pierwsze wyrażenie jeśli będzie 0 a drugie jeśli będzie 1,tak masz to teraz zapisane, zanegować musisz całość



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2020, o 13:36 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Jeśli chodzi o wytłumaczenie jak ?
Chcesz zrobić takie wyrażenie
Jeśli "a" jest zerem i "b" jest zerem wtedy "prawda" czyli 1.

Czyli c = (!a) & (!b);

While (c){
}

Oczywiście można to napisać w jednej linijce
ale chciałeś wyjaśnienie jak

Tak samo jest jak kolega napisał wyżej
Jeśli skorzystasz z lub to

c = ! (a | b); // tylko dwa zera dadzą po zanegowaniu "prawda";

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2020, o 19:52 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Muszę jeszcze raz spojrzeć do książki bo nie łapie tego...
Zanegować całość czyli tak?

~((! (PINC & (1<<PC5))) | (! (PINC & (1<<PC4))))

to jest moje "a" (! (PINC & (1<<PC5)))
To jest moje "b" (! (PINC & (1<<PC4)))
~ negacja całości oba a i b umieściłem w okrągłym nawiasie



Dzięki za cierpliwość :) do mnie....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2020, o 20:09 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Popatrz masz wyrażenie
(PINC & (1<<PC5))
Na rejestr PINC nakładasz maskę w tym przypadku 00100000
czyli możesz uzyskać dwie wartości 1 lub zero.
Zakładamy że gdy przycisk naciśnięty podłącza pin do masy

Jeśli założysz że
a to wartość wyrażenia (PINC & (1<<PC5))
b to wartość wyrażenia (PINC & (1<<PC4))
wtedy

prawda = ! (a | b);
Tylko gdy dwa piny będą zwarte do zera pojawi się zero które zanegowane da 1

prawda = ! ((PINC & (1<<PC5)) | (PINC & (1<<PC4)))

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2020, o 06:48 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Tak to właśnie rozumię - dzięki Twojej podpowiedzi z postów wyżej, jednak po wklepaniu komplilator zgłasza błedy:

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




../main.c:108:21: error: expected '(' before '!' token
../main.c:108:21: warning: value computed is not used [-Wunused-value]
../main.c:109:15: error: expected ';' before '{' token
make: *** [main.o] Błąd 1

Natomiast jeśli umieszczę całe wyrażenie w nawiasie while (!((PINC & (1<<PC5)) | (PINC & (1<<PC4)))) to się kompiluje ale uruchamia się pętla która nie powinna i dopiero właściwa (za każdym resetem jeden raz przelatuje pętla dla innego warunku i dopiero ta dla której jest ten warunek)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2020, o 08:24 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Zababoliłem.
Coś za mało nawiasów dałem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Sprawdź i daj znać.
Kompilator nie mógł się doliczyć nawiasu :)


Autor postu otrzymał pochwałę

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2020, o 16:07 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Działa warunek ale z małym defektem, otóż puszcza jedną pętlę z innym efektem i dopiero właściwa. Po każdym resecie tak samo...

Nawias znalazłem jak już wyżej pisałem.

Jak wyeliminować babola ?

A właściwie to może tak zostać. Nawet mi się podoba :)


Dziękuję wszystkim aktywnym za POMOC .

Będzie jeszcze trochę pracy nad tym programem bo mam zamiar za pomocą jeszcze jednej zworki (lub potencjometru - co będzie dla mnie raczej awykonalne na tym etapie mojej przygody z AVR i C) wybiereć delaya np 20ms i 25ms o ile się da....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2020, o 16:34 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Nikt, nawet Ja nie dopisałem że, pętla while jeśli ma w nawiasie (0) to się kończy i nie "kręci" się jak to pętla w nieskończoność, dlatego zawsze jak używamy while w naszych "standardowych" zapisach to while(1) i jesli jest 1 to się kręci w nieskończoność, jeśli w warunku (coś) jest to musi to sprawdzić czy to (coś) jest 1 czy 0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2020, o 17:19 
Offline
Nowy

Dołączył(a): 06 lip 2020
Posty: 10
Pomógł: 0

Szofer napisał(a):
Pierwsze wyrażenie jeśli będzie 0 a drugie jeśli będzie 1,tak masz to teraz zapisane, zanegować musisz całość



Domyśliłem się po tym zapisie :)



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: 23 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO