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



Teraz jest 3 sty 2026, o 08:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 28 mar 2017, o 15:33 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lis 2016
Posty: 14
Lokalizacja: Rzeszów
Pomógł: 0

Witajcie,
mam taki malutki (głupi) problem i nie wiem jak sobie z tym poradzić. Jako, że to co robię jest na prawdę banalne więc raczej nie będę wstawiał schematu ideowego bo mogę to łatwo opisać słowami.

Kwestia jest taka:

Chcę sterować buzzerem jest podłączony do pinu PD6 uP STANEM WYSOKIM. Za pomocą przycisku, który jest podłączony do pinu PD7. Przycisk zwierany jest do masy. Więc programowo sprawdzam STAN NISKI na porcie PD7 właśnie.
Problem jest taki, że mam ciągle cały czas stan wysoki na pinie buzzera (PD6) nie wiem dlaczego co objawia się ciągłym wyciem bez względu na to czy klawisz jest wciśnięty czy nie. Domyślam się, że coś przekombinowałem z konfiguracją i makrodefinicjami pinów.
Prosiłbym was o rzucenie okiem na kod poniżej.
P.S kod jest w miarę skomentowany więc nie będzie raczej problemu ze zrozumieniem idei.
A idea jest taka, że chcę aby buzzer wydawał dźwięk tylko podczas gdy klawisz jest wciśnięty
Chciałbym nadmienić, że posługuję się płytką ATB 1.04b i korzystam z BlueBooka
Więc opierając się o BlueBook napisałem taki kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pytanie: Czy w linii 25 kodu powinno być PIND czy PORTD ?
W BlueBook jest PORTX - ale to przecież jest rejestr wyjściowy, a ja przecież sprawdzam stan na pinie.
Więc domyślnie napisałem PINX czyli w moim przypadku PIND |= KEY_PIN;
Z ksiązki dowiedziałem się, że niepotrzebna jest linia DDRD &= ~KEY_PIN; bo bity w rejestrze DDRD po resecie są już ustawione na 0 logiczne.
Po kompilacji i załadowaniu wsadu buzzer ciągle mi wyje bez względu czy klawisz jest wciśnięty czy nie. Tak jakby od razu wykrywał mi stan niski po resecie. Nie wiem jak sobie z tym poradzić :/ próbowałem negować argumenty if'a itp.
Dzięki raz jeszcze za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2017, o 15:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

if(klawisz_wcisniety())
{
BUZZER_ON;
}else BUZZER_OFF;

i oczywiście definicja dla BUZZER_OFF

na razie zrobiłeś tak, że w main włączasz buzzer a w while(1) sprawdzasz czy wciśnięty jest klawisz. Z tym, że buzzer cały czas jestr włączony. Musisz go wyłączyć, jeżeli sprawdzisz, że nie jest wduszony klawisz.

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2017, o 15:58 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lis 2016
Posty: 14
Lokalizacja: Rzeszów
Pomógł: 0

Po zastosowanych zmianach kod 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.


Nadal to samo.
Objaw: Po wgraniu wsadu - buzzer wyje bez względu, który uSwitch mu podepnę i nacisnę.
Na pinie PD6 ciągle panuje stan wysoki VCC, na pinie PD7 również stan wysoki VCC, gdy wciskam klawisz stan niski GND - mierzone multimetrem.
Wydaje mi się, że coś pokopałem z tą całą inicjalizacją i makrami :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2017, o 16:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

PORTD &= ~KEY_PIN; //kierunek pinu PD7 - wejsciowy zmień na
DDRD
PIND |= KEY_PIN; //podciagniecie pinu PD7 do VCC zmień na PORTD

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

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2017, o 16:21 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lis 2016
Posty: 14
Lokalizacja: Rzeszów
Pomógł: 0

Hmm... dziwne zjawisko. Tylko oby nie wyszło na to, że uszkodziłem uP. Ale do rzeczy.

Po zmianie PORTD &= ~KEY_PIN; na DDRD &= ~KEY_PIN;
Nadal jest to samo. Nie wiem, może mam uszkodzony uP? Może spróbować "przeportować" kod, czyli zmienić mu port na przykład z D na A?

Po wgraniu wsadu od razu wyje. Po jakimś czasie wyć przestaje...:O
Wsad wgrany - teraz podpinam buzzer i cisza...włączam klawisz i niby zadziałało. Później nacisnąłem jeszcze raz i zaczęło wyć już cały czas od nowa. Nie rozumiem tego.

Płytkę mam wpiętą pod zasilanie USB idzie to wszystko przez przetworniczkę. Napięcie zasilania stabilne kurde blade....

------------------------ [ Dodano po: 2 minutach ]

Dzięki skalarro działa !!!!
Hmm.....czemu mi to nie działało wcześniej. Co robiłem źle? Możesz na szybko odpowiedzieć. Mimo wszystko przypatrzę się twojemu kodowi źródłowemu ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2017, o 16:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

aż wziąłem zestaw i zrobiłem takie coś. Działa jak ta lala. Wgraj to z mojego postu wyżej.

------------------------ [ Dodano po: 3 minutach ]

BePower napisał(a):
czemu mi to nie działało wcześniej

przeanalizuj co zrobiłeś.

Były dwa błędy:
PORTD &= ~KEY_PIN; tu ustawiasz kierunek portu więc używasz rejestru DDRD
PIND |= KEY_PIN; a tu masz podciągnąć pin do VCC, czyli wymusić jakiś stan na pinie więc ustawiasz rejestr WYJSCIOWY prawda?? Stąd trzeba użyć PORTD a nie PIND... Jasne już?

Zbędne również jest to:
PORTD |= SPEAKER_PIN; //wlaczenie buzzera
bo jedyne co tym robisz to mega krótkie piknięcie, którego i tak nie usłyszysz. program wejdzie w main, włączy buzzer ale natychmiast po tym wchodzisz w funkcję sprawdzania klawisza i wyłączasz buzzer. W tym wypadku piknięcie trwa nieco ponad 100ms - tyle co delay w funkcji klawiszy plus kilka taktów na obsługę funkcji


Autor postu otrzymał pochwałę

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2017, o 16:34 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lis 2016
Posty: 14
Lokalizacja: Rzeszów
Pomógł: 0

Dziękuję jeszcze raz za odpowiedź i za szybką i rzeczową pomoc :)
Przeanalizowałem sobie swoje błędy i obiecuję, że więcej ich już nie zrobię bo wstyd !
Operacje I/O to podstawa !



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2017, o 16:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

BePower napisał(a):
że więcej ich już nie zrobię bo wstyd

To nie wstyd, to nauka... Nie widziałeś moich błędów i pytań pierwszych

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



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

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