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



Teraz jest 29 mar 2024, o 12:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 13 lis 2023, o 18:09 
Offline
Nowy

Dołączył(a): 24 paź 2017
Posty: 16
Pomógł: 0

Cześć, szlifuje operacje na bitach i pojawiły się dwa pytania, ale najpierw wytłumaczę dla porządku działanie programu.
Program steruje diodami. Przycisk switch podłączony do PB7 zwieram do masy. W warunku sprawdzam czy naciśnięty przycisk czyli czy w PB7 pojawiło się zero i wtedy poprzez wystawienie 0 na trzech odpowiednich bitach portu A zapalają się diody (realizowana jest komenda PORTA = 0b00000111).

Problem 1:
Gdy wgrywam program do mikrokontrolera to za każdym razem następuje krótkie mignięcie diód (wykonanie komendy PORTA = 0b00000111) i dopiero wtedy diody gasną i program czeka aż nacisnę przycisk aby móc wykonać komendę PORTA = 0b00000111. Dlaczego tak się dzieje? Coś w moim kodzie jest nie tak?

Problem 2:
Długo rozważałem dlaczego if((PINB & (1 << PB7)) to nie to samo co if((PINB & PB7) skoro PB7=0b10000000, co jest wynikiem tego że zadeklarowałem PORTB |= (1 << PB7). Jak rozumieć inność tych zapisów, bo jeżeli zamienie na ((PINB & PB7) w warunku if (), to nie działa prawidłowo.

Z góry dziękuje za podpowiedzi.

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: 13 lis 2023, o 19:10 
Online
Moderator
Avatar użytkownika

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

Cytuj:
Problem 1:
Gdy wgrywam program do mikrokontrolera to za każdym razem następuje krótkie mignięcie diód (wykonanie komendy PORTA = 0b00000111) i dopiero wtedy diody gasną i program czeka aż nacisnę przycisk aby móc wykonać komendę PORTA = 0b00000111. Dlaczego tak się dzieje? Coś w moim kodzie jest nie tak?

Problem 2:
Długo rozważałem dlaczego if((PINB & (1 << PB7)) to nie to samo co if((PINB & PB7) skoro PB7=0b10000000, co jest wynikiem tego że zadeklarowałem PORTB |= (1 << PB7). Jak rozumieć inność tych zapisów, bo jeżeli zamienie na ((PINB & PB7) w warunku if (), to nie działa prawidłowo.

ludzie gadają, że najlepiej na świecie przesunięcia są wyjaśnione w Blurbooku ;)
https://atnel.pl/mikrokontrolery-avr-jezyk-c.html

zdecydowanie polecam bo po tej książce już czytelnicy nie mogą się odzwyczaić od taki zapisów - tak są przyjazne ;)

odnośnie twoich problemów:

1. To nie ma nic wspólnego z przesunięciami - tylko brak odpowiedniej inicjalizacji pinów jeśli nie chcesz żeby mignęły. Do tego zrób małego _delay_ms(10) przed pętlą główną żeby stany się ustaliły prawidłowe

2. taki zapis (1<<PB7) traktuj jak gotową liczbę 0b10000000 ;)

_________________
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: 13 lis 2023, o 19:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

wirusssunited napisał(a):
dlaczego if((PINB & (1 << PB7)) to nie to samo co if((PINB & PB7)
Ponieważ PB7 nie ma wartości 0b10000000, tylko 0b00000111, a Ty potrzebujesz mieć 1 na ósmym bicie PINB. Czyli nie PINB & 7, tylko PINB & 128.

Przepraszam, przesunąłem za mało. Oczywiście, PB7 to nie 7 tylko 8, czyli 0b00001000



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2023, o 19:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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

zmieniłem tylko port dla ledów, dlatego że diody mam na porcie C.
Działa to tak, że po wciśnięciu przycisku i trzymaniu go, świecą trzy diody i jest OK.
Jeśli chcesz, żeby przy nie wciśniętym przycisku świeciły wszystkie to zamiast tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

_________________
http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2023, o 10:40 
Offline
Nowy

Dołączył(a): 24 paź 2017
Posty: 16
Pomógł: 0

mirekk36 napisał(a):

1. To nie ma nic wspólnego z przesunięciami - tylko brak odpowiedniej inicjalizacji pinów jeśli nie chcesz żeby mignęły. Do tego zrób małego _delay_ms(10) przed pętlą główną żeby stany się ustaliły prawidłowe

2. taki zapis (1<<PB7) traktuj jak gotową liczbę 0b10000000 ;)


Rozważam bluebooka, tylko że nie ukrywam że dla mnie ta książka jest droga, dlatego postanowiłem że najpierw chcę zobaczyć czy entuzjazm nie opadnie ze mnie przez 2-3 tygodnie nauki a potem może go nabędę. Od razu pytanie, czy kody źródłowe też dostanę przy zakupie czy trzeba przepisywać?

A teraz wracając do tematu rozważań. Co to znaczy brak odpowiedniej inicjalizacji pinów? To co mi przychodzi to żeby przed pętlą while dodać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zauważam, że im dam większe opóźnienie tym ten impuls trwa krócej, dla 1000ms w ogóle go nie widać, przy czym przez te 1000ms nic nie można zrobić w programie. Czy w komercyjnych projektach też się robi takie opóźnienia, tylko że wtedy na przerwaniach/timerach?



Marhef napisał(a):
wirusssunited napisał(a):
dlaczego if((PINB & (1 << PB7)) to nie to samo co if((PINB & PB7)
Ponieważ PB7 nie ma wartości 0b10000000, tylko 0b00000111, a Ty potrzebujesz mieć 1 na ósmym bicie PINB. Czyli nie PINB & 7, tylko PINB & 128.

Przepraszam, przesunąłem za mało. Oczywiście, PB7 to nie 7 tylko 8, czyli 0b00001000



A tego to już w ogóle nie rozumiem. Skąd niby PB7=0b00000111?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2023, o 11:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Cytuj:
((PINB & (1 << PB7))

to nie to samo co:
Cytuj:
(PINB & PB7)

W pierwszym przypadku porównujesz stan bitu nr7 (1<<7), jedynka przesunięta o siedem miejsc w lewo a w drugim przypadku
nie porównujesz bitu nr7, tylko liczbę 7.
Cytuj:
A tego to już w ogóle nie rozumiem. Skąd niby PB7=0b00000111?

Ponieważ tak jak na obrazku masz pokazane liczysz wagę poszczególnych bitów. Tak wygląda zapis liczby 7 w zapisie binarnym a pod makrem PB7, kryje się właśnie liczba7.
Obrazek


Autor postu otrzymał pochwałę

_________________
http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2023, o 12:54 
Online
Moderator
Avatar użytkownika

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

wirusssunited napisał(a):
Od razu pytanie, czy kody źródłowe też dostanę przy zakupie czy trzeba przepisywać?

To akurat jest jedną z najmocniejszych cech naszego wydawnictwa, że do książek są porządnie opracowane kody, z podziałem na lekcje a nie jakieś fragmenty pisane na kolanie

_________________
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: 15 lis 2023, o 23:20 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Rozumiem, że książka może wydawać się droga, ale zakładając, że będziesz walczył z tematem przez 2 tygodnie po 1 h to książka z przesyłką kosztuje 192zl/14 to daje niecale 14zl/h :) a gwarantuję, że da Tobie olbrzymi zastrzyk wiedzy i będziesz spijal samą śmietankę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2023, o 23:35 
Offline
Użytkownik
Avatar użytkownika

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

Jeśli mogę wtrącić swoje 3 grosze nt. książki to powiem Ci, że mój entuzjazm opaddał 3 czy 4 razy za każdym razem kiedy z bascoma próbowałem na C przejść i kiedy już definitywnie chciałem skończyć z przesiadką zaryzykowałem z książką BB... Efekty możesz oglądać w większości moich projektów z mniej więcej 8-9 ostatnich lat.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2023, o 11:21 
Offline
Nowy

Dołączył(a): 24 paź 2017
Posty: 16
Pomógł: 0

Dwa pytania do was Sylwekk oraz micky. Czy pracujecie zawodowo z mikrokontrolerami?
Drugie pytanie w takim razie czy jesteście w stanie odpowiedzieć mi na moje pytanie?

wirusssunited napisał(a):
mirekk36 napisał(a):

A teraz wracając do tematu rozważań. Co to znaczy brak odpowiedniej inicjalizacji pinów? To co mi przychodzi to żeby przed pętlą while dodać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zauważam, że im dam większe opóźnienie tym ten impuls trwa krócej, dla 1000ms w ogóle go nie widać, przy czym przez te 1000ms nic nie można zrobić w programie. Czy w komercyjnych projektach też się robi takie opóźnienia, tylko że wtedy na przerwaniach/timerach?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2023, o 11:52 
Online
Moderator
Avatar użytkownika

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

wirusssunited napisał(a):
Zauważam, że im dam większe opóźnienie tym ten impuls trwa krócej, dla 1000ms w ogóle go nie widać, przy czym przez te 1000ms nic nie można zrobić w programie. Czy w komercyjnych projektach też się robi takie opóźnienia, tylko że wtedy na przerwaniach/timerach?

A widzisz teraz to już mieszasz na maxa - bo skąd ty wziąłeś takie opóźnienia _delay_ms() i to chyba jeszcze dajesz je w pętli głównej skoro piszesz że ci blokuje to działanie programu.

Mieszasz bo z kolei nie wiesz, że tu w grę wchodzą zjawiska elektroniczne - i nie umiesz tego powiązać z programem. Skoro w pierwszej wersji programu dajesz podciąganie pinu do VCC i za chwilę pierwszą operacją w pętli jest sprawdzenie stanu tego podciągniętego pinu to niestety nie zdajesz sobie sprawy, że od rozkazu podciągania do pierwszego sprawdzenia stanu pinu mija kilkanaście nanosekund, a wewn rezystor podciągający ma dużą rezystancję przez co ten stan wysoki ustali się na nim DUUUŻO później niż te kilkanaście nanosekud i dlatego może ci w pierwszym obiegu pętli zapalać się dioda tak jakby był przycisk włączony - a może nawet i przez dwa obiegi pętli .... Dlatego pisałem żebyś po włączeniu wewn podciągania w obszarze inicjalizacji programu (A NIE W PĘTLI GŁÓWNEJ) dał małe opóźnienie - ale to rzędu co najwyżej kilku kilkunastu mikrosekund a nie Qurdę 1000ms .... ja miałem na myśli _delay_us(10) co już wystarczy na to aby na pinie wejściowym zdążył się ustabilizować stan wysoki na potrzeby badania go jako przycisku

A książka panie kochany właśnie uczy pisać programy NIOEBLOKUJĄCE czyli bez ANI JEDNEGO użycia żadnego delaja.

_________________
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: 16 lis 2023, o 12:12 
Offline
Użytkownik
Avatar użytkownika

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

wirusssunited napisał(a):
Czy pracujecie zawodowo z mikrokontrolerami?

W moim przypadku mikrokontrolery to jeden z działów i wspomaganie innych "wynalazków" :) Nie skupiam się tylko na programowaniu jednak jeśli już się za coś biorę to staram się doprowadzić to do końca z maksymalnym wykorzystaniem wiedzy i zgodnie ze sztuką. Nie dopuszczam do czegoś takiego, że zrządzeniem losu, przypadku i odrobiny szczęścia program działa, ale tak naprawdę nie wiadomo dlaczego. Nie! Tu nie ma miejsca na przypadek czy założenia, że może jakaś sytuacja w programie nie wystąpi - każdy świadomie pozostawiony nawet najmniejszy błąd, który ma szansę kiedykolwiek się ujawnić musi być poprawiony, bo wcześniej czy później się to zemści.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2023, o 13:16 
Offline
Nowy

Dołączył(a): 24 paź 2017
Posty: 16
Pomógł: 0

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


mirekk36 napisał(a):
Dlatego pisałem żebyś po włączeniu wewn podciągania w obszarze inicjalizacji programu (A NIE W PĘTLI GŁÓWNEJ) dał małe opóźnienie - ale to rzędu co najwyżej kilku kilkunastu mikrosekund a nie Qurdę 1000ms .... ja miałem na myśli _delay_us(10) co już wystarczy na to aby na pinie wejściowym zdążył się ustabilizować stan wysoki na potrzeby badania go jako przycisku
.

Dwie rzeczy. Ja tu przychodzę po pomoc i wskazówki staram się wdrożyć. Zrobiłem z początku 10us ale nic nie dało więc poszedłem w ms i tam coś się zmieniło. Faktycznie, nie umiem jeszcze powiązać w 100procentach działania programu z elektroniką ale się tego uczę. Więc czy ja nie wiem gdzie jest obszar inicjalizacji? Być może tak, jeśli napisałem źle to proszę popraw. W tej formie dalej diody się na moment zapalają.
mirekk36 napisał(a):
A książka panie kochany właśnie uczy pisać programy NIOEBLOKUJĄCE czyli bez ANI JEDNEGO użycia żadnego delaja.

A druga sprawa dotycząca delay, o których już wiem że nie ma ich w książce. Sam je zaproponowałeś więc się nie bulwersuj że próbuje za ich pomocą rozwiązać ten problem :).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2023, o 13:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Najpierw dokonaj prawidłowej inicjalizacji portu, do którego podłączyłeś diody led.
Jeśli diody masz na porcie A i są anodami podłączone do VCC a katodami do portu, to inicjalizacja wygląda tek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jeśli diody masz na porcie A i są anodami podłączone do portu a katodami do GND, to inicjalizacja wygląda tek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Najpierw zacznij od tego a potem popraw pętlę główną.
Acha. Jeśli chcesz sterować tylko 3 diodami, to to się robi jeszcze inaczej, żeby nie ruszać pozostałych pinów.
I napisz z jakiego zestawu korzystasz, czy diody masz podłączone na stałe czy na kabelkach.

_________________
http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2023, o 20:52 
Online
Moderator
Avatar użytkownika

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

wirusssunited napisał(a):
Sam je zaproponowałeś więc się nie bulwersuj

Ja się bulwersuję? grzecznie staram się pomóc a ty mi tu takie teksty sadzisz?

_________________
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: 16 lis 2023, o 21:56 
Offline
Nowy

Dołączył(a): 24 paź 2017
Posty: 16
Pomógł: 0

mario2015 napisał(a):
Najpierw dokonaj prawidłowej inicjalizacji portu, do którego podłączyłeś diody led.
Jeśli diody masz na porcie A i są anodami podłączone do VCC a katodami do portu, to inicjalizacja wygląda tek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jeśli diody masz na porcie A i są anodami podłączone do portu a katodami do GND, to inicjalizacja wygląda tek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Najpierw zacznij od tego a potem popraw pętlę główną.
Acha. Jeśli chcesz sterować tylko 3 diodami, to to się robi jeszcze inaczej, żeby nie ruszać pozostałych pinów.
I napisz z jakiego zestawu korzystasz, czy diody masz podłączone na stałe czy na kabelkach.



Anodę ma przyłączoną do VCC a katodę do portu mikrokontrolera.
Co to znaczy popraw pętlę główną? mirekk36 mówił żeby dać delay przed pętlą główną i nie pomogło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2023, o 14:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Cytuj:
mirekk36 mówił żeby dać delay przed pętlą główną i nie pomogło.

Ponieważ źle inicjalizujesz piny.
A więc jeśli diody sterujesz katodami, to twoja inicjalizacja powinna wyglądać tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po tej inicjalizacji, nie potrzeba tego delay-a, choć czasami pomaga.
Po drugie zmień sterowanie ledami w if-ach w pętli głównej. Ty masz tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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

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

Kolejną rzeczą, którajest nadmiarowa to ( return 0), po prostu jest tam nie potrzebny. Kompilator poradzi sobie bez niego.
Na koniec powiem tak. Popraw kodu według tego co ci teraz napisałem i sprawdź jak to działa a jeśli chcesz sterować tylko 3 diodami,
to napisz i pokażę ci jak zrobić poprawną inicjalizację nie ruszając innych pinów.
Ta inicjalizacja, którą teraz ci podałem jest wystarczająca do takich testów jakie robisz ale...
no właśnie, jakbyś chciał na pozostałych pinach tego portu mieć coś innego, to trzeba do tego tematu podejść troszeczkę inaczej i użyć kilku makr.
Popraw i przetestuj to co masz i daj znać jak poszło.

_________________
http://www.avrboss.pl



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 10 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO