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



Teraz jest 21 sty 2025, o 19:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 2 paź 2014, o 22:18 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 01 sty 2014
Posty: 2
Lokalizacja: EPKK
Pomógł: 0

Dobry wieczór,
napotkałem na swojej drodze pewien problem, z którym chyba nie jestem w stanie sobie poradzić.

Zacznę od początku:
Chciałem stworzyć takie sobie fikuśne urządzenie, które po naciśnięciu danego przełącznika podłączonego do pinu mikrokontrolera, prześle poprzez FT232 na port COM, jakiś pożądany przeze mnie ciąg znaków. Okej, nawet to się udało. Po zmarnowaniu jakiegoś 1m^2 laminatu powstał w końcu prototyp. O dziwo, w przeciwieństwie do innych prototypów ten działał. Tzn. tak mi się wydawało. Ale do sedna.

Do PIN'u podpina przycisk. Przycisk zwiera do masy. Pin podciągam do Vcc. Chcę, aby po zmianie stanu na pinie, kontroler wysyłał dany ciąg znaków ale tylko raz przez okres wciśnięcia przełącznika. Użyłem do tego celu pomocniczej zmiennej zwanej w dalszej części "state_change1". Ma ona na celu ograniczenie transmisji do jednokrotnego przesyłu. Oto kod:

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


Okej, w czym tkwi sekret szczęścia ? Otóż, popełniony przeze mnie kod działa, ale tylko dla pinów o numerze 0. Tzn PA0, PB0 etc. Kiedy chce zmienić pin na inny (np. zaprezentowany PA1) to całość się sypie, następuje tylko transmisja pierwszej części gdy przycisk jest wciśnięty (zero na pinie) ale tylko raz. Dalsze wciskanie nie przynosi żadnego rezultatu.
Ponadto po usunięciu dodatkowego warunku tj. "(state_change1 == 1/0)" program zachowuje się tak jak tego oczekuję.

Może to jakaś drobna głupota, ale to samo dzieje się na dwóch różnych, niezależnych Atmegach16.

USART działa bez problemu.
Jakiekolwiek wskazówki mile widziane :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2014, o 22:26 
Offline
Użytkownik
Avatar użytkownika

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

Zapewne chodzi o błędny w tym wypadku operator iloczynu bitowego, zamiast logicznego.
W linii 17 i 22 zamień znak "&" na "&&". Głównie dla wyrażenia warunkowego w linii 22 jest to tak istotne, ponieważ obliczana wartość pierwszej części wyrażenia będzie równa 0 lub 2 (sic!)...

Można też użyć podwójnie operatora negacji logicznej dla pierwszej części tego wyrażenia "!!(PINA & (1<<PA1))", celem uzyskania pożądanej wartości logicznej. Sposobów jest całe mnóstwo, bo jest cała paleta operatorów logicznych, jak również operator warunkowy, jednak nie polecam takich metod ponieważ jest to tylko sposób na obejście problemu, a tak naprawdę zamazuje tylko sens całego wyrażenia.

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

Oczywiście pozostawiając jedynie fragment testujący pin "PA1", działanie będzie poprawne, ponieważ dowolna wartość różna od 0 (niezależnie 1, 2 czy cokolwiek innego) będzie interpretowana jako "TRUE".


Autor postu otrzymał pochwałę


Ostatnio edytowano 2 paź 2014, o 22:37 przez atmel, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2014, o 22:36 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 01 sty 2014
Posty: 2
Lokalizacja: EPKK
Pomógł: 0

No jasne, dlatego wszystko działało dla pinów zerowych.
Durnota, ale obawiam się, że jeszcze by mi zajęło kapkee czasu znalezienie błędu :(

Dzięki bardzo za pomoc



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Bing [Bot] i 2 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